离奇代码,输出被小E吃掉,玄关求调
查看原帖
离奇代码,输出被小E吃掉,玄关求调
1125685
Frielen楼主2024/11/8 13:45

rt,在本机上使用样例一切正常。

但提交至lg,发现全部输出均被小E吃掉。

下载第1个测试点,有 n=m=49999。

freopen 发现,输出在本机上同样被小E吃掉。

对样例进行 freopen,仍旧一切正常。

代码如下:

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls(p) p<<1
#define rs(p) p<<1|1
const int N=2e5+9;
int a[N<<5],n,m;
int cnt;
struct Node{
	int ls,rs,num,key,sz;
}fhq[N];
int addnode(int val){
	cnt++;
	fhq[cnt].num=val;
	fhq[cnt].ls=fhq[cnt].rs=0;
	fhq[cnt].key=rand();
	fhq[cnt].sz=1;
	return cnt;
}
void update(int p){
	fhq[p].sz=fhq[fhq[p].ls].sz+fhq[fhq[p].rs].sz+1;
}
void split(int p,int val,int &rootx,int &rooty){
	if(!p){
		rootx=rooty=0;
		return;
	}
	if(fhq[p].num<=val){
		rootx=p;
		split(fhq[p].rs,val,fhq[p].rs,rooty);
	}
	else{
		rooty=p;
		split(fhq[p].ls,val,rootx,fhq[p].ls);
	}
	update(p);
}
int merge(int rootx,int rooty){
	if(!rootx||!rooty) return rootx+rooty;
	if(fhq[rootx].key>=fhq[rooty].key){
		fhq[rootx].rs=merge(fhq[rootx].rs,rooty);
		update(rootx);
		return rootx;
	}
	fhq[rooty].ls=merge(rootx,fhq[rooty].ls);
	update(rooty);
	return rooty;
}
void ins(int &root,int val){
	int X,Y;
    split(root,val,X,Y);
    root=merge(merge(X,addnode(val)),Y);
}
void del(int &root,int val){
	int X,Y,Z;
    split(root,val,X,Z);
    split(X,val-1,X,Y);
    Y=merge(fhq[Y].ls,fhq[Y].rs);
    root=merge(merge(X,Y),Z);
}
int rk(int &root,int val){
	int l=0,r=0;
	split(root,val-1,l,r);
	int ans=fhq[l].sz;
	root=merge(l,r);
	return ans;
} 
int pre(int &root,int val){
	int X,Y;
    split(root,val-1,X,Y);
    int now=X;
	if(!now) return -1e9;
    while(fhq[now].rs) now=fhq[now].rs;
    int res=fhq[now].num;
    root=merge(X,Y);
    return res;
}
int nxt(int &root,int val){
	int X,Y;
	split(root,val,X,Y);  
    int now=Y;
    if(!now) return 1e9;
    while(fhq[now].ls) now=fhq[now].ls;
    int res=fhq[now].num;
    root=merge(X,Y);
    return res;
}
int tree[N<<8];
void build(int p,int l,int r){
	if(l==r){
		tree[p]=addnode(a[l]);
		return;
	}
	for(int i=l;i<=r;i++) ins(tree[p],a[i]);
	int mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
}
int Rank(int p,int l,int r,int x,int y,int d){
	if(x<=l&&r<=y) return rk(tree[p],d);
	int mid=(l+r)>>1,res=0;
	if(x<=mid) res+=Rank(ls(p),l,mid,x,y,d);
	if(y>mid) res+=Rank(rs(p),mid+1,r,x,y,d);
	return res;
}
int Rknum(int x,int y,int k){
	int l=0,r=1e8+1,ans=0;
	while(l<r){
		int mid=(l+r)>>1;
		if(Rank(1,1,n,x,y,mid)<k) ans=mid,l=mid+1;
		else r=mid;
	}
	return ans;
}
void Update(int p,int l,int r,int pos,int k){
	del(tree[p],a[pos]);
	ins(tree[p],k);
	if(l==r) return;
	int mid=(l+r)>>1;
	if(pos<=mid) Update(ls(p),l,mid,pos,k);
	else Update(rs(p),mid+1,r,pos,k);
}
int Pre(int p,int l,int r,int x,int y,int k){
	if(x<=l&&r<=y) return pre(tree[p],k);
	int mid=(l+r)>>1,res=-1e9;
	if(x<=mid) res=max(res,Pre(ls(p),l,mid,x,y,k));
	if(y>mid) res=max(res,Pre(rs(p),mid+1,r,x,y,k));
	return res==-1e9?-2147483647:res;
}
int Nxt(int p,int l,int r,int x,int y,int k){
	if(x<=l&&r<=y) return nxt(tree[p],k);
	int mid=(l+r)>>1,res=1e9;
	if(x<=mid) res=min(res,Nxt(ls(p),l,mid,x,y,k));
	if(y>mid) res=min(res,Nxt(rs(p),mid+1,r,x,y,k));
	return res==1e9?2147483647:res;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,1,n);
	int op,l,r,k;
	for(int i=1;i<=m;i++){
		cin>>op;
		if(op==1){
			cin>>l>>r>>k;
			cout<<Rank(1,1,n,l,r,k)+1<<"\n";
		}
		else if(op==2){
			cin>>l>>r>>k;
			cout<<Rknum(l,r,k)<<"\n";
		}
		else if(op==3){
			cin>>l>>k;
			Update(1,1,n,l,k);
			a[l]=k;
		}
		else if(op==4){
			cin>>l>>r>>k;
			cout<<Pre(1,1,n,l,r,k)<<"\n";
		}
		else{
			cin>>l>>r>>k;
			cout<<Nxt(1,1,n,l,r,k)<<"\n";
		}
	}
	return 0;
}
2024/11/8 13:45
加载中...