80pts求调
查看原帖
80pts求调
142085
ROBOTGear楼主2023/3/20 21:29

疑似插入出现问题,但是看不出来,WA on 3,TLE on 6

#include <bits/stdc++.h>
using namespace std;
inline int read(){
	int s=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			f*=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*f;
}
inline void write(int x){
	if(x<0){
		putchar('-');
		x=-x;
	}
	if(x>9){
		write(x/10);
	}
	putchar(x%10+'0');
}
const int MAXN=4e6+5;
stack<int> S;
int root=0,cnt=0,a[MAXN];
struct Node{
	int val,sum,mxpre,mxsuf,mxsum,son[2],fa,lzu,rev,size;
}tr[MAXN];
inline int New(int val,int fa){
	int t;
	if(!S.empty()){
		t=S.top();
		S.pop();
		if(!tr[t].son[0])S.push(tr[t].son[0]);
		if(!tr[t].son[1])S.push(tr[t].son[1]);
	}
	else t=++cnt;
	tr[t].val=val;
	tr[t].sum=tr[t].mxsum=val;
	tr[t].mxpre=tr[t].mxsuf=max(val,0);
	tr[t].fa=fa;
	tr[t].son[0]=tr[t].son[1]=0;
	tr[t].rev=0;
	tr[t].lzu=-10000;
	tr[t].size=1;
	return t;
}
inline void Mod(int k,int v){
	tr[k].sum=tr[k].size*v;
	tr[k].lzu=tr[k].val=v;
	tr[k].mxpre=tr[k].mxsuf=max(tr[k].sum,0);
	tr[k].mxsum=max(tr[k].sum,v);
}
inline void Rev(int k){
	tr[k].rev^=1;
	swap(tr[k].son[0],tr[k].son[1]);
	swap(tr[k].mxpre,tr[k].mxsuf);
}
/*inline void upd(int k){
	tr[k].sum=tr[k].mxpre=tr[k].mxsuf=tr[k].mxsum=tr[k].val;
	tr[k].size=tr[tr[k].son[0]].size+tr[tr[k].son[1]].size+1;
	if(tr[k].son[0]&&tr[tr[k].son[0]].val!=0xc0c0c0c0){
		tr[k].mxsum=max(max(tr[k].mxsum,tr[tr[k].son[0]].mxsum),tr[tr[k].son[0]].mxsuf+tr[k].mxpre);
		tr[k].mxpre=max(tr[tr[k].son[0]].mxpre,tr[tr[k].son[0]].sum+tr[k].mxpre);
		tr[k].mxsuf=max(tr[k].mxsuf,tr[tr[k].son[0]].mxsuf+tr[k].sum);
		tr[k].sum+=tr[tr[k].son[0]].sum;
	}
	if(tr[k].son[1]&&tr[tr[k].son[1]].val!=0xc0c0c0c0){
		tr[k].mxsum=max(max(tr[k].mxsum,tr[tr[k].son[1]].mxsum),tr[k].mxsuf+tr[tr[k].son[1]].mxpre);
		tr[k].mxpre=max(tr[k].mxpre,tr[k].sum+tr[tr[k].son[1]].mxpre);
		tr[k].mxsuf=max(tr[tr[k].son[1]].mxsuf,tr[k].mxsuf+tr[tr[k].son[1]].sum);
		tr[k].sum+=tr[tr[k].son[1]].sum;
	}
}*/
inline void upd(int k){
	int ls=tr[k].son[0],rs=tr[k].son[1];
	tr[k].size=tr[ls].size+tr[rs].size+1;
	tr[k].mxsum=max(max(tr[ls].mxsum,tr[rs].mxsum),tr[ls].mxsuf+tr[k].val+tr[rs].mxpre);
	tr[k].mxpre=max(tr[ls].mxpre,tr[ls].sum+tr[k].val+tr[rs].mxpre);
	tr[k].mxsuf=max(tr[rs].mxsuf,tr[ls].mxsuf+tr[k].val+tr[rs].sum);
	tr[k].sum=tr[ls].sum+tr[rs].sum+tr[k].val;
}
inline void psd(int k){
	if(tr[k].rev){
		if(tr[k].son[0])Rev(tr[k].son[0]);
		if(tr[k].son[1])Rev(tr[k].son[1]);
		tr[k].rev=0;
	}
	if(tr[k].lzu!=-10000){
		if(tr[k].son[0]){
			Mod(tr[k].son[0],tr[k].lzu);
		}
		if(tr[k].son[1]){
			Mod(tr[k].son[1],tr[k].lzu);
		}
		tr[k].lzu=-10000;
	}
}
inline void RotFa(int x){
	int y=tr[x].fa,z=tr[y].fa;
	psd(y),psd(x);
	int c=(tr[y].son[0]==x);
	tr[y].son[!c]=tr[x].son[c];
	tr[tr[x].son[c]].fa=y;
	tr[x].son[c]=y;
	tr[y].fa=x;
	if(z){
		tr[z].son[tr[z].son[1]==y]=x;
	}
	tr[x].fa=z;
	upd(y),upd(x);
}
void Splay(int x,int goal){
	while(tr[x].fa!=goal){
		int y=tr[x].fa,z=tr[y].fa;
		if(z!=goal){
			(tr[y].son[0]==x)^(tr[z].son[0]==y)?RotFa(x):RotFa(y);
		}
		RotFa(x);
	}
	if(!goal)root=x;
}
int Build(int l,int r,int fa){
	if(l>r)return 0;
	int mid=(l+r)>>1;
	int k=New(a[mid],fa);
	tr[k].son[0]=Build(l,mid-1,k);
	tr[k].son[1]=Build(mid+1,r,k);
	upd(k);
	return k;
}
int Find(int rk){
	int k=root;
	while(k){
		psd(k);
		if(tr[tr[k].son[0]].size>=rk){
			k=tr[k].son[0];
			continue;
		}
		if(tr[tr[k].son[0]].size+1>=rk){
			return k;
		}
		rk-=(tr[tr[k].son[0]].size+1);
		k=tr[k].son[1];
	}
	return 0;
}
void Print(int k){
	if(!k){
		return;
	}
	psd(k);
	Print(tr[k].son[0]);
	write(tr[k].val);
	putchar(' ');
	Print(tr[k].son[1]);
}
int main(){
	//freopen("P2042_3.in","r",stdin);
	//freopen("ans.out","w",stdout);
	tr[0].size=tr[0].mxsuf=tr[0].mxpre=0;
	tr[0].mxsum=0xc0c0c0c0;
	int n=read(),m=read();
	a[1]=0xc0c0c0c0;
	for(int i=2;i<=n+1;i++){
		a[i]=read();
	}
	a[n+2]=0xc0c0c0c0;
	root=Build(1,n+2,root);
	int L=Find(1),R=Find(n+2);
	for(int i=1;i<=m;i++){
		string s;
		cin>>s;
		if(s=="INSERT"){
			int posi=read(),tot=read();
			if(!tot)continue;
			int x=Find(posi+1);
			Splay(x,0);
			int y=Find(posi+2);
			Splay(y,x);
			for(int j=1;j<=tot;j++){
				a[j]=read();
			}
			tr[y].son[0]=Build(1,tot,y);
			upd(y),upd(x);
   			Print(tr[y].son[0]);
			putchar('\n');
		}
		else if(s=="DELETE"){
			int posi=read(),tot=read();
			if(!tot)continue;
			int x=Find(posi);
			Splay(x,0);
			int y=Find(posi+tot+1);
			Splay(y,x);
			S.push(tr[y].son[0]);
			tr[y].son[0]=0;
			upd(y),upd(x);
   			Print(root);
			putchar('\n');
		}
		else if(s=="MAKE-SAME"){
			int posi=read(),tot=read();
			if(!tot)continue;
			int x=Find(posi);
			Splay(x,0);
			int y=Find(posi+tot+1);
			Splay(y,x);
			int v=read();
			Mod(tr[y].son[0],v);
			upd(y),upd(x);
   			//Print(root);
			//putchar('\n');
		}
		else if(s=="REVERSE"){
			int posi=read(),tot=read();
			if(!tot)continue;
			int x=Find(posi);
			Splay(x,0);
			int y=Find(posi+tot+1);
			Splay(y,x);
			Rev(tr[y].son[0]);
			upd(y),upd(x);
   			//Print(root);
			//putchar('\n');
		}
		else if(s=="GET-SUM"){
			int posi=read(),tot=read();
			if(!tot){
				write(0);
				putchar('\n');
				continue;
			}
			int x=Find(posi);
			Splay(x,0);
			int y=Find(posi+tot+1);
			Splay(y,x);
			write(tr[tr[y].son[0]].sum);
			putchar('\n');
		}
		else{
			//Print(root);
			//putchar('\n');
			Splay(L,0);
			Splay(R,L);
			write(tr[tr[R].son[0]].mxsum);
			putchar('\n');
		}
	}
	return 0;
}
2023/3/20 21:29
加载中...