社区讨论
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 条回复,欢迎继续交流。
正在加载回复...