splay 求调(马蜂良好(?
查看原帖
splay 求调(马蜂良好(?
246331
mystic_qwq楼主2024/4/24 13:15
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5,inf=1e9;
struct Node{
  int son[2],fa,v;
  int trev,tset;
  int sz,sum,val,lv,rv;
  Node(int v=0,int fa=0):v(v),fa(fa){
    *son=son[1]=trev=tset=0;
    sz=1,sum=val=v,lv=rv=max(0,v);
  }
  int&operator[](bool x){
    return son[x];
  }
} tr[N];
/*
Node&operator++(Node x){
  return tr[x[0]];
}
Node&operator--(Node x){
  return tr[x[1]];
}
int operator<<(Node x){
  return x.sz;
}
int operator>>(Node x){
  return x.sum;
}
int operator-(Node x){
  return x.lv;
}
int operator+(Node x){
  return x.rv;
}
int operator*(Node x){
  return x.val;
} */
#define ls(x) tr[x][0]
#define rs(x) tr[x][1]
#define Ls(x) tr[ls(x)]
#define Rs(x) tr[rs(x)]
#define fa(x) tr[x].fa
#define v(x) tr[x].v
#define sz(x) tr[x].sz
#define sum(x) tr[x].sum
#define val(x) tr[x].sum
#define lv(x) tr[x].lv
#define rv(x) tr[x].rv
#define trev(x) tr[x].trev
#define tset(x) tr[x].tset
//#define def Node&u=tr[x],&ls=tr[u[0]],&rs=tr[u[1]]
#define isl(x,y) (ls(y)==x)
#define isr(x,y) (rs(y)==x)
#define modify(xx){\
  if(type==1) xx.tset=1,xx.sum=(xx.v=v(x))*xx.sz;\
  else if(type==2) xx.val=xx.lv=xx.rv=xx.sum;\
  else xx.val=xx.v,xx.lv=xx.rv=0;\
}
void lrmod(int x,int type){
  if(ls(x)) modify(Ls(x));
  if(rs(x)) modify(Rs(x));
}
#undef modify 
void pushup(int x){
  sz(x)=Ls(x).sz+Rs(x).sz+1;
  sum(x)=Ls(x).sum+v(x)+Rs(x).sum;
  lv(x)=max(Ls(x).lv,Ls(x).sum+v(x)+Rs(x).lv);
  rv(x)=max(Rs(x).rv,Rs(x).sum+v(x)+Ls(x).rv);
  val(x)=max({Ls(x).val,Rs(x).val,Ls(x).rv+v(x)+Rs(x).lv});
}

void pushdown(int x){
  if(tset(x)){
    tset(x)=trev(x)=0;
    lrmod(x,1);
    if(v(x)>0) lrmod(x,2);
    else lrmod(x,3); 
  } else if(trev(x)){
    trev(x)=0,trev(ls(x))^=1,trev(rs(x))^=1;
    swap(lv(ls(x)),rv(rs(x))),swap(rv(rs(x)),lv(rs(x)));
    swap(Ls(x)[0],Ls(x)[1]),swap(Rs(x)[0],Rs(x)[1]);
  }
}
void rotate(int x){
  printf("rotate:%d\n",x),_sleep(500);
  int y=fa(x),z=fa(y);
  bool k=isr(x,y);
  fa(tr[z][isr(y,z)]=x)=z,
  fa(tr[y][k]=tr[x][!k])=y;
  fa(tr[x][!k]=y)=x;
  pushup(y),pushup(x);
}
int root;
void splay(int x,int k){
  printf("splay:%d %d\n",x,k);        _sleep(500);
  for(int y,z;(y=fa(x))^k;){
    if((z=fa(y))^k){
      if(isr(x,y)^isr(y,z)) rotate(x);
      else rotate(y);
    }
    rotate(x);
  }
  if(!k) root=x;
}
int get_k(int k){
  printf("get_k k=%d\n",k);
  for(int u=root,siz;u;){
    printf("get_k u=%d\n",u); _sleep(500);
    pushdown(u),siz=sz(ls(u));
    if(siz>=k) u=ls(u);
    else if(siz+1==k) return u;
    else k-=siz+1,u=rs(u);
  }
  return -1;
}
int node[N],tot,a[N];
#define mid (l+r>>1)
int build(int l,int r,int k){
  printf("build: %d %d %d\n",l,r,k); _sleep(1000);
  int u=node[++tot];
  tr[u]=Node(a[mid],k);
  if(l<mid) ls(u)=build(l,mid-1,u);
  if(mid<r) rs(u)=build(mid+1,r,u);
  return pushup(u),u;
}
#undef mid
void dfs(int u){
  if(ls(u)) dfs(ls(u));
  if(rs(u)) dfs(rs(u));
  node[++tot]=u;
}
int n,m;
main(){
  cin.tie(0)->sync_with_stdio(0);
  for(int i=1;i<N;++i) node[i]=i;
  /*tot=N-1; */
  cin>>n>>m; val(0)=*a=a[n+1]=-inf;
  for(int i=1;i<=n;++i) cin>>a[i];
  root=build(0,n+1,0); char op[10];
  for(int pos,n,c,l,r;m--;){
    cin>>op;
    #define GET1 l=get_k(pos),r=get_k(pos+n+1)
    #define PLAY splay(l,0),splay(r,l)
    #define PUSH pushup(r),pushup(l); break;
    if(*op=='M') {
      if(op[2]=='K')
        cin>>pos>>n>>c;
    }
    else cin>>pos>>n;
    switch(*op){
      case'I':{
        for(int i=0;i<n;++i) cin>>a[i];
        l=get_k(pos+1),r=get_k(pos+2);
        PLAY;
        ls(r)=build(0,n-1,r);
        PUSH
      }
      case'D':{
        GET1,PLAY;
        dfs(ls(r)),ls(r)=0;
        PUSH
      }
      case'M':{
        if(op[2]=='K'){
          GET1,PLAY;
          Ls(r).tset=1,sum(ls(r))=(v(ls(r))=c)*sz(ls(r));
          if(c>0) Ls(r).val=Ls(r).lv=Ls(r).rv=Ls(r).sum;
          else Ls(r).val=Ls(r).v,Ls(r).lv=Ls(r).rv=0;
          PUSH
        } 
        else {cout<<val(root)<<'\n'; break;}
      }
      case'R':{
        GET1,PLAY;
        Ls(r).trev^=1;
        swap(Ls(r).lv,Ls(r).rv);
        swap(Ls(r)[0],Ls(r)[1]);
        PUSH
      }
      case'G':{
        GET1,PLAY;
        cout<<Ls(r).sum<<'\n';
        break;
      }
    }
  }
}
2024/4/24 13:15
加载中...