萌新刚学OI,求助主席树
查看原帖
萌新刚学OI,求助主席树
503792
Svemit楼主2023/11/17 08:59

rt,wa了11个点

#include <bits/stdc++.h>
#define rep(i, j, k) for(int i = (j); i <= (k); i ++)
#define per(i, j, k) for(int i = (j); i >= (k); i --)
#define all(x) x.begin(), x.end()
#define SZ(x) (int)x.size()
#define fi first
#define se second
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int, int> PII;
const int N = 2e5 + 5, base = 1e5, INF = 0x3f3f3f3f;
const LL mod = 1e9 + 7;
int n, q;
vector<int> p[N];
struct SegT {
	int l, r, val;
	#define l(x) tr[x].l
	#define r(x) tr[x].r
	#define val(x) tr[x].val
} tr[N * 50];
int rt[N], idx;
void update(int &x, int lst, int l, int r, int v) {
	x = ++ idx;
	tr[x] = tr[lst];
	val(x) ++;
	if(l == r) return;
	int mid = l + r >> 1;
	if(v <= mid) update(l(x), l(lst), l, mid, v);
	else update(r(x), r(lst), mid + 1, r, v);
}
int query(int x, int y, int l, int r, int ql, int qr) {
	if(ql <= l && r <= qr) return val(x) - val(y);
	int mid = l + r >> 1, res = 0;
	if(ql <= mid) res = query(l(x), l(y), l, mid, ql, qr);
	if(qr > mid) res += query(r(x), r(y), mid + 1, r, ql, qr);
	return res;
}
int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr); cout.tie(nullptr);
	cin >> n;
	rep(i, 1, n) {
		int x, y;
		cin >> x >> y;
		p[x + y].push_back(x - y);
	}
	rep(i, 0, 2e5) {
		if(i != 0) rt[i] = rt[i - 1];
		for(auto po : p[i]) update(rt[i], rt[i], -base, base, po);
	}
	cin >> q;
	while(q --) {
		int a, b, k;
		cin >> a >> b >> k;
		int x = a + b, y = a - b;
		int l = 0, r = base * 4, res = 0;
		while(l <= r) {
			int mid = l + r >> 1;
			int L = max(-base, y - mid), R = min(base, y + mid);
			if(query(rt[min(base + base, x + mid)], rt[max(0, x - mid - 1)], -base, base, L, R) >= k) 
				res = mid, r = mid - 1;
			else l = mid + 1;
		}
		cout << res << '\n';
	}
	return 0;
}
2023/11/17 08:59
加载中...