• 【无旋转treap】模板


    http://www.51nod.com/contest/problem.html#!problemId=1364

    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    #include<iostream>
    #include<vector>
    #include<ctime>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    const int MOD = 1000000007;
    typedef pair<int,int> per;
    #define mp(x,y) make_pair(x,y)
    #define lc(x) node[x].lc
    #define rc(x) node[x].rc
    #define key(x) node[x].key
    #define v(x) node[x].v
    #define sz(x) node[x].sz
    #define mx(x) node[x].mx
    #define ps(x) node[x].ps
    const int N = 300005;
    const int M = 300005;
    struct P
    {
    int lc,rc,v,sz,key,mx,ps;
    }node[M];
    int root,len;
    char s[M];
    int newnode(int v){
    int id=++len;
    lc(id)=rc(id)=0;
    ps(id)=1;
    mx(id)=v(id)=v;
    key(id)=rand();
    sz(id)=1;
    return id;
    }
    void up(int x){
    if(!x)return ;
    mx(x)=v(x);
    ps(x)=sz(lc(x))+1;
    if(mx(lc(x))>mx(x))
    {
    mx(x)=mx(lc(x));
    ps(x)=ps(lc(x));
    }
    if(mx(rc(x))>mx(x))
    {
    mx(x)=mx(rc(x));
    ps(x)=sz(lc(x))+1+ps(rc(x));
    }
    sz(x)=sz(lc(x))+sz(rc(x))+1;
    }
    per split(int x,int n){
    if(!n)return mp(0,x);
    if(sz(x)==n)return mp(x,0);
    int cnt=sz(lc(x));
    if(cnt>=n){
    per tp=split(lc(x),n);
    lc(x)=tp.second;
    up(x);
    return mp(tp.first,x);
    }
    else{
    per tp=split(rc(x),n-cnt-1);
    rc(x)=tp.first;
    up(x);
    return mp(x,tp.second);
    }
    }
    int merge(int l,int r){
    if(!l||!r)return l+r;
    if(key(l)<=key(r)){
    rc(l)=merge(rc(l),r);
    up(l);
    return l;
    }
    else{
    lc(r)=merge(l,lc(r));
    up(r);
    return r;
    }
    }
    void insert(int k,int v){
    per tp=split(root,k);
    int nw=newnode(v);
    root=merge(tp.first,nw);
    root=merge(root,tp.second);
    }
    void del(int k){
    per tp=split(root,k-1);
    per tpp=split(tp.second,1);
    root=merge(tp.first,tpp.second);
    }
    int mv;
    int wk(int L,int R){
    int rk;
    per tp=split(root,L-1);
    per tpp=split(tp.second,R-L+1);
    rk=L-1+ps(tpp.first);
    mv=mx(tpp.first);
    root=merge(tpp.first,tpp.second);
    root=merge(tp.first,root);
    return rk;
    }
    int fr;
    void dfs(int x)
    {
    if(!x)return ;
    dfs(lc(x));
    //if(fr)putchar(' ');
    //fr=1;
    printf("%d ",v(x));
    dfs(rc(x));
    }
    inline int readT(){
    int ret = 0; char c;
    while(c = getchar(), c < '0' || c > '9') ; ret = c - 48;
    while(c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + c - 48;
    return ret;
    }
    int a[N];
    int main()
    {
    srand(time(NULL));
    int n,k;
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
    {
    //scanf("%d",&a[i]);
    a[i]=readT();
    //insert(i-1,a[i]);
    int nw=newnode(a[i]);
    root=merge(root,nw);
    }
    for(int i=1;i<=n;i++)
    {
    int mx=a[i],p=i;
    int rd=min(n,i+k);
    int rk=wk(i,rd);
    //printf("i:%d k:%d rk:%d mv:%d ",i,k,rk,mv);
    if(rk==i)continue;
    del(rk);
    insert(i-1,mv);
    k-=(rk-i);
    // dfs(root);
    }
    dfs(root);
    //puts("");
    //for(int i=1;i<=n;i++)printf("%d ",a[i]);
    return 0;
    }

  • 相关阅读:
    iOS-mac下 svn的使用
    iOS-Model-View-ViewModel & ReactiveCocoa
    iOS-通过实现一个TableView来理解iOS UI编程(转)
    iOS-细说 iOS 消息推送(转)
    【原创】O2O,你真的知道怎么玩吗?
    谷歌提升虚拟运营商逼格,传统电信运营商的好日子到头?
    【技术贴】大型发布会现场的WiFi网络应该如何搭建?
    千万别把WIFI玩坏了!关于WIFI的新鲜玩法和商业模式探讨
    【深度分享】千团大战:看今天商业WiFi乱局及其破解之道
    (转)迎接 Entity Framework 7
  • 原文地址:https://www.cnblogs.com/seen1020/p/4540397.html
Copyright © 2020-2023  润新知