zoukankan      html  css  js  c++  java
  • bzoj1056/1862 [Zjoi2006]GameZ游戏排名系统

    题目链接:1,2

    treap恶心题,不多说

      1 #include<algorithm>
      2 #include<iostream>
      3 #include<cstdlib>
      4 #include<cstring>
      5 #include<cstdio>
      6 #include<string>
      7 #include<cmath>
      8 #include<queue>
      9 #include<stack>
     10 #include<map>
     11 #include<set>
     12 #define rre(i,r,l) for(int i=(r);i>=(l);i--)
     13 #define re(i,l,r) for(int i=(l);i<=(r);i++)
     14 #define Clear(a,b) memset(a,b,sizeof(a))
     15 #define inout(x) printf("%d",(x))
     16 #define douin(x) scanf("%lf",&x)
     17 #define strin(x) scanf("%s",(x))
     18 #define LLin(x) scanf("%lld",&x)
     19 #define op operator
     20 #define CSC main
     21 typedef unsigned long long ULL;
     22 typedef const int cint;
     23 typedef long long LL;
     24 using namespace std;
     25 cint mod=985003;int n,root,sz,tot,head[mod+1];
     26 struct data1
     27 {
     28     int v,t,next;
     29     char ch[10];
     30 }hash[250001];
     31 struct data2
     32 {
     33     int l,r,v,s,rr,t;
     34     char ch[10];
     35 }tp[250001];
     36 void maintain(int k){tp[k].s=tp[tp[k].l].s+tp[tp[k].r].s+1;}
     37 void rotate2(int &k)
     38 {
     39     int t=tp[k].l;
     40     tp[k].l=tp[t].r;
     41     tp[t].r=k;tp[t].s=tp[k].s;
     42     maintain(k);k=t;
     43 }
     44 void rotate1(int &k)
     45 {
     46     int t=tp[k].r;
     47     tp[k].r=tp[t].l;
     48     tp[t].l=k;
     49     tp[t].s=tp[k].s;
     50     maintain(k);k=t;
     51 }
     52 bool com(char *a,char *b)
     53 {
     54     for(int i=1;i<(int)max(strlen(a),strlen(b));i++)
     55         if(a[i]!=b[i])return 0;
     56     return 1;
     57 }
     58 int HASH(char *ch)
     59 {
     60     int s=0; 
     61     for(int i=1;i<(int)strlen(ch);i++)
     62     {
     63         s*=27;s+=(ch[i]-'A'+1);
     64         s%=mod;
     65     }
     66     return s;
     67 }
     68 void del(int &k,int x,int t)
     69 {
     70     if(tp[k].v==x)
     71     {
     72         if(tp[k].t==t)
     73         {
     74             if(tp[k].l*tp[k].r==0)k=tp[k].l+tp[k].r;
     75             else if(tp[tp[k].l].rr<tp[tp[k].r].rr){rotate2(k);del(k,x,t);}
     76             else {rotate1(k);del(k,x,t);}
     77         }
     78         else if(t>tp[k].t){tp[k].s--;del(tp[k].l,x,t);}
     79         else {tp[k].s--;del(tp[k].r,x,t);}
     80     }
     81     else if(x<tp[k].v){tp[k].s--;del(tp[k].l,x,t);}
     82     else {tp[k].s--;del(tp[k].r,x,t);}
     83  }
     84 void add(int &k,char *ch,int x,int t)
     85 {
     86     if(k==0)
     87     {
     88         sz++;k=sz;tp[k].v=x;tp[k].s=1;tp[k].rr=rand();
     89         memcpy(tp[k].ch,ch,strlen(ch));tp[k].t=t;
     90         return;
     91     }
     92     tp[k].s++;
     93     if(x<=tp[k].v){add(tp[k].l,ch,x,t);if(tp[tp[k].l].rr<tp[k].rr)rotate2(k);}
     94     else{add(tp[k].r,ch,x,t);if(tp[tp[k].r].rr<tp[k].rr)rotate1(k);}
     95  }
     96 void add(char *ch,int x,int t)
     97 {
     98     int k=HASH(ch);int i=head[k];
     99     while(i)
    100     {
    101         if(com(hash[i].ch,ch))
    102         {
    103             del(root,hash[i].v,hash[i].t);
    104             hash[i].t=t;hash[i].v=x;
    105             add(root,ch,x,t);
    106             return;
    107         }
    108         i=hash[i].next;
    109     }
    110     tot++;
    111     hash[tot].t=t;hash[tot].v=x;
    112     memcpy(hash[tot].ch,ch,strlen(ch));
    113     hash[tot].next=head[k];head[k]=tot;
    114     add(root,ch,x,t);
    115 }
    116 int hh(char *ch)
    117 {
    118     int k=HASH(ch);int i=head[k];
    119     while(i)
    120     {
    121         if(com(hash[i].ch,ch))return i;
    122         i=hash[i].next;
    123     }return 0;
    124 }
    125 int findrank(int k,int x,int t)
    126 {
    127     if(k==0)return 0;
    128     if(tp[k].v==x)
    129     {
    130         if(tp[k].t>t)return findrank(tp[k].r,x,t);
    131         else if(tp[k].t<t)return 1+tp[tp[k].r].s+findrank(tp[k].l,x,t);
    132         else return tp[tp[k].r].s+1;
    133     }
    134     else if(tp[k].v<x)return findrank(tp[k].r,x,t);
    135     else return 1+tp[tp[k].r].s+findrank(tp[k].l,x,t);
    136 }
    137 void query1(char *ch)
    138 {
    139     int t=hh(ch);
    140     printf("%d
    ",findrank(root,hash[t].v,hash[t].t));
    141 }
    142 int findwei(int k,int x)
    143 {
    144     if(tp[tp[k].r].s+1==x)return k;
    145     else if(x<=tp[tp[k].r].s)return findwei(tp[k].r,x);
    146     else return findwei(tp[k].l,x-tp[tp[k].r].s-1);
    147 }
    148 void query2(char *ch)
    149 {
    150     int s=0;
    151     for(int i=1;i<(int)strlen(ch);i++){s*=10;s+=ch[i]-'0';}
    152     for(int i=s;i<=tot&&i<=s+9;i++)
    153     {
    154         printf("%s",tp[findwei(root,i)].ch+1);
    155         if(i<tot&&i<s+9)printf(" ");
    156     }
    157     printf("
    ");
    158 }
    159 int CSC()
    160 {
    161     scanf("%d",&n);char ch[11];int x;
    162     for(int i=1;i<=n;i++)
    163     {
    164         scanf("%s",ch);
    165         if(ch[0]=='+'){scanf("%d",&x);add(ch,x,i);}
    166         else if(ch[1]>='A'&&ch[1]<='Z')query1(ch);
    167         else query2(ch);
    168     }
    169     return 0;
    170 }
  • 相关阅读:
    SpannaleString总结
    【未完成】bug记录2013427>import工程时出现Build path contains duplicate entry:'src' for project 'XXX'
    【未完成】给eclipse项目改名
    android创建和删除桌面快捷方式
    bug记录2013426(2)>Select at least one project错误
    hosts配置
    获取当前应用的版本号及android系统版本号及手机型号
    转载:如何将offcie 2003文档(.doc、.xls、.ppt)转换成mht文档
    转载:.NET2.0 验证控件常用的正则表达式
    转载: RESTORE DATABASE命令还原SQLServer 2005 数据库
  • 原文地址:https://www.cnblogs.com/HugeGun/p/5201945.html
Copyright © 2011-2022 走看看