省选前的模板整理

读入优化:  

char *p1,*p2,buf[100000];    
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)   
int rd() 
{
    int x=0; char c;    
    while(c<48) c=nc();   
    while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc();   
    return x;     
}

  

splay (普通平衡树)

#include <cstdio> 
#include <algorithm> 
#include <cstring>  
#include <ctime>   
#define ll long long 
#define N 200007    
#define inf 2000000000   
#define setIO(s) freopen(s".in","r",stdin)   
using namespace std; 

int val[N],n,m,root;  

struct Splay_Tree 
{   
    #define lson s[x].ch[0] 
    #define rson s[x].ch[1] 
    struct data 
    {
        int v,si,f,ch[2]; 
    }s[N*10];    
    int tot;    
    inline int newnode()  { return ++tot; }   
    inline int get(int x) { return s[s[x].f].ch[1]==x; }    
    inline void pushup(int x) 
    {
        s[x].si=s[lson].si+s[rson].si+1; 
    }          
    void rotate(int x) 
    {
        int old=s[x].f,fold=s[old].f,which=get(x); 
        s[old].ch[which]=s[x].ch[which^1];  
        if(s[old].ch[which]) s[s[old].ch[which]].f=old;   
        s[x].ch[which^1]=old,s[old].f=x,s[x].f=fold;   
        if(fold) s[fold].ch[s[fold].ch[1]==old]=x;   
        pushup(old),pushup(x);   
    }
    void splay(int x,int &tar) 
    {
        for(int u=s[tar].f,fa;(fa=s[x].f)!=u;rotate(x))   
            if(s[fa].f!=u) rotate(get(fa)==get(x)?fa:x);   
        tar=x; 
    }     
    void build(int l,int r,int &x) 
    {
        x=newnode();   
        int mid=(l+r)>>1;   
        s[x].v=val[mid];     
        if(mid>l) build(l,mid-1,lson),s[lson].f=x; 
        if(r>mid) build(mid+1,r,rson),s[rson].f=x;   
        pushup(x); 
    }   
    void ins(int &x,int fa,int v) 
    {
        if(!x) s[x=newnode()].f=fa,s[x].v=v;    
        else ins(s[x].ch[v>s[x].v],x,v);  
        pushup(x);   
    }
    int find(int x,int v) 
    {
        if(s[x].v==v) return x;   
        else return find(s[x].ch[v>s[x].v],v);    
    }  
    int getpre(int x,int v) 
    {
        if(!x) return 0;   
        if(s[x].v<v) 
        {
            int tmp=getpre(rson,v);   
            return tmp?tmp:x; 
        }else return getpre(lson,v); 
    }   
    int getaft(int x,int v) 
    {
        if(!x) return 0;  
        if(s[x].v>v) 
        {
            int tmp=getaft(lson,v);   
            return tmp?tmp:x; 
        }else return getaft(rson,v); 
    }   
    void del(int v)
    {
        int x=find(root,v),l,r;   
        for(splay(x,root),l=lson,r=rson;s[l].ch[1];l=s[l].ch[1]);         
        splay(l,s[x].ch[0]);   
        s[r].f=l,s[l].f=0,s[l].ch[1]=r,pushup(l),root=l;   
    }
    int getrank(int v) 
    {
        int x=getpre(root,v);  
        splay(x,root);   
        return s[lson].si+1; 
    }   
    int getnum(int x,int kth) 
    {
        if(kth==s[lson].si+1) return x; 
        else if(kth<=s[lson].si) return getnum(lson,kth);  
        else return getnum(rson,kth-s[lson].si-1);    
    }
}bst;     
char *p1,*p2,buf[100000];    
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)   
int rd() 
{
    int x=0; char c;    
    while(c<48) c=nc();   
    while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc();   
    return x;     
}
int main() 
{
    // setIO("input");   
    n=rd(),m=rd(); 
    for(int i=1;i<=n;++i) val[i]=rd(); 
    sort(val+1,val+1+n),val[0]=-inf,val[1+n]=inf;  
    bst.build(0,n+1,root);     
    int lastans=0,op,x,y,ans=0;   
    for(int i=1;i<=m;++i) 
    {
        op=rd(),x=rd()^lastans,y=0;   
        if(op==1) bst.ins(root,0,x),y=bst.tot;    
        if(op==2) bst.del(x);   
        if(op==3) lastans=bst.getrank(x),ans^=lastans;    
        if(op==4) y=bst.getnum(root,x+1);   
        if(op==5) y=bst.getpre(root,x);   
        if(op==6) y=bst.getaft(root,x);     
        if(op>=4) lastans=bst.s[y].v,ans^=lastans;   
        if(y&&(i%10==0)) bst.splay(y,root);   
    }             
    printf("%d\n",ans);   
    return 0; 
}

  

splay(文艺平衡树)  

#include <cstdio> 
#include <algorithm> 
#include <ctime>      
#define ll long long    
#define N 200007     
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;     
int val[N],n,m,root;     
struct BST
{        
    #define lson s[x].ch[0] 
    #define rson s[x].ch[1]  
    struct data 
    {
        int v,si,f,ch[2],tag;    
    }s[N];   
    int tot;  
    inline int newnode()  { return ++tot; }  
    inline int get(int x) { return s[s[x].f].ch[1]==x; }    
    inline void mark(int x) 
    {
        swap(lson,rson),s[x].tag^=1;      
    }  
    inline void pushup(int x) 
    {  
        s[x].si=s[lson].si+s[rson].si+1;  
    }
    inline void pushdown(int x)
    {
        if(s[x].tag) 
        {
            if(lson) mark(lson); 
            if(rson) mark(rson);   
            s[x].tag=0; 
        }
    }
    void rotate(int x) 
    {
        int old=s[x].f,fold=s[old].f,which=get(x);  
        s[old].ch[which]=s[x].ch[which^1];  
        if(s[old].ch[which]) s[s[old].ch[which]].f=old;  
        s[x].ch[which^1]=old,s[old].f=x,s[x].f=fold;  
        if(fold) s[fold].ch[s[fold].ch[1]==old]=x;   
        pushup(old),pushup(x); 
    }   
    void splay(int x,int &tar) 
    {
        int u=s[tar].f; 
        for(int fa;(fa=s[x].f)!=u;rotate(x)) 
            if(s[fa].f!=u) rotate(get(fa)==get(x)?fa:x);  
        tar=x;   
    }
    void build(int l,int r,int &x) 
    {
        x=newnode();   
        int mid=(l+r)>>1;  
        s[x].v=val[mid];  
        if(mid>l) build(l,mid-1,lson),s[lson].f=x;  
        if(r>mid) build(mid+1,r,rson),s[rson].f=x;  
        pushup(x); 
    }  
    int getnode(int x,int kth) 
    {
        pushdown(x);  
        if(s[lson].si+1==kth) return x;  
        else if(kth<=s[lson].si) return getnode(lson,kth);   
        else return getnode(rson,kth-s[lson].si-1);   
    }
    void OP(int l,int r) 
    {
        int x=getnode(root,l);              
        int y=getnode(root,r+2);       
        splay(x,root),splay(y,s[x].ch[1]);   
        mark(s[s[x].ch[1]].ch[0]);                       
    }   
    void dfs(int x) 
    { 
        pushdown(x);  
        if(lson)  dfs(lson); 
        if(s[x].v) printf("%d ",s[x].v);     
        if(rson)  dfs(rson);  
    }
}sp;   
char *p1,*p2,buf[100000];   
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)               
int rd()  
{
    int x=0; char c=nc();   
    while(c<48) c=nc();   
    while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc();    
    return x;   
}
int main() 
{ 
    // setIO("input");  
    n=rd(),m=rd(); 
    for(int i=1;i<=n;++i) val[i]=i;      
    sp.build(0,n+1,root);       
    int l,r; 
    for(int i=1;i<=m;++i) l=rd(),r=rd(),sp.OP(l,r); 
    sp.dfs(root);  
    return 0;  
}

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值