题解 | #小苯的蓄水池#

小苯的蓄水池(hard)

https://ac.nowcoder.com/acm/contest/93847/E

首先因为隔板的存在,所以整个水池开始是一坨一坨的,一共有 坨。

操作 就是把所有与 有交集的坨坨拿来进行合并,合并结果为总水量除以总池子数。

考虑用 set 维护,这样查询就是严格 级别的,我们来分析修改操作。

由于每次合并坨数都会减少 ,所以最多合并 次,均摊下来总复杂度为 ,这样总复杂度就是 + 。足以通过此题。

the code:

#include <bits/stdc++.h>

#define L(i, a, b) for(int i = (a); i <= (b); i++)
#define R(i, a, b) for(int i = (a); i >= (b); i--)
#define ll long long

using namespace std;

const int N = 500000 + 10;

int n, q; double a[N];

struct Node {
	int l, r; double w;
	bool operator < (const Node &T) const {
		return l < T.l;
	}
};

set<Node> S;

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);  cout.tie(0);
	cin >> n >> q;
	L(i, 1, n) cin >> a[i], S.insert({i, i, a[i]});
	cout << fixed << setprecision(8);
	while(q--) {
		int op, l, r;
		cin >> op;
		if(op == 1) {
			cin >> l >> r;
			auto it = S.upper_bound({l, 0});
			--it;
			vector<set<Node>::iterator> vec;
			double sum = 0; int R = r, L = it->l;
			while(it != S.end() && it->l <= r) {
				vec.push_back(it);
				sum += it->w * (it->r - it->l + 1);
				R = max(R, it->r);
				it++;
			}
			for(auto x : vec) S.erase(x);
			S.insert({L, R, sum / (R - L + 1)});
		}
		else {
			cin >> l;
			auto it = S.upper_bound({l, 0});
			it--;
			cout << it->w << '\n';
		}
	}
	return 0;
}




全部评论

相关推荐

现在是2026.2.27,距离我2025.8.16在boss上投出第一份简历以来已经过去了半年多时间了。可能许多牛友对我并不陌生,在去年的89月份,深陷实习焦虑的我不停的在牛客上发帖求助,改过的简历不知道发了多少次。因为双非本的缘故,在实习这条路上可谓是处处碰壁。boss上四位数的沟通只换来两位数的回复,好不容易约到的面试很多还因为各种原因被挂。最终在9月底遇到了我实习过程中的第一个贵人:美团实习的ld。尽管那是个测开岗,但是没有关注我实际的技术栈,而是用专业的提问让我感受到了前所未有的面试体验,发掘了自己的技术闪光点。最终让我决定放弃了另一家中小厂的后端。他们非常尊重我对开发学习的热情,也给足了我自由发挥的空间,如果不是他们让我深度参与的用例生成项目,我或许连接到后面面试的机会都没有。尽管岗位不是开发,但这个过程中对大厂工作流程的深度参与以及对业务,项目,和技术的思维提升对我后续的开发面试一样提供了巨大的帮助。时代的洪流让我们每个人都被迫卷入其中,错过了互联网的红利时期,无论实习还是秋招都令不同背景的同学倍感压力,尽管如此我们依旧要相信:努力定有回报最后祝各位27的兄弟姐妹们,在暑期实习的面试路上一路披荆斩棘,策马扬鞭,用梦中情司的offer回应自己一直以来不愿放弃的拼搏timeline:2.6一面2.11&nbsp;二面2.12&nbsp;三面&nbsp;当天转hr面2.26&nbsp;hr面,面完云证+录用评估2.27&nbsp;offer
点赞 评论 收藏
分享
LastWh1spe...:ssob真有些人和那个没睡醒一样
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务