• zoj 2112 Dynamic Rankings


    bzoj1901

      1 #include<bits/stdc++.h>
      2 #define N 200005
      3 #define LL long long
      4 #define inf 0x3f3f3f3f
      5 using namespace std;
      6 inline int ra()
      7 {
      8     int x=0,f=1; char ch=getchar();
      9     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
     10     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
     11     return x*f;
     12 }
     13 const int M=1300001;
     14 int T,n,m,tmp;
     15 int a[50001],root[N];
     16 int sz,s[M],ls[M],rs[M],v[M],w[M],rnd[M];
     17 void update(int k){s[k]=s[ls[k]]+s[rs[k]]+w[k];}
     18 void rturn(int &k){int t=ls[k]; ls[k]=rs[t]; rs[t]=k; s[t]=s[k]; update(k); k=t;}
     19 void lturn(int &k){int t=rs[k]; rs[k]=ls[t]; ls[t]=k; s[t]=s[k]; update(k); k=t;}
     20 void insert(int &k, int num)
     21 {
     22     if (!k){
     23         k=++sz; s[k]=w[k]=1; rnd[k]=rand(); ls[k]=rs[k]=0; v[k]=num; return;
     24     }
     25     s[k]++;
     26     if (v[k]==num) w[k]++;
     27     else if (num<v[k]) {insert(ls[k],num); if (rnd[ls[k]]<rnd[k]) rturn(k);}
     28     else {insert(rs[k],num); if (rnd[rs[k]]<rnd[k]) lturn(k);}
     29 }
     30 void del(int &k, int num)
     31 {
     32     if (v[k]==num)
     33     {
     34         if (w[k]>=1) {w[k]--; s[k]--; return;}
     35         if (ls[k]*rs[k]==0) k=ls[k]+rs[k];
     36         else if (rnd[ls[k]]<rnd[rs[k]]) {rturn(k); del(k,num);}
     37         else {lturn(k); del(k,num);}
     38     }
     39     else if (num<v[k]) del(ls[k],num),s[k]--;
     40     else del(rs[k],num),s[k]--;
     41 }
     42 void change(int k, int l, int r, int x, int num, int y)
     43 {
     44     del(root[k],y);
     45     insert(root[k],num);
     46     if (l==r) return;
     47     int mid=l+r>>1;
     48     if (x<=mid) change(k<<1,l,mid,x,num,y);
     49     else change(k<<1|1,mid+1,r,x,num,y);
     50 }
     51 void build(int k, int l, int r, int x, int num)
     52 {
     53     insert(root[k],num);
     54     if (l==r) return;
     55     int mid=l+r>>1;
     56     if (x<=mid) build(k<<1,l,mid,x,num);
     57     else  build(k<<1|1,mid+1,r,x,num);
     58 }
     59 void find(int k, int num)
     60 {
     61     if (!k) return ;
     62     if (v[k]<=num) {tmp+=s[ls[k]]+w[k]; find(rs[k],num);}
     63     else find(ls[k],num);
     64 }
     65 void query(int k, int l, int r, int x, int y, int num)
     66 {
     67     if (l==x && y==r) {
     68         find(root[k],num);
     69         return;
     70     }
     71     int mid=l+r>>1;
     72     if (y<=mid) query(k<<1,l,mid,x,y,num);
     73     else if (x>mid) query(k<<1|1,mid+1,r,x,y,num);
     74     else query(k<<1,l,mid,x,mid,num),query(k<<1|1,mid+1,r,mid+1,y,num);
     75 }
     76 int main()
     77 {
     78     int T=ra();
     79     while (T--)
     80     {
     81         memset(root,0,sizeof(root)); sz=0;
     82         n=ra(); m=ra();
     83         for (int i=1; i<=n; i++) a[i]=ra();
     84         for (int i=1; i<=n; i++) build(1,1,n,i,a[i]);
     85         for (int i=1; i<=m; i++)
     86         {
     87             char s[3]; scanf("%s",s);
     88             if (s[0]=='C')
     89             {
     90                 int x=ra(),y=ra();
     91                 change(1,1,n,x,y,a[x]);
     92                 a[x]=y;
     93             }
     94             else 
     95             {
     96                 int x=ra(),y=ra(),z=ra();
     97                 int l=0,r=1000000000;
     98                 while (l<=r)
     99                 {
    100                     int mid=(l+r)>>1;
    101                     tmp=0; query(1,1,n,x,y,mid);
    102                     if (tmp>=z) r=mid-1;
    103                     else l=mid+1;
    104                 }
    105                 printf("%d
    ",l);
    106             }
    107             //system("pause");
    108         }
    109     }
    110     return 0;
    111 }
  • 相关阅读:
    设计模式(行为模式)之 观察者模式
    java 内存区域 (程序计数器)
    java 枚举的应用
    ServiceLoad 应用(链式编程:统一执行某一类功能、、分支语句优化)
    python前端学习之css
    python学习四十四天(前端之HTML标签)
    python学习四十三天(网络IO模型)
    python学习四十二天(协程)
    python学习四十一天(线程)
    python学习四十天(进程池)
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6481046.html
Copyright © 2020-2023  润新知