整体二分 WA 求助
查看原帖
整体二分 WA 求助
118196
zimujun楼主2021/3/7 17:27

RT

一开始的时候甚至会输出原本加入的数中不存在的信息

后来改成在排好序的数组中二分下标,上面的问题解决了,但是还是 WA 18,求助

#include <bits/stdc++.h>

#define LL long long

using namespace std;

template <typename Temp> void read(Temp & res) {
	Temp fh = 1; res = 0; char ch = getchar();
	for(; !isdigit(ch); ch = getchar()) if(ch == '-') fh = -1;
	for(; isdigit(ch); ch = getchar()) res = (res << 3) + (res << 1) + (ch ^ '0');
	res = res * fh; 
}

using namespace std;

const int Maxn = 5e4 + 5;
 
int n, m, cnt;
 
struct Segment_Tree {
	#define ls t << 1
	#define rs t << 1 | 1 
	struct Unit {
		LL data, tag;
		Unit() {data = tag = 0;}
	} a[Maxn << 2];
	void pushup(int t) {a[t].data = a[ls].data + a[rs].data;}
	void pushdown(int l, int r, int t) {
		int mid = (l + r) >> 1; LL tg = a[t].tag; a[t].tag = 0;
		a[ls].data += tg * (mid - l + 1); a[ls].tag += tg;
		a[rs].data += tg * (r - mid); a[rs].tag += tg;
	}
	void modify(int lf, int rt, LL x, int l, int r, int t) {
		if(lf <= l && r <= rt)  {
			a[t].data += (r - l + 1) * x;
			a[t].tag += x; return;
		}
		int mid = (l + r) >> 1; pushdown(l, r, t);
		if(lf <= mid) modify(lf, rt, x, l, mid, ls); 
		if(mid < rt) modify(lf, rt, x, mid + 1, r, rs);
		pushup(t);
	}
	LL query(int lf, int rt, int l, int r, int t) {
		if(lf <= l && r <= rt) return a[t].data;
		int mid = (l + r) >> 1; LL res = 0; pushdown(l, r, t);
		if(lf <= mid) res += query(lf, rt, l, mid, ls);
		if(mid < rt) res += query(lf, rt, mid + 1, r, rs);
		return res;
	}
	#undef ls
	#undef rs
} s;

int ql[Maxn], qr[Maxn], typ[Maxn], qid[Maxn];
LL qk[Maxn], p[Maxn];
int tml[Maxn], tmr[Maxn], ans[Maxn];

void solve(LL l, LL r, int lf, int rt) {
	if(l == r) {
		for(int i = lf; i <= rt; ++i) if(typ[qid[i]] == 2) ans[qid[i]] = p[l];
		return;
	}
	LL mid = (l + r) >> 1;
	int tl = 0, tr = 0; bool wl = 0, wr = 0;
	for(int i = lf; i <= rt; ++i) {
		if(typ[qid[i]] == 2) {
			LL res = s.query(ql[qid[i]], qr[qid[i]], 1, n, 1);
			if(res >= qk[qid[i]]) tmr[++tr] = qid[i], wr = 1;
			else tml[++tl] = qid[i], wl = 1;
		} else {
			if(qk[qid[i]] > p[mid]) {
				s.modify(ql[qid[i]], qr[qid[i]], 1, 1, n, 1);
				tmr[++tr] = qid[i];
			} else tml[++tl] = qid[i];
		}
	}
	for(int i = lf; i <= rt; ++i)
		if(typ[qid[i]] == 1)
			if(qk[qid[i]] > p[mid])
				s.modify(ql[qid[i]], qr[qid[i]], -1, 1, n, 1);
	for(int i = 1; i <= tl; ++i) qid[lf + i - 1] = tml[i];
	for(int i = 1; i <= tr; ++i) qid[lf + tl + i - 1] = tmr[i];
	if(wl) solve(l, mid, lf, lf + tl - 1);
	if(wr) solve(mid + 1, r, lf + tl, lf + tl + tr - 1);
}

int main() {
	read(n); read(m);
	for(int i = 1; i <= m; ++i) {
		read(typ[i]); read(ql[i]); read(qr[i]); read(qk[i]); qid[i] = i;
		if(typ[i] == 1) p[++cnt] = qk[i];
	}
	sort(p + 1, p + cnt + 1);
	solve(1, cnt, 1, m);
	for(int i = 1; i <= m; ++i) {
		if(typ[i] == 2) {
			printf("%d\n", ans[i]);
		}
	}
	return 0;
}
2021/3/7 17:27
加载中...