WA on 15 求助
查看原帖
WA on 15 求助
560006
yzq_yzq楼主2024/2/29 23:03

很久之前的考场代码,现在都没过,写的动态开点,马蜂优良求助。

#include <bits/stdc++.h>
#define rep(i, x, y) for (int i = x; i <= y; ++i)
#define drep(i, x, y) for (int i = x; i >= y; --i)
#define ll long long
#define pb push_back
#define It set<tree>::iterator
#define endl '\n'
#define IOS ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
#define int ll
using namespace std;
const int N = 700050, V = 500000;
inline int read() {
	int x;
	cin >> x;
	return x;
}
struct node {
	int l1, r1, l2, r2;
} l[N];
inline bool cmp(node x, node y) { return x.l2 < y.l2; }
unordered_map<int, int> rt;
int tot, s[N * 20][2], tag[N * 20], mi[N * 20];
inline void Up(int & p) { if(!p) p = ++tot; }
int n, m, k, q;
inline void Add(int &p, int l, int r, int x) {
	if(!p) p = ++tot;
	mi[p] += x;
	tag[p] += x;
}
inline void down(int p, int l, int r) {
	if(l == r || tag[p] == 0) return;
	int mid = l + r >> 1;
	Add(s[p][0], l, mid, tag[p]);
	Add(s[p][1], mid + 1, r, tag[p]);
	tag[p] = 0;
}
void upd(int ql, int qr, int x, int p, int l = 1, int r = m) {
	down(p, l, r);
	if(ql <= l && r <= qr) {
		tag[p] += x;
		mi[p] += x;
		return;
	}
	if(qr < l || r < ql) return;
	int mid = l + r >> 1;
	Up(s[p][0]), Up(s[p][1]);
	//	cout << "min : " << "p : " << p << " " << l << ' ' << r << " = " << mi[p] << endl;
	upd(ql, qr, x, s[p][0], l, mid), upd(ql, qr, x, s[p][1], mid + 1, r);
	mi[p] = min(mi[s[p][0]], mi[s[p][1]]);
}
bool qry(int ql, int qr, int p, int l = 1, int r = m) {
	down(p, l, r);
	if(!p) return 1;
	if(ql <= l && r <= qr) {
		//	cout << "qry min : " << l << " " << r << " " << mi[p] << endl;
		if(mi[p] == 0) return 0;
		return 1;
	}
	if(qr < l || r < ql) return 1;
	int mid = l + r >> 1;
	Up(s[p][0]), Up(s[p][1]);
	return qry(ql, qr, s[p][0], l, mid) & qry(ql, qr, s[p][1], mid + 1, r);
}
void update(int p, int l, int r, int x) {
	if(!rt.count(p)) rt[p] = ++tot;
	upd(l, r, x, rt[p]);
}
inline int Qry(int p, int l, int r) {
	//	cout << "S : root : \n";
	//	for(auto u : rt) cout << u.first << ' ' << u.second << endl;
	int R = rt[p];
	//	cout << "R : " << R << endl;
	if(!R) return 0;
	//	cout << "Queryed\n";
	//	cout << "-----------\n";
	return qry(l, r, R);
}
unordered_map<int, int> f, F;
int jump(int x, int i) {
	if(!i) return x;
	if(l[i].l2 <= x && l[i].r2 >= x) {
		if(l[i].l2 - l[i].l1 >= l[i].r2 - l[i].l2 + 1) x = l[i].l1 + (x - l[i].l2);
		else x -= (x - l[i].l2) / (l[i].l2 - l[i].l1) * (l[i].l2 - l[i].l1);
		if(x >= l[i].l2) x -= (l[i].l2 - l[i].l1);
	} else if(l[i].l2 < x) return x;
	return jump(x, i - 1);
}
inline int getfa(int x) {
	return jump(x, k);
}
int P[N], L[N], R[N];
signed main() {
	n = read(), m = read(), k = read(), q = read();
	rep(i, 1, k) l[i].l1 = read(), l[i].r1 = read(), l[i].l2 = read(), l[i].r2 = read();
	sort(l + 1, l + 1 + k, cmp);
	int idx = 0;
	rep(i, 1, q) {
		int op;
		op = read();
		if(op == 1) {
			int p, l, r;
			p = read(), l = read(), r = read();
			int fa = getfa(p);
			//	cout << "Update : " << fa << endl;
			update(fa, l, r, 1);
			P[i] = fa, L[i] = l, R[i] = r;
		} else {
			if(op == 2) {
				int p;
				p = read();
				assert(P[p]);
				update(P[p], L[p], R[p], -1);
			} else {
				int p, l, r;
				p = read(), l = read(), r = read();
				int fa = getfa(p), Q = Qry(fa, l, r);
				++idx;
				puts(Q ? "Yes" : "No");
			}
		}
	}
	return 0;
}
2024/2/29 23:03
加载中...