• bzoj 1901: Zju2112 Dynamic Rankings


    新姿势,,这真是神题啊,用这道题研究的线段树套平衡树,然后又围观了树状数组套主席树,各种涨姿势2333

    说一下树状数组套主席树吧。

    对于树状数组的每个节点维护一个主席树,然后查询就是把普通主席树的查询改成在树状数组上,每一次查询lowbit,加起来就好了2333,修改也是一样的。

      1 #include<bits/stdc++.h>
      2 #define N 100005
      3 #define M 10000005
      4 #define LL long long
      5 #define inf 0x3f3f3f3f
      6 #define lowbit(x) x&(-x) 
      7 using namespace std;               //(zoj2112)
      8 inline int ra()
      9 {
     10     int x=0,f=1; char ch=getchar();
     11     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
     12     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
     13     return x*f;
     14 }
     15 int n,m,tot,top,sz;
     16 int v[10001],num[20001],hash[20001];
     17 int flag[10001],A[10001],B[10001],K[10001],root[10001];
     18 int sum[2200001],ls[2200001],rs[2200001];
     19 int L[30],R[30],a,b;
     20 int find(int x)
     21 {
     22     int l=1,r=tot,mid;
     23     while (l<=r)
     24     {
     25         int mid=l+r>>1;
     26         if (hash[mid]<x) l=mid+1;
     27         else r=mid-1;
     28     }
     29     return l;
     30 }
     31 void update(int last, int l, int r, int &rt, int w, int x)
     32 {
     33     rt=++sz; 
     34     sum[rt]=sum[last]+x;
     35     if (l==r) return;
     36     ls[rt]=ls[last]; rs[rt]=rs[last];
     37     int mid=l+r>>1;
     38     if (w<=mid) update(ls[last],l,mid,ls[rt],w,x);
     39     else update(rs[last],mid+1,r,rs[rt],w,x);
     40 }
     41 int query(int l, int r, int k)
     42 {
     43     if (l==r) return l;
     44     int suml=0,sumr=0;
     45     for (int i=1; i<=a; i++) suml+=sum[ls[L[i]]];
     46     for (int i=1; i<=b; i++) sumr+=sum[ls[R[i]]];
     47     int mid=l+r>>1;
     48     if (sumr-suml>=k)
     49     {
     50         for (int i=1; i<=a; i++) L[i]=ls[L[i]];
     51         for (int i=1; i<=b; i++) R[i]=ls[R[i]];
     52         return query(l,mid,k);
     53     }
     54     else
     55     {
     56         for (int i=1; i<=a; i++) L[i]=rs[L[i]];
     57         for (int i=1; i<=b; i++) R[i]=rs[R[i]];
     58         return query(mid+1,r,k-(sumr-suml));
     59     }
     60 }
     61 int main()
     62 {
     63     n=ra(); m=ra();
     64     for (int i=1; i<=n; i++)
     65         v[i]=ra(),num[++top]=v[i];
     66     for (int i=1; i<=m; i++)
     67     {
     68         char s[3]; scanf("%s",s);
     69         A[i]=ra(); B[i]=ra();
     70         if (s[0]=='Q') K[i]=ra(),flag[i]=1;
     71             else num[++top]=B[i];
     72     }
     73     sort(num+1,num+top+1);
     74     hash[++tot]=num[1];
     75     for (int i=2; i<=top; i++)
     76         if (num[i]!=num[i-1])
     77             hash[++tot]=num[i];
     78     for (int i=1; i<=n; i++)
     79     {
     80         int t=find(v[i]);
     81         for (int j=i; j<=n; j+=lowbit(j))
     82             update(root[j],1,tot,root[j],t,1);
     83     }
     84     for (int i=1; i<=m; i++)
     85         if (flag[i])
     86         {
     87             a=0,b=0; A[i]--;
     88             for (int j=A[i]; j>0; j-=lowbit(j))
     89                 L[++a]=root[j];
     90             for (int j=B[i]; j>0; j-=lowbit(j))
     91                 R[++b]=root[j];
     92             printf("%d
    ",hash[query(1,tot,K[i])]);
     93         }
     94         else
     95         {
     96             int t=find(v[A[i]]);
     97             for (int j=A[i]; j<=n; j+=lowbit(j))
     98                 update(root[j],1,tot,root[j],t,-1);
     99             v[A[i]]=B[i];
    100             t=find(B[i]);
    101             for (int j=A[i]; j<=n; j+=lowbit(j))
    102                 update(root[j],1,tot,root[j],t,1);
    103         }
    104         return 0;
    105 }
  • 相关阅读:
    【C语言程序设计】C语言回文数怎么求?
    今天又要加班了,谁叫我是程序员!
    【编程入门】C语言字符串的加密和解密算法!
    某程序员吐槽:媳妇要给孩子报少儿编程班,将来继续做程序员!自己拿命换钱,难道后代也要继续拿命换钱?
    Linux 误删文件恢复命令及方法!
    后端程序员的成长之路:从菜鸟到架构!
    C语言基础教程 之 如何定义变量!
    程序员如何知晓自己被绿?在网上,面对黑客男朋友的你将毫无秘密可言!
    【编程书库】入门+进阶C语言,这几本就够了!
    【C语言笔记】ASCII码可见字符与不可见字符!
  • 原文地址:https://www.cnblogs.com/ccd2333/p/6426307.html
Copyright © 2020-2023  润新知