求助,样例无输出
  • 板块P2710 数列
  • 楼主Sternenlicht
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/5/19 20:56
  • 上次更新2023/10/23 15:20:32
查看原帖
求助,样例无输出
518232
Sternenlicht楼主2023/5/19 20:56
namespace IO{
	#define LL long long
	inline LL read(){
		LL x=0,f=1;char c=getchar();
		for (;!isdigit(c);c=getchar())if (c=='-')f=-1;
		for (;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
		return x*f;
	}
	inline void write(LL x,char c='\n'){
		if (x){
			if (x<0)x=-x,putchar('-');
			char a[30];short l;
			for (l=0;x;x/=10)a[l++]=x%10^48;
			for (l--;l>=0;l--)putchar(a[l]);
		}else putchar('0');putchar(c);
	}
}using namespace IO;
using namespace std;

#define lson(x) (t[x].son[0])
#define rson(x) (t[x].son[1])
#define int long long
const int N = 5e5+10;
const int INF = 2e9;
struct Treap{
	int son[2],key,siz,val;
	int ls,rs,maxn;
	int cov,rev,sum;
}t[N];int sta[N],top,n,m,cnt,root;
void Rev(int now){
	if (!now)return ;
	swap(t[now].ls,t[now].rs);
	swap(t[now].son[0],t[now].son[1]);
	t[now].rev^=1;
}
void Cov(int now,int cov){
	t[now].cov=t[now].val=cov;
	t[now].sum=t[now].siz*cov;
	t[now].ls=t[now].rs=max(0ll,t[now].sum);
	t[now].maxn=max(cov,t[now].sum);
}
void pushup(int now){
	t[now].siz=t[lson(now)].siz+t[rson(now)].siz+1;
	t[now].sum=t[lson(now)].sum+t[rson(now)].sum+t[now].val;
	t[now].ls=max(t[lson(now)].ls,max(0ll,t[lson(now)].sum+t[now].val+t[rson(now)].ls));
	t[now].rs=max(t[rson(now)].rs,max(0ll,t[rson(now)].sum+t[now].val+t[lson(now)].rs));
	t[now].maxn=max(t[now].val,t[lson(now)].rs+t[now].val+t[rson(now)].ls);
	if (lson(now))t[now].maxn=max(t[now].maxn,t[lson(now)].maxn);
	if (rson(now))t[now].maxn=max(t[now].maxn,t[rson(now)].maxn);
}
void pushdown(int now){
	if (t[now].cov!=INF){
		int cov=t[now].cov;
		if (lson(now))Cov(lson(now),cov);
		if (rson(now))Cov(rson(now),cov);
		t[now].cov=INF;
	}
	if (t[now].rev){
		if (lson(now))Rev(lson(now));
		if (rson(now))Rev(rson(now));
		t[now].rev=0;
	}
}
void split(int now,int val,int &x,int &y){
	if (!now)return x=y=0,void();
	pushdown(now);
	if (t[lson(now)].siz<val)
		x=now,split(rson(x),val-t[lson(x)].siz-1,rson(x),y),
		pushup(x);
	else
		y=now,split(lson(y),val,x,lson(y)),
		pushup(y);
	pushup(now);
}
int merge(int x,int y){
	if (!x||!y)return x+y;
	if (t[x].key<t[y].key){
		pushdown(x);
		rson(x)=merge(rson(x),y);
		pushup(x);
		return x;
	}
	else{
		pushdown(y);
		lson(y)=merge(x,lson(y));
		pushup(y);
		return y;
	}
}
int init(int val){
	int now=(top?sta[top--]:++cnt);
	t[now].key=rand();
	t[now].cov=INF;
	t[now].rev=0;
	lson(now)=rson(now)=0;
	t[now].maxn=t[now].sum=t[now].val=val;
	t[now].ls=t[now].rs=max(0ll,val);
	t[now].siz=1;
	return now;
}
int build(int l,int r){
	if (l==r)return init(read());
	int mid=(l+r)>>1;
	int t1=build(1,mid);
	int t2=build(mid+1,r);
	return merge(t1,t2);
}
void Del(int now){
	if (lson(now))Del(lson(now));
	if (rson(now))Del(rson(now));
	sta[++top]=now;
}
void Delete(int l,int r){
	int t1,t2,t3;
	split(root,r,t1,t2);
	split(t1,l-1,t1,t3);
	Del(t3);
	root=merge(t1,t2);
}
void Cover(int l,int r,int cov){
	int t1,t2,t3;
	split(root,r,t1,t2);
	split(t1,l-1,t1,t3);
	Cov(t3,cov);
	root=merge(merge(t1,t3),t2);
}
void Reverse(int l,int r){
	int t1,t2,t3;
	split(root,r,t1,t2);
	split(t1,l-1,t1,t3);
	Rev(t3);
	root=merge(merge(t1,t3),t2);
}
int Query(int l,int r){
	int t1,t2,t3;
	split(root,r,t1,t2);
	split(t1,l-1,t1,t3);
	int ret=t[t3].sum;
	root=merge(merge(t1,t3),t2);
	return ret;
}
int Max(int l,int r){
	int t1,t2,t3;
	split(root,r,t1,t2);
	split(t1,l-1,t1,t3);
	int ret=t[t3].maxn;
	root=merge(merge(t1,t3),t2);
	return ret;
}
signed main(){
	n=read(),m=read(),root=build(1,n);
	for (int i=1;i<=m;i++){
		char s[20];cin>>s;
		if (s[0]=='I'){
			int x=read(),N=read(),t1,t2;
			split(root,x,t1,t2);
			root=merge(merge(t1,build(x,x+N-1)),t2);
		}
		else if (s[0]=='D'){
			int x=read(),N=read();
			Delete(x,x+N-1);
		}
		else if (s[0]=='R'){
			int x=read(),N=read();
			Reverse(x,x+N-1);
		}
		else if (s[2]=='K'){
			int x=read(),N=read(),cov=read();
			Cover(x,x+N-1,cov);
		}
		else if (s[1]=='A'){
			int x=read(),N=read();
			write(Max(x,x+N-1));
		}
		else if (strlen(s)>4){
			int x=read(),N=read();
			write(Query(x,x+N-1));
		}
		else{
			int x=read();
			write(Query(x,x));
		}
	}
	return 0;
}

盲猜是代码中的输入有问题QAQ

2023/5/19 20:56
加载中...