RE 16 实在不知道怎么改了
查看原帖
RE 16 实在不知道怎么改了
558911
empty_楼主2022/10/15 22:11
# include<iostream>
# include<bits/stdc++.h>
using namespace std;
# define int long long
# define endl "\n"
#define ls(u) tr[u].l
#define rs(u) tr[u].r
#define sum(u) tr[u].sum
#define cnt(u) tr[u].cnt
const int N = 2e5 + 10;
const int M = 1e6 + 10, inf = 1e10;
int n, tot;
int a[N];
struct node {
	int sum = 0;
	int cnt = 0;
	int l = 0, r = 0;
} tr[N * 30];
struct q {
	int sum, cnt;
};
void pushup(int u) {
	sum(u) = sum(ls(u)) + sum(rs(u));
	cnt(u) = cnt(ls(u)) + cnt(rs(u));
}
void pushdown(int u) {
	if (!ls(u)) ls(u) = ++tot;
	if (!rs(u)) rs(u) = ++tot;
}

q que(int u, int l, int r, int L, int R) {
	if (L <= l && r <= R) {
		return {sum(u), cnt(u)};
	}
	if (l > R || r < L) return {0, 0};
	pushdown(u);
	int mid = (l + r - 1) / 2;
	q a = que(ls(u), l, mid, L, R);
	q b = que(rs(u), mid + 1, r, L, R);
	return {a.sum + b.sum, a.cnt + b.cnt};
}

void modify(int u, int l, int r, int pos, int k) {
	if (l == r) {
		cnt(u) += k;
		sum(u) = pos* cnt(u);
		return;
	}
	int mid = (l + r - 1) / 2;
	pushdown(u);
	if (pos <= mid) modify(ls(u), l, mid, pos, k);
	else modify(rs(u), mid + 1, r, pos, k);
	pushup(u);
}

bool check(double mid, double res) {
	q ans = que(0,0,inf,0,mid);
	double re = 1.0*ans.cnt*mid-ans.sum;
	return re>=res;
}

void solve() {
	int n, m;
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		modify(0, 0, inf, a[i], 1);
	}
	while (m--) {
		int op;
		cin >> op;
		if (op == 1) {
			int p, x;
			cin >> p >> x;
			modify(0, 0, inf, a[p], -1);
			a[p] = x;
			modify(0, 0, inf, a[p], 1);
		} else {
			int v;
			cin >> v;
			double l = 0, r = 1e15;
			double ans;
			while (r - l > 1e-5) {
				double mid = (l + r) / 2;
				if (check(mid, v)) {
					r = mid;
					ans = mid;
				} else l = mid;
			}
			printf("%.5lf\n", ans);
		}
	}

}
int tt;
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	tt = 1;


//	cin >> tt;
	while (tt--)solve();


	return 0;
}

有无佬帮忙看看这怎么改,头想秃了

2022/10/15 22:11
加载中...