ABC330(今晚)E求调
  • 板块学术版
  • 楼主FLY_lai
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/11/25 22:54
  • 上次更新2023/11/26 09:43:03
查看原帖
ABC330(今晚)E求调
488052
FLY_lai楼主2023/11/25 22:54

赛时忘记用 set 了,用的权值线段树。其他都对,但是 hack 数据0102 WA 了

#include <bits/stdc++.h>

using namespace std;

int n, q;
int a[200005];

struct SegmentTree {
	int sz;
	vector<int> val;
	int ide = 0;
	
	void pushup(int x) {
		val[x] = min(val[x * 2], val[x * 2 + 1]);
	}
	SegmentTree(){}
	SegmentTree(int n) {
		for (sz = 1; sz < n; sz *= 2);
		val.assign(2 * sz, ide);
	}
	void mdf(int x, int lx, int rx, int p, int v) {
		if (lx + 1 == rx) {
			val[x] += v;
//			printf("!%d:%d\n", p, val[x]);
			return ;
		}
		int m = (lx + rx) / 2;
		if (p < m)
			mdf(x * 2, lx, m, p, v);
		else
			mdf(x * 2 + 1, m, rx, p, v);
		pushup(x);
	}
	int qry(int x, int lx, int rx) {
//		printf("%d:[%d,%d)\n", lx, rx);
		if (lx + 1 == rx)
			return lx;
		int m = (lx + rx) / 2;
		if (val[x * 2] == 0)
			return qry(x * 2, lx, m);
		return qry(x * 2 + 1, m, rx);
	}
	int qry2(int x, int lx, int rx, int p) {
//		printf("%d:[%d,%d) %d\n", x, lx, rx, p); 
		if (lx + 1 == rx)
			return val[x];
		int m = (lx + rx) / 2;
		if (p < m)
			return qry2(x * 2, lx, m, p);
		return qry2(x * 2 + 1, m, rx, p);
	}
} st;

int ans;

int main() {
//	freopen("1.in", "r", stdin);
//	freopen("1.out", "w", stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> q;
	st = SegmentTree(n + 100);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		a[i]++;
		st.mdf(1, 1, st.sz + 1, a[i], 1);
	}
	
	for (int i = 1; i <= q; i++) {
		int p, v;
		cin >> p >> v;
		v++;
		st.mdf(1, 1, st.sz + 1, a[p], -1);
		if (v <= n + 10)
			st.mdf(1, 1, st.sz + 1, v, 1);
//		cout << st.qry2(1, 1, st.sz + 1, a[p]) << endl;
		a[p] = v;
		
		cout << st.qry(1, 1, st.sz + 1) - 1 << endl;
	}
	return 0;
} 
2023/11/25 22:54
加载中...