86WA求调
查看原帖
86WA求调
778363
Hyper_zero楼主2024/8/21 16:37
#include<bits/stdc++.h>
using namespace std;
#define L tr[u].l
#define R tr[u].r
const int N=1e5+5,INF=1e8;
struct Node{
    int l,r;
    int key,val;
    int cnt,size;
}tr[N];
int root,idx;       
void pushup(int u)  
{
    tr[u].size=tr[L].size+tr[R].size+tr[u].cnt;
}
int getNode(int key) 
{
    tr[++idx].key=key;
    tr[idx].val=rand();      
    tr[idx].cnt=tr[idx].size=1;  
    return idx;              
}
void zig(int &u)     
{
    int q=L;
    tr[u].l=tr[q].r,tr[q].r=u;
    u=q;
    pushup(R);
    pushup(u);
}
void zag(int &u)     
{
    int q=R;
    R=tr[q].l,tr[q].l=u;
    u=q;
    pushup(L);
    pushup(u);
}
void insert(int &u,int key)      
{
    if(!u) u=getNode(key);       
    else if(tr[u].key==key) tr[u].cnt++;     
    else if(tr[u].key>key)        
    {
        insert(L,key);
        if(tr[L].val>tr[u].val) zig(u);       
    }
    else         
    {
        insert(R,key);
        if(tr[R].val>tr[u].val) zag(u);
    }
    pushup(u);       
}
void remove(int &u,int key)      
{
    if(!u) return;               
    if(tr[u].key==key)
    {
        if(tr[u].cnt>1) tr[u].cnt--;  
        else if(L||R)                    
		{
            if(!R||tr[L].val>tr[R].val)   
            {
                zig(u);
                remove(R,key);
            }
            else
            {
                zag(u);
                remove(L,key);
            }
        }
        else u=0;        
    }
    else if(tr[u].key>key) remove(L,key);     
    else remove(R,key);      
    if(u) pushup(u);         
}
int kth(int &u,int key)      
{
    if(!u) return 0;         
    if(tr[u].key==key) return tr[L].size+1;      
    if(tr[u].key>key) return kth(L,key);      
    return tr[L].size+tr[u].cnt+kth(R,key);      
	}
int find(int &u,int rank)        
{
    if(!u) return INF;           
    if(tr[L].size>=rank) return find(L,rank);     
    if(tr[L].size+tr[u].cnt>=rank) return tr[u].key;  
    return find(R,rank-tr[L].size-tr[u].cnt);    
}
int getPrev(int u,int key)      
{
    if(!u) return -INF;          
    if(tr[u].key>=key) return getPrev(L,key);     
    return max(tr[u].key,getPrev(R,key));    
}
int getNext(int u,int key)
{
	if(!u)
		return INF;
	if(tr[u].key<=key) 
		return getNext(R,key);
	return min(tr[u].key,getNext(L,key));
}
int main()
{
	srand(time(0));
    int n;
    scanf("%d",&n);
    while(n--)
    {
        int op,x;
        scanf("%d %d",&op,&x);
        if(op==1) insert(root,x);            
        else if(op==2) remove(root,x);       
        else if(op==3) printf("%d\n",kth(root,x));       
        else if(op==4) printf("%d\n",find(root,x));      
        else if(op==5) printf("%d\n",getPrev(root,x)); 
		else printf("%d\n",getNext(root,x));   
    }
    return 0;
}
2024/8/21 16:37
加载中...