社区讨论

40分求条 ,FHQ

P2710数列参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mbu7hl4u
此快照首次捕获于
2025/06/13 10:46
8 个月前
此快照最后确认于
2025/11/04 07:13
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m;
struct node{int ls,rs,key,sum,pri,size,lazy1,lazy2,lmax,max,rmax;}t[4000005];
int cnt,root,sum,s;
inline int newNode(int x){
	t[++cnt].key=x;
	t[cnt].sum=t[cnt].max=x;
	t[cnt].lmax=t[cnt].rmax=max(x,0);
	t[cnt].pri=rand();
	t[cnt].size=1;
	t[cnt].lazy2=INT_MIN;
	return cnt;
}
inline void Update(int u){
	int ls=t[u].ls,rs=t[u].rs;
	t[u].size=t[ls].size+t[rs].size+1;
	t[u].sum=t[ls].sum+t[rs].sum+t[u].key;
	t[u].lmax=max(t[ls].lmax,t[ls].sum+t[u].key+max(0,t[rs].lmax));
	t[u].rmax=max(t[rs].rmax,t[rs].sum+t[u].key+max(0,t[ls].rmax));
	t[u].max=max({t[ls].max,t[rs].max,max(0,t[ls].rmax)+t[u].key+max(0,t[rs].lmax)});
}
inline void push_down(int u){
	if(t[u].lazy1){
		swap(t[u].ls,t[u].rs);
		swap(t[u].lmax,t[u].rmax);
		t[t[u].ls].lazy1^=1;t[t[u].rs].lazy1^=1;
		t[u].lazy1=0;
	}
	if(t[u].lazy2!=INT_MIN){
		if(t[u].ls){
			t[t[u].ls].key=t[u].lazy2;
			t[t[u].ls].lazy2=t[u].lazy2;
			t[t[u].ls].rmax=t[t[u].ls].lmax=t[t[u].ls].max=t[t[u].ls].sum=t[t[u].ls].size*t[u].lazy2;
			if(t[t[u].ls].sum<0)t[t[u].ls].rmax=t[t[u].ls].lmax=0,t[t[u].ls].max=t[u].lazy2;
		}
		if(t[u].rs){
			t[t[u].rs].key=t[u].lazy2;
			t[t[u].rs].lazy2=t[u].lazy2;
			t[t[u].rs].rmax=t[t[u].rs].lmax=t[t[u].rs].max=t[t[u].rs].sum=t[t[u].rs].size*t[u].lazy2;
			if(t[t[u].rs].sum<0)t[t[u].rs].rmax=t[t[u].rs].lmax=0,t[t[u].rs].max=t[u].lazy2;
		}
		t[u].lazy2=INT_MIN;
	}
}
inline void Split(int u,int k,int &L,int &R){
	if(!u){L=R=0;return ;}
	push_down(u);
	if(k<=t[t[u].ls].size){
		R=u;
		Split(t[u].ls,k,L,t[u].ls);
	}
	else {
		L=u;
		Split(t[u].rs,k-t[t[u].ls].size-1,t[u].rs,R);
	}
	Update(u);
}
inline int Merge(int L,int R){
	if(!L||!R)return L+R;
	if(t[L].pri>t[R].pri){
		push_down(L);
		t[L].rs=Merge(t[L].rs,R);
		Update(L);
		return L;
	}
	else {
		push_down(R);
		t[R].ls=Merge(L,t[R].ls);
		Update(R);
		return R;
	}
}
inline void dfs(int u){
	if(!u)return ;
	if(t[u].ls)cout<<u<<' '<<t[u].ls<<' '<<t[t[u].ls].key<<'\n';
	else cout<<0<<'\n';
	dfs(t[u].ls);
	if(t[u].rs)cout<<u<<' '<<t[u].rs<<' '<<t[t[u].rs].key<<'\n';
	dfs(t[u].rs);
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	srand(time(NULL));
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int x;cin>>x;
		root=Merge(root,newNode(x));
	}
	while(m--){
		t[0].lmax=t[0].rmax=t[0].max=-1e18;
		t[0].key=t[0].pri=t[0].size=t[0].sum=0;
		string op;int post,tot,c;
		cin>>op;
		if(op=="INSERT"){
			cin>>post>>tot;
			int L,R;
			Split(root,post,L,R);
			for(int i=1;i<=tot;i++)cin>>c,L=Merge(L,newNode(c));
			root=Merge(L,R);
		}
		else if(op=="DELETE"){
			cin>>post>>tot;
			int L,R,p;
			Split(root,post-1,L,R);
			Split(R,tot,R,p);
			root=Merge(L,p);
		}
		else if(op=="MAKE-SAME"){
			cin>>post>>tot>>c;
			int L,R,p;
			Split(root,post-1,L,R);
			Split(R,tot,R,p);
			t[R].key=t[R].lazy2=c;
			t[R].lmax=t[R].rmax=t[R].max=t[R].sum=c*tot;
			if(c<0)t[R].lmax=t[R].rmax=0,t[R].max=c;
			root=Merge(L,Merge(R,p));
		}
		else if(op=="REVERSE"){
			cin>>post>>tot;
			int L,R,p;
			Split(root,post-1,L,R);
			Split(R,tot,R,p);
			t[R].lazy1^=1;
			root=Merge(L,Merge(R,p));
		}
		else if(op[0]=='G'){
			cin>>post;
			if(op=="GET-SUM")cin>>tot;
			else tot=1;
			int L,R,p;
			Split(root,post-1,L,R);
			Split(R,tot,R,p);
			cout<<t[R].sum<<'\n';
			root=Merge(L,Merge(R,p));
		}
		else {
			cin>>post>>tot;
			int L,R,p;
			Split(root,post-1,L,R);
			Split(R,tot,R,p);
			cout<<t[R].max<<'\n';
			root=Merge(L,Merge(R,p));
		}
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...