/ Randle /

记录详情

Accepted


  
# 状态 耗时 内存占用
#1 Accepted 3ms 364.0 KiB
#2 Accepted 4ms 376.0 KiB
#3 Accepted 4ms 360.0 KiB
#4 Accepted 84ms 2.996 MiB
#5 Accepted 86ms 2.996 MiB
#6 Accepted 89ms 3.219 MiB
#7 Accepted 73ms 2.465 MiB
#8 Accepted 92ms 3.25 MiB
#9 Accepted 91ms 1.469 MiB
#10 Accepted 89ms 3.453 MiB

代码

#include<bits/stdc++.h>
inline void read(int &a)
{
    a=0;char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9')
    {
        a=(a<<1)+(a<<3)+c-'0';
        c=getchar();
    }
}
inline void write(int a)
{
    if(a<0){a=-a;putchar('-');}
    if(a>9)write(a/10);
    putchar(a%10+'0');
}
const int maxn=300001;
int nodenum=0,root=0;
struct node
{
    int order,num,sum;
    int son[2];
    inline int comp(int x)
    { 
        if(x==num)return -1;
        if(x<num)return 0;
        return 1;
    }
    inline bool operator>(const node&a)
    {
        if(order>a.order)return true;
        return false;
    }
}p[maxn];
inline void newnode(int x)
{
    p[++nodenum].num=x;
    p[nodenum].son[0]=p[nodenum].son[1]=0;
    p[nodenum].order=rand()*rand();
    p[nodenum].sum=1;
}
inline void update(int k)
{
    p[k].sum=p[p[k].son[0]].sum+p[p[k].son[1]].sum+1;
}
inline void rotate(int &k,int d)
{
    int t=p[k].son[d];
    p[k].son[d]=p[t].son[d^1];
    p[t].son[d^1]=k;
    update(k);update(t);
    k=t;
}
inline void insert(int &k,int x)
{
    if(!k)
    {
        newnode(x);
        k=nodenum;
    }
    else
    {
        int d=p[k].comp(x);
        if(d==-1)d=0;
        insert(p[k].son[d],x);
        if(p[p[k].son[d]]>p[k])rotate(k,d);
        else update(k);
    }
}
inline void remove(int &k,int x)
{
    int d=p[k].comp(x),t;
	if(d==-1)
    {
        if(!(p[k].son[0])&&!(p[k].son[1]))
        {
            k=0;
            return ;
        }
        if(!(p[k].son[0]*p[k].son[1]))
        {
            k=p[k].son[0]+p[k].son[1];
            return ;
        }
        else
        {
            if(p[p[k].son[0]]>p[p[k].son[1]])t=0;
            else t=1;
            rotate(k,t);
            remove(p[k].son[t^1],x);
            update(k);
            return ;
        }
    }
    else
    {
        remove(p[k].son[d],x);
        update(k);
        return ;
    }
}
inline int query(int k,int x,int has)
{
    if(p[p[k].son[0]].sum+1+has==x)return p[k].num;
    if(p[p[k].son[0]].sum+1+has>x)return query(p[k].son[0],x,has);
    else return query(p[k].son[1],x,has+p[p[k].son[0] ].sum+1);
}
int main()
{
    srand(time(NULL));
    p[0].num=p[0].order=-INT_MAX;p[0].sum=0;
    int m,opt,x;
    read(m);
    while(m--)
    {
    	read(opt);read(x);
    	if(opt==1)insert(root,x);
		if(opt==2)remove(root,x);
		if(opt==3){write(query(root,x,0));printf("\n");}
	}
	return 0;
}

信息

递交者
类型
递交
题目
treap模板测试(原创)
题目数据
下载
语言
C++
递交时间
2017-12-08 18:06:20
评测时间
2017-12-08 18:06:20
评测机
分数
100
总耗时
619ms
峰值内存
3.453 MiB