求助,树状数组做法
查看原帖
求助,树状数组做法
743447
RegisterIntOfficial楼主2023/4/6 18:22

rt,AC 22 WA 32

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int MAXN = 5e5 + 10;

int n; ll c[MAXN];

inline 
void add(int k, int x) {
	for (int i = k; i <= n; i += i & -i) c[i] += x;
}

inline 
int ask(int k) {
	ll res = 0;
	for (int i = k; i; i &= i - 1) res += c[i];
	return res;
}

inline 
int find() {
	int k = 0; ll sum = 0;
	for (int i = 18; ~i; i--) {
		if (k + (1 << i) > n || sum + c[k + (1 << i)] >= 0) continue;
		k += 1 << i, sum += c[k];
	}
	return min(n, k + 1);
}

int q, b, k, x, p, a[MAXN];

int main() {
	scanf("%d%d%d", &n, &b, &q);
	for (int i = 1; i <= n; i++) scanf("%d", &a[i]), add(i, a[i] - b);
	for (; q--;) {
		scanf("%d%d", &k, &x), add(k, x - a[k]), a[k] = x, p = find();
		printf("%.15Lf\n", (long double)ask(p) / p + b);
	}
}
2023/4/6 18:22
加载中...