WA on #1 #14 求条或HACK
查看原帖
WA on #1 #14 求条或HACK
934048
ni_ju_ge楼主2025/8/3 15:03
#include<bits/stdc++.h>
using namespace std;
const double line=0.74751;
const int N=1e6+5;
//替罪羊平衡树
struct Node {
	int l,r,dat,size,same;
} tree[9*N];
int node[N];
int cnt,longth;
int n,q;
char opt;
int x,y;
int root[N];
void make(int &pos,int val) {
	tree[++cnt].dat=val;
	tree[cnt].size=1;
	tree[cnt].same=1;
	pos=cnt;
}
void up(int pos) {
	tree[pos].size=tree[tree[pos].l].size+tree[tree[pos].r].size+tree[pos].same;
}
bool bug(int pos) {
	return max(tree[tree[pos].l].size,tree[tree[pos].r].size)>tree[pos].size*line;
}
void under(int pos) {
	if(pos==0)return;
	under(tree[pos].l);
	if(tree[pos].same!=0)node[++longth]=pos;
	under(tree[pos].r);
}
int build(int l,int r) {
	if(l>=r)return 0;
	int mid=(l+r)/2;
	tree[node[mid]].l=build(l,mid);
	tree[node[mid]].r=build(mid+1,r);
	up(node[mid]);
	return node[mid];
}
void debug(int &pos) {
	if(bug(pos)) {
		longth=0;
		under(pos);
		pos=build(1,longth+1);
	}
}
void take(int val,int &pos) {
	if(pos==0)make(pos,val);
	else if(val<tree[pos].dat)take(val,tree[pos].l);
	else if(val>tree[pos].dat)take(val,tree[pos].r);
	else tree[pos].size++,tree[pos].same++;
	up(pos);
	debug(pos);
}
void del(int val,int &pos) {
	if(pos==0) {
		return;
	} else if(val<tree[pos].dat)del(val,tree[pos].l);
	else if(val>tree[pos].dat)del(val,tree[pos].r);
	else {
		tree[pos].size--;
		tree[pos].same--;
		return;
	}
	up(pos);
	debug(pos);
}
int wrank(int val,int loc) {
	int pos=root[loc],rnk=1;
	while(pos) {
		if(tree[pos].dat==val) {
			rnk+=tree[tree[pos].l].size;
			break;
		}
		if(val<=tree[pos].dat)
			pos=tree[pos].l;
		else {
			rnk+=tree[tree[pos].l].size+tree[pos].same;
			pos=tree[pos].r;
		}
	}
	return rnk;
}
int num(int val,int loc) {
	int pos=root[loc];
	while(pos) {
		int l=tree[tree[pos].l].size;
		if(l<val&&val<=l+tree[pos].same) {
			break;
		} else if(l>=val)pos=tree[pos].l;
		else {
			val-=l+tree[pos].same;
			pos=tree[pos].r;
		}
	}
	return tree[pos].dat;
}
int pre(int val,int loc) {
	return num(wrank(val,loc)-1,loc);
}
int last(int val,int loc) {
	return num(wrank(val+1,loc),loc);
}
//筛质数
int pr[N],tot;
bool vis[N],ope[N];
int ys[N][10];
void init() {
	for(int i=2;i<=n;i++) {
		if(!vis[i]) pr[++tot]=i,ys[i][1]=i,ys[i][0]=1;
		for(int j=1;i*pr[j]<=n;j++) {
			vis[i*pr[j]]=1;
			if(i%pr[j]==0) {
				for(int l=1;l<=ys[i][0];l++) ys[i*pr[j]][l]=ys[i][l];
				ys[i*pr[j]][0]=ys[i][0];
				break;
			}
			for(int l=1;l<=ys[i][0];l++) ys[i*pr[j]][l]=ys[i][l];
			ys[i*pr[j]][ys[i][0]+1]=pr[j];
			ys[i*pr[j]][0]=ys[i][0]+1;
		}
	}
}
//线段树
struct node {
	int l,r,dat;
} tr[N*4];
void tbd(int pos,int l,int r) {
	tr[pos].l=l,tr[pos].r=r;
	if(l==r) return;
	int mid=(l+r)/2;
	tbd(pos*2,l,mid);tbd(pos*2+1,mid+1,r);
}
void tcg(int pos,int gl,int val) {
	if(tr[pos].l>gl||tr[pos].r<gl) return;
	if(tr[pos].l==tr[pos].r) {
		tr[pos].dat=val;
		return;
	}
	tcg(pos*2,gl,val);tcg(pos*2+1,gl,val);
	tr[pos].dat=max(tr[pos*2].dat,tr[pos*2+1].dat);
}
int tch(int pos,int l,int r) {
	if(tr[pos].l>r||tr[pos].r<l) return -1;
	if(tr[pos].l>=l&&tr[pos].r<=r) return tr[pos].dat;
	return max(tch(pos*2,l,r),tch(pos*2+1,l,r));
}
int main() {
	cin>>n>>q;
	init();
	tbd(1,1,n);
	while(q--) {
		cin>>opt;
		if(opt=='S') {
			cin>>x;
			if(!ope[x]) {
				for(int i=1;i<=ys[x][0];i++) {
					take(x,root[ys[x][i]]);
					int pp=pre(x,ys[x][i]),ll=last(x,ys[x][i]);
					if(tch(1,x,x)<pp) tcg(1,x,pp);
					if(tch(1,ll,ll)<x) tcg(1,ll,x);
				}
				ope[x]=1;
			} else {
				for(int i=1;i<=ys[x][0];i++) {
					int ll=last(x,ys[x][i]);
					del(x,root[ys[x][i]]);
					if(tch(1,ll,ll)==x){
                        tcg(1,ll,0);
						for(int j=1;j<=ys[ll][0];j++) {
							int pp=pre(ll,ys[ll][j]);
							if(tch(1,ll,ll)<j) tcg(1,ll,j);
						}
					}
				}
                tcg(1,x,0);
				ope[x]=0;
			}
		} else {
			cin>>x>>y;
			if(tch(1,1,y)>=x) cout<<"DA"<<endl;
			else cout<<"NE"<<endl;
		}
	}
}
2025/8/3 15:03
加载中...