【题目分析】

BZOJ这个题目抄的挺霸气。

主席树是第一时间想到的,但是修改又很麻烦。

看了别人的题解,原来还是可以用均摊的思想,用树状数组套主席树。

学到了新的姿势,2333o(* ̄▽ ̄*)ブ

【代码】

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>

#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <vector>
#include <iostream>
#include <queue>

using namespace std;

#define maxn 20005
#define mlog 16
#define inf (0x3f3f3f3f)

int read()
{
    int x=0,f=1; char ch=getchar();
    while (ch<'0'||ch>'9') {if (ch=='-') f=-1; ch=getchar();}
    while (ch>='0'&&ch<='9') {x=x*10+ch-'0'; ch=getchar();}
    return x*f;
}

int rt[maxn],ls[maxn*mlog*mlog],rs[maxn*mlog*mlog],siz[maxn*mlog*mlog];
int a[maxn],b[maxn],n,m,top=0,tot=0;
int opt[maxn],x[maxn],y[maxn],z[maxn],L[mlog],R[mlog];
char s[11];

void ins(int o1,int & o2,int l,int r,int x,int f)
{
//  printf("ins %d %d %d %d %d %d\n",o1,o2,l,r,x,f);
    o2=++tot;
    siz[o2]=siz[o1]+f;
    if (l==r) return ;
    int mid=(l+r)/2;
    if (x<=mid) rs[o2]=rs[o1],ins(ls[o1],ls[o2],l,mid,x,f);
    else ls[o2]=ls[o1],ins(rs[o1],rs[o2],mid+1,r,x,f);
    return ;
}

int query(int l,int r,int x)
{
//  printf("query %d %d %d\n",l,r,x);
    if (l==r) return l;
    int mid=(l+r)/2,tmp=0;
    for (int i=1;i<=L[0];++i) tmp-=siz[ls[L[i]]];
    for (int i=1;i<=R[0];++i) tmp+=siz[ls[R[i]]];
//  printf("tmp is %d\n",tmp);
    if (x<=tmp)
    {
        for (int i=1;i<=L[0];++i) L[i]=ls[L[i]];
        for (int i=1;i<=R[0];++i) R[i]=ls[R[i]];
        return query(l,mid,x);
    }
    else
    {
        for (int i=1;i<=L[0];++i) L[i]=rs[L[i]];
        for (int i=1;i<=R[0];++i) R[i]=rs[R[i]];
        return query(mid+1,r,x-tmp);
    }
}

int main()
{
    top=n=read();m=read();
    for (int i=1;i<=n;++i) b[i]=a[i]=read();
    for (int i=1;i<=m;++i)
    {
        scanf("%s",s);
        switch(s[0])
        {
            case 'Q': opt[i]=0;x[i]=read();x[i]--;y[i]=read();z[i]=read();break;
            case 'C': opt[i]=1;x[i]=read();y[i]=read();b[++top]=y[i];break;
        }
    }
    sort(b+1,b+top+1);
    top=unique(b+1,b+top+1)-b-1;
    for (int i=1;i<=n;++i) a[i]=lower_bound(b+1,b+top+1,a[i])-b;
    for (int i=1;i<=m;++i) if (opt[i]) y[i]=lower_bound(b+1,b+top+1,y[i])-b;
//  printf("lisan is OK!\n");
//  for (int i=1;i<=n;++i) printf("%d ",a[i]); printf("\n");
//  for (int i=1;i<=m;++i) printf("%d ",y[i]); printf("\n");
    for (int i=1;i<=n;++i)
    {
//      printf("ins %d %d\n",a[i],i);getchar();
        for (int j=i;j<=n;j+=j&(-j))
            ins(rt[j],rt[j],1,top,a[i],1);
    }
    for (int i=1;i<=m;++i)
    {
        if (opt[i])
        {
//          printf("fix %d to %d\n",x[i],y[i]);
            for (int j=x[i];j<=n;j+=j&(-j))
            {
                ins(rt[j],rt[j],1,top,a[x[i]],-1);
                ins(rt[j],rt[j],1,top,y[i],1);
            }
            a[x[i]]=y[i];
        }
        else
        {
//          printf("query %d %d %d \n",x[i],y[i],z[i]);
            L[0]=0; R[0]=0;
            for (int j=x[i];j;j-=j&(-j)) L[++L[0]]=rt[j];
            for (int j=y[i];j;j-=j&(-j)) R[++R[0]]=rt[j];
//          printf("L :"); for (int j=1;j<=L[0];++j) printf("%d ",L[i]);
//          printf("R :"); for (int j=1;j<=R[0];++j) printf("%d ",R[i]);
            printf("%d\n",b[query(1,top,z[i])]);
        }
    }
}

  

BZOJ 1901 Zju2112 Dynamic Rankings ——树状数组套主席树的更多相关文章

  1. P2617 Dynamic Rankings(树状数组套主席树)

    P2617 Dynamic Rankings 单点修改,区间查询第k大 当然是无脑树套树了~ 树状数组套主席树就好辣 #include<iostream> #include<cstd ...

  2. ZOJ 2112 Dynamic Rankings(树状数组套主席树 可修改区间第k小)题解

    题意:求区间第k小,节点可修改 思路:如果直接用静态第k小去做,显然我更改一个节点后,后面的树都要改,这个复杂度太高.那么我们想到树状数组思路,树状数组是求前缀和,那么我们可以用树状数组套主席树,求出 ...

  3. LUOGU P2617 Dynamic Rankings(树状数组套主席树)

    传送门 解题思路 动态区间第\(k\)大,树状数组套主席树模板.树状数组的每个位置的意思的是每棵主席树的根,维护的是一个前缀和.然后询问的时候\(log\)个点一起做前缀和,一起移动.时空复杂度\(O ...

  4. BZOJ 3196 Tyvj 1730 二逼平衡树 ——树状数组套主席树

    [题目分析] 听说是树套树.(雾) 怒写树状数组套主席树,然后就Rank1了.23333 单点修改,区间查询+k大数查询=树状数组套主席树. [代码] #include <cstdio> ...

  5. BZOJ 2141 排队(树状数组套主席树)

    解法很多的题,可以块套树状数组,可以线段树套平衡树.我用的是树状数组套主席树. 题意:给出一段数列,m次操作,每次操作是交换两个位置的数,求每次操作后的逆序对数.(n,m<=2e4). 对于没有 ...

  6. BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树

    BZOJ_3196_Tyvj 1730 二逼平衡树_树状数组套主席树 Description 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 1.查询k在区间内的排 ...

  7. [COGS257]动态排名系统 树状数组套主席树

    257. 动态排名系统 时间限制:5 s   内存限制:512 MB [问题描述]给定一个长度为N的已知序列A[i](1<=i<=N),要求维护这个序列,能够支持以下两种操作:1.查询A[ ...

  8. 洛谷P3759 [TJOI2017]不勤劳的图书管理员 【树状数组套主席树】

    题目链接 洛谷P3759 题解 树状数组套主席树板题 #include<algorithm> #include<iostream> #include<cstring> ...

  9. Codeforces Round #404 (Div. 2) E. Anton and Permutation(树状数组套主席树 求出指定数的排名)

    E. Anton and Permutation time limit per test 4 seconds memory limit per test 512 megabytes input sta ...

随机推荐

  1. 【QT】C++ GUI Qt4 学习笔记1

    Find对话框实现 平台 Qt5.3.2 MinGW4.8.2 注意创建时用QDialog finddialog.h #ifndef FINDDIALOG_H #define FINDDIALOG_H ...

  2. 【编程题目】有 4 张红色的牌和 4 张蓝色的牌,主持人先拿任意两张,再分别在 A、B、C 三人额头上贴

    第 22 题(推理):有 4 张红色的牌和 4 张蓝色的牌,主持人先拿任意两张,再分别在 A.B.C 三人额头上贴任意两张牌,A.B.C 三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什 ...

  3. 【编程题目】在 O(1)时间内删除链表结点

    60.在 O(1)时间内删除链表结点(链表.算法).题目:给定链表的头指针和一个结点指针,在 O(1)时间删除该结点.链表结点的定义如下:struct ListNode{int m_nKey;List ...

  4. python2.7之MySQLdb模块 for linux安装

    1.下载:MySQL-pythonhttp://sourceforge.net/projects/mysql-python/files/mysql-python-test/1.2.3b1/MySQL- ...

  5. [Android Pro] DES加密 version1

    reference to : http://blog.csdn.net/wfung_kwok/article/details/7766029 加密和解密要用同一個key AES: import jav ...

  6. 魔法禁书目录2:回家(codevs 3024)

    题目描述 Description 大妈打完三战回家,我知道他是怎么回来的,欧洲到日本有L个站点他决定乘坐恰好n次飞机(不是学院都市的超音速飞机)和m次火车来从第一个站点到达最后一个站点.但是有一点很重 ...

  7. 求sqrt()底层效率问题(二分/牛顿迭代)

    偶然看见一段求根的神代码,于是就有了这篇博客: 对于求根问题,通常我们可以调用sqrt库函数,不过知其然需知其所以然,我们看一下求根的方法: 比较简单方法就是二分咯: 代码: #include< ...

  8. hdu 5108 Alexandra and Prime Numbers

    数论题,本质是求出n的最大质因子 #include<time.h> #include <cstdio> #include <iostream> #include&l ...

  9. highcharts的简单使用

    在使用过的图表js插件中,个人认为还是highcharts最好,无论从兼容性,渲染速度,甚至是文档详细上来说,都一直觉得highcharts更胜一筹.现在花点时间做一下简单的总结,比如从一个矩形图开始 ...

  10. Faster-rnnlm代码分析1 - 词表构建,Nnet成员

    https://github.com/yandex/faster-rnnlm     Gdb ./rnnlm r -rnnlm model-good.faster -train thread.titl ...