蒟蒻有个小问题
查看原帖
蒟蒻有个小问题
1015770
Arteg楼主2024/4/7 19:36

为啥这个代码maxn设为1800010会TLE on #7
下数据看了一下#7点数最多在8e5左右
所以不是很明白

#include<bits/stdc++.h>
using namespace std;

const int maxn=2000010;
const int mo=1000000007;
const int inf=0x7f7f7f7f;

inline int read(){
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}

mt19937 myr(time(0));
int n,m,a[maxn],b[maxn],minsort=inf;
char op[20];

inline int _min(int a,int b){
	return a>b?b:a;
}

inline int _abs(int a){
	return a>0?a:-a;
}

struct fhq{
	int tot,rt;
	int ls[maxn],rs[maxn],v[maxn],rnd[maxn],siz[maxn];
	void up(int x){
		siz[x]=siz[ls[x]]+siz[rs[x]]+1;
		return ;
	}
	int newn(int x){
		v[++tot]=x;
		siz[tot]=1;
		rnd[tot]=myr();
		ls[tot]=rs[tot]=0;
		return tot;
	}
	void split(int p,int vv,int &x,int &y){
		if(!p){
			x=y=0;
			return ;
		}
		if(vv>=v[p]){
			x=p;
			split(rs[p],vv,rs[p],y);
		}
		else{
			y=p;
			split(ls[p],vv,x,ls[p]);
		}
		up(p);
		return ;
	}
	int merge(int x,int y){
		if(!x||!y)
			return x+y;	
		if(rnd[x]>rnd[y]){
			rs[x]=merge(rs[x],y);
			up(x);
			return x;
		}
		ls[y]=merge(x,ls[y]);
		up(y);
		return y;
	}
	void insert(int vv){
		int x,y;
		split(rt,vv-1,x,y);
		rt=merge(merge(x,newn(vv)),y);
		return ;
	}
	void del(int vv){
		int x,y,z;
		split(rt,vv,x,z);
		split(x,vv-1,x,y);
		if(y)
			y=merge(ls[y],rs[y]);
		rt=merge(merge(x,y),z);
		return ;
	}
	int kth(int x,int now){
		while(1){
			if(siz[ls[now]]+1==x)
				return v[now];
			else if(siz[ls[now]]+1>x)
				now=ls[now];
			else{
				x-=siz[ls[now]]+1;
				now=rs[now];
			}
		}
	}
	int lower(int vv){
		int x,y,z,ans=-1;
		split(rt,vv,x,z);
		split(x,vv-1,x,y);
		if(siz[y]>1)			
			ans=vv;
		else if(x)
			ans=kth(siz[x],x);
		rt=merge(merge(x,y),z);	
		return ans;
	}
	int upper(int vv){
		int x,y,ans=-1;
		split(rt,vv,x,y);	
		if(y)
			ans=kth(1,y);
		rt=merge(x,y);
		return ans;
	}
	int sum(){
		return siz[rt];
	}	
}t1,t2;

signed main(){
	n=read();
	m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		b[i]=a[i];
		if(i!=1)
			t1.insert(_abs(a[i]-a[i-1]));
		t2.insert(a[i]);
	}
	for(int i=1;i<=n;i++){
		int low=t2.lower(a[i]),up=t2.upper(a[i]);
		minsort=_min(minsort,_min(up==-1?inf:_abs(up-a[i]),low==-1?inf:_abs(a[i]-low)));
	}
	while(m--){
		scanf("%s",op);
		if(op[0]=='I'){
			int i=read(),k=read();
			if(i!=n){
				t1.del(_abs(b[i]-a[i+1]));				
				t1.insert(_abs(k-a[i+1]));				
			}
			t1.insert(_abs(k-b[i]));
			b[i]=k;
			t2.insert(k);
			int low=t2.lower(k),up=t2.upper(k);			
			minsort=_min(minsort,_min(up==-1?inf:_abs(up-k),low==-1?inf:_abs(k-low)));
		}
		else if(op[4]=='G')
			printf("%d\n",t1.kth(1,t1.rt));
		else
			printf("%d\n",minsort);
	}
	return 0;
}
2024/4/7 19:36
加载中...