1、题目大意:区间第k小,有单点修改

2、分析:这个是树状数组套线段树,也是主席树。。。。为什么主席树这么多QAQ

就是树套树的那种插入什么的,注意啊,一定要动态开内存。。不然会爆。。

然后算答案有两种算法,一种是二分答案,然后算一下,另一种就是把logn棵线段树的指针都存一下,

然后再递归找第k大的时候,我们就可以暴力枚举这些指针,别忘了维护他们

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
struct segment{
    segment *ls, *rs;
    int num;
} *root[10010], ft[11000010];
int cnt;
int a[10010];
int n, m;
inline void tree_insert(segment* &p, int l, int r, int value){
    if(p == NULL) p = &ft[cnt ++];
    if(l == r){
        p -> num ++;
        return;
    }
    int mid = (l + r) / 2;
    if(value <= mid) tree_insert(p -> ls, l, mid, value);
    else tree_insert(p -> rs, mid + 1, r, value);
    p -> num = 0;
    if(p -> ls) p -> num += p -> ls -> num;
    if(p -> rs) p -> num += p -> rs -> num;
}
inline void tree_Delete(segment* &p, int l, int r, int value){
    if(p == NULL) p = &ft[cnt ++];
    if(l == r){
        p -> num --;
        return;
    }
    int mid = (l + r) / 2;
    if(value <= mid) tree_Delete(p -> ls, l, mid, value);
    else tree_Delete(p -> rs, mid + 1, r, value);
    p -> num = 0;
    if(p -> ls) p -> num += p -> ls -> num;
    if(p -> rs) p -> num += p -> rs -> num;
}
inline int tree_lessk(segment* &p, int l, int r, int value){
    if(!p) return 0;
    if(l == r) return p -> num;
    int mid = (l + r) / 2;
    int ret = 0;
    if(value <= mid) ret += tree_lessk(p -> ls, l, mid, value);
    else {
        if(p -> ls) ret += p -> ls -> num;
        ret += tree_lessk(p -> rs, mid + 1, r, value);
    }
    return ret;
}
inline void insert(int x, int y){
    for(; x <= n; x += (x & -x))
        tree_insert(root[x], 0, 1000000000, y);
}
inline void Delete(int x, int y){
    for(; x <= n; x += (x & -x))
        tree_Delete(root[x], 0, 1000000000, y);
}
inline int lessk(int x, int y){
    int ret = 0;
    for(; x > 0; x -= (x & -x))
        ret += tree_lessk(root[x], 0, 1000000000, y);
    return ret;
}
int main(){
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++){
        scanf("%d", &a[i]);
        insert(i, a[i]);
    }
    char str[2];
    int x, y, z;
    for(int i = 1; i <= m; i ++){
        scanf("%s", str);
        scanf("%d%d", &x, &y);
        if(str[0] == 'Q'){
            scanf("%d", &z);
            int l = 0, r = 1000000000;
            while(l < r){
                int mid = (l + r) / 2;
                if(lessk(y, mid) - lessk(x - 1, mid) >= z) r = mid;
                else l = mid + 1;
            }
            printf("%d\n", l);
        }
        else{
            Delete(x, a[x]);
            a[x] = y;
            insert(x, a[x]);
        }
    }
    return 0;
} 

BZOJ1901——Zju2112 Dynamic Rankings的更多相关文章

  1. [BZOJ1901]Zju2112 Dynamic Rankings

    [BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...

  2. BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理

    1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...

  3. 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings

    谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...

  4. BZOJ1901 Zju2112 Dynamic Rankings 主席树

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...

  5. [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】

    题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...

  6. bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)

    带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀.  对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了.  3k4人AC的题#256...应该不算慢 #incl ...

  7. 【分块】bzoj1901 Zju2112 Dynamic Rankings

    区间k大,分块大法好,每个区间内存储一个有序表. 二分答案,统计在区间内小于二分到的答案的值的个数,在每个整块内二分.零散的暴力即可. 还是说∵有二分操作,∴每个块的大小定为sqrt(n*log2(n ...

  8. 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings

    论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...

  9. 【基数排序】bzoj1901 Zju2112 Dynamic Rankings

    论NOIP级别的n²算法…… 跟分块比起来,理论上十万的数据只慢4.5倍左右的样子…… #include<cstdio> #include<algorithm> using n ...

随机推荐

  1. SSH项目与SSM项目的进入首页的方法

    SSH项目中: jsp页面一般都是存放在WEB-INF下面的目录下,这样我们就不能直接访问到这些jsp页面了,保证了页面的安全性. 在struts的管理中,是利用action来实现页面的跳转,进入in ...

  2. WinForm------RepositoryItemCheckEdit属性介绍

    //去掉第三种状态 editcheck1.OptionView.NullStyle = UnChecked

  3. struts2校验总结

    struts校验框架提供两种校验:客户端校验和服务端校验.它们都是主要检查浏览器输入数据是否合法的校验器. 服务端校验 服务端校验是在服务器上检查输入数据,它的实现方法是重写validate()方法. ...

  4. Java观察者设计模式

    在java.util包中提供了Observable类和Observer接口,使用它们即可完成观察者模式. 多个观察者都在关注着价格的变化,只要价格一有变化,则所有的观察者会立即有所行动. //==== ...

  5. [Redis]通过代码配置Redis

    查看了文档https://azure.microsoft.com/en-us/documentation/articles/cache-how-to-scale/,发现可以使用代码来配置Redis,所 ...

  6. Linux下小工具使用总结

    0. 前言 这篇博客仅用于记录个人在工作中用到的一个小工具,后续用到别的会再补充. 1. Tmux 终端分用器(multiplexer),可以在一个屏幕上创建多个终端,这个工具也可以用于结对编程. 个 ...

  7. WebAPI文件上传与下载

    http://www.cnblogs.com/GarsonZhang/p/5511427.html https://github.com/GarsonZhang/FileUpLoadAPI

  8. Effective Objective-C 2.0 — 第14条:理解“类对象“的用意

    每个实例都有一个指向Class 对象的指针,用以表明其类型,而这些 Class 对象则构成了类的继承体系. 如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知. 尽量使用类型信息查询方 ...

  9. Effective Objective-C 2.0 — 第10条:在既有类中使用关联对象存放自定义数据

    可以通过“关联对象”机制来把两个对象连起来 定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”与“非拥有关系” 只有在其他做法不可行时才应选用关联对象,因为这种做法通常会引入难于 ...

  10. Orchard源码分析(4.2):Orchard.Logging.LoggingModule类

    与CollectionOrderModule一样,LoggingModule也是一个Autofac模块.它以属性注入的方式给需要日志服务的对象设置Logger.    如果一个类有Orchard.Lo ...