求助 WA15
查看原帖
求助 WA15
560006
yzq_yzq楼主2024/2/29 22:58

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

#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;
namespace ae86{
	const int bufl=1<<15;
	char buf[bufl],*s=buf,*t=buf;
	inline int fetch(){
		if(s==t){t=(s=buf)+fread(buf,1,bufl,stdin);if(s==t)return EOF;}
		return*s++;
	//	return getchar();
	}
	inline int read(){
		int a=0,b=1,c=fetch();
		while(!isdigit(c))b^=c=='-',c=fetch();
		while(isdigit(c))a=a*10+c-48,c=fetch();
		return b?a:-a;
	}
}
using ae86::read;
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; }
struct tree {
	int l, r;
	mutable int v;
};
bool operator <(const tree &x, const tree &y){ return x.l<y.l; }
set<tree> tr;
It split(int pos){
	It it = tr.lower_bound({pos, -1, 0});
	if(it != tr.end() && it->l == pos) return it;
	--it;
	int l = it->l, r = it->r, v = it->v;
	tr.erase(it);
	tr.insert({l, pos - 1, v});
	return tr.insert({pos, r, v}).first;
}
void emerge(int l,int r,int x){
	It itr = split(r + 1), itl = split(l);
	tr.erase(itl, itr);
	tr.insert({l, r, x});
}
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();
//	tree yzq;
//	yzq.l = 1, yzq.r = n, yzq.v = 0;
//	tr.insert(yzq);
	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);
//	rep(i, 1, k) {
//		emerge(l[i].l2, l[i].r2, i);
//	}
//	rep(i, 1, n) {
//		It x = split(i);
//		cout << x->v << endl;
//	}
//	rep(i, 1, n) cout << "fa : " << i << " = " << getfa(i) << endl;
	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);
				//	cout << "Query : " << fa << endl;
				assert(fa);
				assert(l <= r && l && r);
				++idx;
				puts(Q ? "Yes" : "No");
			}
		}
	}
	return 0;
}
2024/2/29 22:58
加载中...