码迷,mamicode.com
首页 > 其他好文 > 详细

2018.12.10-splay

时间:2018-12-10 18:21:26      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:sed   define   include   排序   大数据   size   getc   inf   c++   

splay练习题:

oj1160 维护数列 sequence

oj1849 排序机械臂(sort)

oj1160

大数据结构,写了半天,心态崩了.....

技术分享图片
#include<bits/stdc++.h>
#define il inline
#define _(d) while(d(isdigit(ch=getchar())))
using namespace std;
const int N=1e6,inf=0x3f3f3f3f;
char s[10];queue<int> q;
int n,m,rt,son[N][2],mx[N],sum[N],lx[N],rx[N],sz[N],fa[N],id[N],v[N],rev[N],laz[N],tot,p,a[N];
il int read(){int x,f=1;char ch;_(!)ch==-?f=-1:f;x=ch^48;_()x=(x<<1)+(x<<3)+(ch^48);return f*x;}
il void C(int k,int c){
    if(k==0)return;sum[k]=c*sz[k];lx[k]=rx[k]=max(0,sum[k]);
    mx[k]=max(sum[k],c);laz[k]=c;v[k]=c;rev[k]=0;
}
il void R(int x){rev[x]^=1;swap(son[x][0],son[x][1]);swap(lx[x],rx[x]);}
il void update(int x){
    int l=son[x][0],r=son[x][1];
    sum[x]=sum[l]+sum[r]+v[x];
    mx[x]=max(mx[l],mx[r]);mx[x]=max(mx[x],rx[l]+lx[r]+v[x]);
    rx[x]=max(rx[r],rx[l]+v[x]+sum[r]);
    lx[x]=max(lx[l],lx[r]+v[x]+sum[l]);
    sz[x]=sz[l]+sz[r]+1;
}
il void pushdown(int x){
    if(laz[x]!=inf){C(son[x][0],laz[x]);C(son[x][1],laz[x]);laz[x]=inf;rev[x]=0;}
    if(rev[x]){R(son[x][0]);R(son[x][1]);rev[x]=0;}
}
il void build(int x,int l,int r){
    int mid=(l+r)>>1;int now=id[mid],pre=id[x];laz[now]=inf;rev[now]=0;
    if(l==r){
        sum[now]=mx[now]=a[l];
        sz[now]=1;lx[now]=rx[now]=max(a[l],0);
    }
    if(l<mid)build(mid,l,mid-1);if(mid<r)build(mid,mid+1,r);
    fa[now]=pre;son[pre][mid>=x]=now;v[now]=a[mid];update(now);
}
il int kth(int x,int rk){
    pushdown(x);
    if(sz[son[x][0]]+1==rk)return x;
    if(rk<=sz[son[x][0]])return kth(son[x][0],rk);
    return kth(son[x][1],rk-sz[son[x][0]]-1);
}
il void rotate(int x,int &k){
    int y=fa[x],z=fa[y],tp;tp=(x==son[y][1]);
    if(k==y)k=x;else son[z][son[z][1]==y]=x;
    son[y][tp]=son[x][tp^1];fa[son[y][tp]]=y;
    son[x][tp^1]=y;fa[y]=x;fa[x]=z;update(y);update(x);
}
il void splay(int x,int &k){
    while(x!=k){
        int y=fa[x],z=fa[y];
        if(y!=k){
            if((son[y][0]==x)^(son[z][0]==y))rotate(x,k);
            else rotate(y,k);
        }
        rotate(x,k);
    }
}
il void rey(int x){
    if(son[x][0])rey(son[x][0]);
    if(son[x][1])rey(son[x][1]);
    q.push(x);son[x][0]=son[x][1]=0;fa[x]=0;laz[x]=inf;
}
int main()
{
    n=read();m=read();for(int i=1;i<=n;i++)a[i+1]=read();
    rt=(n+3)>>1;for(int i=1;i<=n+2;i++)id[i]=i;mx[0]=a[1]=a[n+2]=-inf;
    build(0,1,n+2);for(int i=n+3;i<=500000;i++)q.push(i);
    while(m--){
        scanf(" %s",&s);
        if(s[0]==I){
            p=read();tot=read();
            for(int i=1;i<=tot;i++)a[i]=read(),id[i]=q.front(),q.pop();
            build(0,1,tot);int z=id[(1+tot)>>1];
            int x=kth(rt,p+1),y=kth(rt,p+2);
            splay(x,rt);splay(y,son[x][1]);
            fa[z]=y;son[y][0]=z;update(y);update(x);
        }
        if(s[0]==D){
            p=read();tot=read();
            int x=kth(rt,p),y=kth(rt,p+1+tot);
            splay(x,rt);splay(y,son[x][1]);
            rey(son[y][0]);son[y][0]=0;update(y);update(x);
        }
        if(s[2]==K){
            p=read();tot=read();int c=read();
            int x=kth(rt,p),y=kth(rt,p+tot+1);
            splay(x,rt);splay(y,son[x][1]);
            C(son[y][0],c);update(y);update(x);
        }
        if(s[0]==R){
            p=read();tot=read();
            int x=kth(rt,p),y=kth(rt,p+tot+1);
            splay(x,rt);splay(y,son[x][1]);
            R(son[y][0]);update(y);update(x);
        }
        if(s[0]==G){
            p=read();tot=read();
            int x=kth(rt,p),y=kth(rt,p+tot+1);
            splay(x,rt);splay(y,son[x][1]);
            printf("%d\n",sum[son[y][0]]);update(y);update(x);
        }
        if(s[2]==X)printf("%d\n",mx[rt]);
    }
    return 0;
}
View Code

再见!再也不想看到这道题!

 

2018.12.10-splay

标签:sed   define   include   排序   大数据   size   getc   inf   c++   

原文地址:https://www.cnblogs.com/Jessie-/p/10094655.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!