BZOJ 1862: [Zjoi2006]GameZ游戏排名系统 Hash + Splay

Code:

#include <cstdio>
#include <cstring>  
#include <algorithm> 
#include <map>       
#define N 300002 
#define mod 1000000009
#define ll long long   
#define lson t[x].ch[0] 
#define rson t[x].ch[1] 
#define setIO(s) freopen(s".in", "r", stdin) 
using namespace std;   
map<int, int> id;              
char S[N][12];                       
int sta[N], pos[N], tot , root, cc = 0, splay_cnt;    
struct Node 
{
    int ch[2] , siz, f; 
    ll val;    
}t[N]; 
inline int decode(char str[]) 
{
    int k = strlen(str + 1), i , j ; 
    ll h = 1; 
    for(i = 1; i <= k ; ++i) h = (h * 26 + str[i] - 'A') % mod;       
    return (int) h ;  
}
inline int get(char str[]) 
{
    int k = strlen(str + 1), i , j = 0;      
    for(i = 1; i <= k ; ++i) j = j * 10 + str[i] - '0';             
    return j ; 
}      
inline void pushup(int x) 
{
    t[x].siz = t[lson].siz + t[rson].siz + 1; 
} 
inline int get(int x) 
{
    return t[t[x].f].ch[1] == x;      
}
inline void rotate(int x) 
{
    int old = t[x].f, fold = t[old].f , which = get(x); 
    t[old].ch[which] = t[x].ch[which ^ 1], t[t[old].ch[which]].f = old;    
    t[x].ch[which ^ 1] = old, t[old].f = x, t[x].f = fold; 
    if(fold) t[fold].ch[t[fold].ch[1] == old] = x;   
    pushup(old), pushup(x);   
}
inline void splay(int x, int &tar) 
{
    int u = t[tar].f;     
    for(int fa ; (fa = t[x].f) ^ u ; rotate(x)) 
        if(t[fa].f ^ u) 
            rotate(get(fa) == get(x) ? fa : x); 
    tar = x; 
}
inline void insert(int &x, int ff, ll v) 
{
    if(!x) 
    {
        x = ++ tot; 
        t[x].f = ff, t[x].val = v; 
        pushup(x); 
        return ; 
    }
    insert(t[x].ch[v <= t[x].val], x , v), pushup(x);    
}  
inline int get_kth(int k) 
{                   
    int x = root;       
    while(1) 
    { 
        if(k > t[lson].siz) 
        {
            k -= (t[lson].siz + 1);        
            if(!k) return x ; 
            else x = rson;      
        }
        else x = lson; 
    }
} 
inline void print(int i) 
{
    int L = strlen(S[i] + 1), j ; 
    for(j = 1; j <= L; ++j) printf("%c", S[i][j]);      
}
inline void dfs(int u) 
{
    if(!u) return ; 
    if(t[u].ch[0]) dfs(t[u].ch[0]);     
    print(pos[u]), printf(" ");    
    if(t[u].ch[1]) dfs(t[u].ch[1]);        
}
inline void del(int x) 
{
    splay(x, root);     
    if(!lson) root = rson, t[root].f = 0;   
    else if(!rson) root = lson, t[root].f = 0; 
    else 
    {
        int p = lson;  
        while(t[p].ch[1]) p = t[p].ch[1];  
        splay(p, t[root].ch[0]), t[p].ch[1] = t[root].ch[1], t[p].f = 0, t[t[root].ch[1]].f = p, pushup(p), root = p;   
    }
    t[x].ch[0] = t[x].ch[1] = 0;      
}
int main() 
{
    // setIO("input");     
    int T, i , j ; 
    scanf("%d", &T); 
    for(int cas = 1; cas <= T; ++cas)  
    {
        char str[20]; 
        scanf("%s", str); 
        if(str[0] == '+')
        {          
            j = strlen(str + 1);    
            for(i = 1; i <= j ; ++i) S[cas][i] = str[i];        
            int h = decode(str);
            ll v;     
            scanf("%lld", &v), ++cc, ++splay_cnt;  
            if(id[h]) del(id[h]), --cc; 
            insert(root , 0 , v), id[h] = tot, pos[tot] = cas; 
            if(splay_cnt % 6 == 0) splay(tot, root); 
        }
        else 
        {
            if(str[1] >= '0' && str[1] <= '9')     // (好头疼qaq)     
            {
                int kth = get(str);                       
                int p = get_kth(kth);    
                int now, c; 
                splay(p, root), print(pos[p]), printf(" ");               
                if(kth + 10 - 1 < cc) c = get_kth(kth + 10), splay(c, t[root].ch[1]), now = t[t[root].ch[1]].ch[0];   
                else now = t[root].ch[1];    
                dfs(now), printf("\n");            
            }
            else 
            {
                int h = decode(str);
                splay(id[h], root), printf("%d\n", t[t[root].ch[0]].siz + 1);    
            }
        }
    }    
    return 0; 
}

  

posted @ 2019-03-02 16:36  EM-LGH  阅读(170)  评论(0编辑  收藏  举报