• 多校10 1007 CRB and Queries


    CRB and Queries

    Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)
    Total Submission(s): 3233    Accepted Submission(s): 148


    Problem Description
    There are N boys in CodeLand.
    Boy i has his coding skill Ai.
    CRB wants to know who has the suitable coding skill.
    So you should treat the following two types of queries.
    Query 1: 1 l v
    The coding skill of Boy l has changed to v.
    Query 2: 2 l r k
    This is a report query which asks the k-th smallest value of coding skill between Boy l and Boy r(both inclusive).
     
    Input
    There are multiple test cases. 
    The first line contains a single integer N.
    Next line contains N space separated integers A1A2, …, AN, where Ai denotes initial coding skill of Boy i.
    Next line contains a single integer Q representing the number of queries.
    Next Q lines contain queries which can be any of the two types.
    1 ≤ NQ ≤ 105
    1 ≤ Aiv ≤ 109
    1 ≤ l ≤ r ≤ N
    1 ≤ k ≤ r  l + 1

     
    Output
    For each query of type 2, output a single integer corresponding to the answer in a single line.
     
    Sample Input
    5 1 2 3 4 5 3 2 2 4 2 1 3 6 2 2 4 2
     
    Sample Output
    3 4
      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstdlib>
      4 #include <cmath>
      5 #include <cstring>
      6 
      7 using namespace std;
      8 
      9 struct treap_node
     10 {
     11     treap_node *left,*right;
     12     int v,fix,size,weight;
     13     inline int lsize() {return left ?left ->size:0;}
     14     inline int rsize() {return right?right->size:0;}
     15 };
     16 
     17 struct sgt_node
     18 {
     19     sgt_node *left,*right;
     20     int a,b;
     21     treap_node *treap;
     22 };
     23 
     24 const int MAXN=100000,MAXM=100000,INF=0x7FFFFFFF/2;
     25 const int MAXTN=(MAXN+MAXM)*16,MAXSN=MAXN*2;
     26 treap_node TS[MAXTN];
     27 sgt_node SS[MAXSN];
     28 int D,N,M,TC,SC,Tcnt;
     29 sgt_node *sgt_root;
     30 treap_node *T[MAXN];
     31 
     32 inline treap_node* new_treap_node(int v)
     33 {
     34     TS[++TC].v=v;
     35     TS[TC].left=TS[TC].right=0;
     36     TS[TC].size=TS[TC].weight=1;
     37     TS[TC].fix=rand();
     38     return &TS[TC];
     39 }
     40 
     41 inline void treap_rotate_right(treap_node *&p)
     42 {
     43     treap_node *q=p->left;
     44     p->left=q->right;
     45     q->right=p;
     46     p=q;
     47     q=p->right;
     48     q->size=q->lsize() + q->rsize() +q->weight;
     49     p->size=p->lsize() + p->rsize() +p->weight;
     50 }
     51 
     52 inline void treap_rotate_left(treap_node *&p)
     53 {
     54     treap_node *q=p->right;
     55     p->right=q->left;
     56     q->left=p;
     57     p=q;
     58     q=p->left;
     59     q->size=q->lsize() + q->rsize() +q->weight;
     60     p->size=p->lsize() + p->rsize() +p->weight;
     61 }
     62 
     63 int treap_find(treap_node *p,int v)
     64 {
     65     if (!p)
     66         return 0;
     67     else if (v<p->v)
     68         return treap_find(p->left,v);
     69     else if (v>p->v)
     70         return treap_find(p->right,v);
     71     else
     72         return p->weight;
     73 }
     74 
     75 void treap_insert(treap_node *&p,int v)
     76 {
     77     if (!p)
     78         p=new_treap_node(v);
     79     else
     80     {
     81         p->size++;
     82         if (v < p->v)
     83         {
     84             treap_insert(p->left,v);
     85             if (p->left->fix < p->fix)
     86                 treap_rotate_right(p);
     87         }
     88         else if (v > p->v)
     89         {
     90             treap_insert(p->right,v);
     91             if (p->right->fix < p->fix)
     92                 treap_rotate_left(p);
     93         }
     94         else
     95             p->weight++;
     96     }
     97 }
     98 
     99 void treap_delete(treap_node *&p) //real deletion
    100 {
    101     if (p->left && p->right)
    102     {
    103         if (p->left->fix < p->right->fix)
    104         {
    105             treap_rotate_right(p);
    106             treap_delete(p->right);
    107         }
    108         else
    109         {
    110             treap_rotate_left(p);
    111             treap_delete(p->left);
    112         }
    113     }
    114     else
    115     {
    116         if (p->left)
    117             p=p->left;
    118         else
    119             p=p->right;
    120     }
    121 }
    122 
    123 void treap_delete(treap_node *&p,int v) //lazy deletion
    124 {
    125     if (v==p->v)
    126     {
    127         p->weight--;
    128         p->size--;
    129         if (p->weight==0)
    130             treap_delete(p);
    131     }
    132     else
    133     {
    134         if (v < p->v)
    135             treap_delete(p->left,v);
    136         else
    137             treap_delete(p->right,v);
    138         p->size--;
    139     }
    140 }
    141 
    142 void treap_succ(treap_node *p,int v,int &rs)
    143 {
    144     if (!p) return;
    145     if (p->v >= v)
    146     {
    147         rs=p->v;
    148         treap_succ(p->left,v,rs);
    149     }
    150     else
    151         treap_succ(p->right,v,rs);
    152 }
    153 
    154 int treap_getmin(treap_node *p)
    155 {
    156     while (p->left)
    157         p=p->left;
    158     return p->v;
    159 }
    160 
    161 int treap_getmax(treap_node *p)
    162 {
    163     while (p->right)
    164         p=p->right;
    165     return p->v;
    166 }
    167 
    168 void treap_rank(treap_node *p,int v,int cur,int &rank)
    169 {
    170     if (v == p->v)
    171         rank=p->lsize() + cur + 1;
    172     else if (v < p->v)
    173         treap_rank(p->left,v,cur,rank);
    174     else
    175         treap_rank(p->right,v,p->lsize() + cur + p->weight,rank);
    176 }
    177 
    178 inline sgt_node* new_sgt_node()
    179 {
    180     SS[++SC].treap=0;
    181     SS[SC].a=SS[SC].b=0;
    182     SS[SC].left=SS[SC].right=0;
    183     return &SS[SC];
    184 }
    185 
    186 void sgt_build(sgt_node *&p,int a,int b)
    187 {
    188     p=new_sgt_node();
    189     if (a==b)
    190         p->a=p->b=a;
    191     else
    192     {
    193         int m=(a+b) >> 1;
    194         sgt_build(p->left,a,m);
    195         sgt_build(p->right,m+1,b);
    196         p->a=a;p->b=b;
    197     }
    198 }
    199 
    200 int sgt_edit(sgt_node *p,int k,int v,bool del)
    201 {
    202     int delter=0;
    203     if (p->a==p->b)
    204     {
    205         if (del)
    206             delter=p->treap->v;
    207     }
    208     else
    209     {
    210         int m=(p->a+p->b) >> 1;
    211         if (k>=p->a && k<=m)
    212             delter=sgt_edit(p->left,k,v,del);
    213         else
    214             delter=sgt_edit(p->right,k,v,del);
    215     }
    216     if (del)
    217         treap_delete(p->treap,delter);
    218     treap_insert(p->treap,v);
    219     return delter;
    220 }
    221 
    222 void sgt_get(sgt_node *p,int a,int b)
    223 {
    224     if (p->a==a && p->b==b)
    225         T[++Tcnt]=p->treap;
    226     else
    227     {
    228         int m=(p->a+p->b) >> 1;
    229         if (b<=m)
    230             sgt_get(p->left,a,b);
    231         else if (a>=m+1)
    232             sgt_get(p->right,a,b);
    233         else
    234         {
    235             sgt_get(p->left,a,m);
    236             sgt_get(p->right,m+1,b);
    237         }
    238     }
    239 }
    240 
    241 
    242 int check(int result,int k)
    243 {
    244     int totalrankL,totalrankR,minsucc=INF;
    245     int i,rank,succ,totalrank=0,totalcount=0;
    246     for (i=1;i<=Tcnt;i++)
    247     {
    248         succ=INF;
    249         treap_succ(T[i],result,succ);
    250         if (succ==INF)
    251             rank=T[i]->size+1;
    252         else
    253             treap_rank(T[i],succ,0,rank);
    254         totalrank+=rank-1;
    255         if (succ < minsucc)
    256             minsucc=succ;
    257     }
    258     for (i=1;i<=Tcnt;i++)
    259         totalcount+=treap_find(T[i],minsucc);
    260     totalrankL=++totalrank;
    261     totalrankR=totalrank+totalcount-1;
    262     if (k>=totalrankL && k<=totalrankR)
    263     {
    264         printf("%d
    ",minsucc);
    265         return 0;
    266     }
    267     else if (totalrankL > k)
    268         return 1;
    269     else
    270         return -1;
    271 }
    272 
    273 void binary(int a,int b,int k)
    274 {
    275     int Min=INF,Max=0,i,m,r;
    276     Tcnt=0;
    277     sgt_get(sgt_root,a,b);
    278     for (i=1;i<=Tcnt;i++)
    279     {
    280         m=treap_getmax(T[i]);
    281         if (m>Max)
    282             Max=m;
    283         m=treap_getmin(T[i]);
    284         if (m<Min)
    285             Min=m;
    286     }
    287     m=(Max+Min)>>1;
    288     do
    289     {
    290         r=check(m,k); //-1=smaller 1=bigger
    291         if (r<0)
    292         {
    293             Min=m;
    294             m=(m+Max+1)>>1;
    295         }
    296         else if (r>0)
    297         {
    298             Max=m;
    299             m=(Min+m)>>1;
    300         }
    301     }while (r!=0);
    302 }
    303 
    304 void request()
    305 {
    306     scanf ("%d", &M);
    307     int i,a,b,c,j=0;
    308     int op;
    309     for (i=1;i<=M;i++)
    310     {
    311         scanf ("%d", &op);
    312         if (op == 1)
    313         {
    314             scanf("%d%d",&a,&b);
    315             sgt_edit(sgt_root,a,b,true);
    316         }
    317         else
    318         {
    319             scanf("%d%d%d",&a,&b,&c);
    320             binary(a,b,c);
    321         }
    322     }
    323 }
    324 
    325 int main()
    326 {
    327     while (scanf ("%d", &N) == 1)   {
    328         int i,v;
    329         TC=SC=-1;
    330         sgt_root=0;
    331         sgt_build(sgt_root,1,N);
    332         for (i=1;i<=N;i++)
    333         {
    334             scanf("%d",&v);
    335             sgt_edit(sgt_root,i,v,false); //non-deletion
    336         }
    337         request();
    338     }
    339 
    340     return 0;
    341 }
    View Code
  • 相关阅读:
    叩开抽象的大门(2)——依赖于抽象
    威老迷宫探险第二季如何更面向对象
    更佳的封装之路面向对象的封装思想
    威老的迷宫探险
    重用,我要重用!!!
    威老出国记,什么是引用,别名。
    叩开抽象的大门(1)——抽象类、接口
    maven常用命令
    大公司喜欢问的问题
    java 发送http请求
  • 原文地址:https://www.cnblogs.com/cyd308/p/4771400.html
Copyright © 2020-2023  润新知