POJ2761Feed the dogs (treap)

来源:互联网 发布:苹果怎么授权给软件 编辑:程序博客网 时间:2024/05/31 05:28

刚开始学treapA的第一个题,虽然是模板题,但是还是查了好久的错。而且这个题,用cin和cout输入输出会T

#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#include <cstdlib>using namespace std;const int maxn=100000+100;const int maxm=50000+500;struct Query{    int L,R,k,id;    bool operator <(const Query &rhs)const{        return L<rhs.L;    }}q[maxm];int n,m;int a[maxn];int ans[maxm];struct Node {    Node* ch[2];    int v,r,s;    int cmp(int x)const{        if(x==v)return -1;        return x<v?0:1;    }    void maintain(){        s=1;        if(ch[0]!=NULL)            s+=ch[0]->s;        if(ch[1]!=NULL)            s+=ch[1]->s;    }    Node(int v):v(v){        r=rand();s=1;        ch[0]=NULL;ch[1]=NULL;    }};void rorate(Node* &o,int d){//d=0左旋1右旋    Node *k=o->ch[d^1];o->ch[d^1]=k->ch[d];k->ch[d]=o;    o->maintain();k->maintain();o=k;}void insert(Node* &o,int x){    if(o==NULL){        o=new Node(x);    }else{    int d=(x<o->v?0:1);    insert(o->ch[d],x);    if(o->r < o->ch[d]->r)        rorate(o,d^1);    }    o->maintain();}void remove(Node* &o,int x){    int d=o->cmp(x);    if(d==-1){        Node *u=o;        if(o->ch[0]!=NULL&&o->ch[1]!=NULL){            int d2=(o->ch[0]->r<o->ch[1]->r?0:1);            rorate(o,d2);remove(o->ch[d2],x);        }else{            if(o->ch[0]==NULL)o=o->ch[1];else o=o->ch[0];            delete u;        }    }else    {        remove(o->ch[d],x);    }    if(o!=NULL)o->maintain();}int kth(Node *o,int k){    if(o==NULL||k<=0||k>o->s)return 0;    int s=(o->ch[1]==NULL)?0:o->ch[1]->s;    if(k==s+1)return o->v;    else if(k<=s)return kth(o->ch[1],k);    else return kth(o->ch[0],k-s-1);}Node* root=NULL;int main(){    scanf("%d%d",&n,&m);    for(int i=1;i<=n;i++)scanf("%d",&a[i]);    for(int i=1;i<=m;i++){        scanf("%d%d%d",&q[i].L,&q[i].R,&q[i].k);        q[i].id=i;    }    sort(q+1,q+1+m);    int L=1,R=1;    for(int i=1;i<=m;i++){        while(L<q[i].L){            if(L<R)remove(root,a[L]);            L++;        }        if(R<L) R=L;        while(R<=q[i].R){            insert(root,a[R]);            R++;        }        ans[q[i].id]=kth(root,R-L-q[i].k+1);    }    for(int i=1;i<=m;i++)        printf("%d\n",ans[i]);return 0;}

原创粉丝点击