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. SQL总结二

    一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...

  2. Linux修改oracle 10g的字符集

    修改数据库字符集为:ZHS16GBK查看服务器端字符集SQL > select * from V$NLS_PARAMETERS修改:$sqlplus /nologSQL>conn / as ...

  3. easyUI-combotree的本地数据导入

    一.页面内容: <div style="margin:10px 0"> <a href="javascript:void(0)" class= ...

  4. JavaWeb学习笔记——开发动态WEB资源(二)HelloWord

    该工程的功能是在页面上输出一段话 首先在src里面新建一个class,在interface里面添加javax.servlet.Servlet 以下是HelloServlet.java中的代码: pac ...

  5. Linux学习笔记(一)2015.4.13

    研究生由单片机转Linux学习 首先安装VMware虚拟机,用的是VMware 10.0 在VMware 10.0上安装视频上推荐的Red Hat Linux 5 安装后正式进入Linux学习 笔记1 ...

  6. Java多线程系列

    一.参考文献 1.:Java多线程系列目录 (一) 基础篇 01. Java多线程系列--“基础篇”01之 基本概念 02. Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式 03. ...

  7. ecshop登录

    邮箱登录 a.找到function login(){} ,增加一个邮箱判断is_mail()  , b.如果通过,增读取出username , c.再通过默认的login功能 1.需要修改文件incl ...

  8. Podfile升级后的影响

    之前项目里用的Podfile都是版本 0.39 后面有一天电脑格盘重装以后cocoapods装的版本是 1.0.0.beta.6 那么问题来了,在下载或者clone一下项目后,经常是需要自己安装第三方 ...

  9. Centos 7.0查看硬盘使用情况 命令

    查看硬盘使用情况 df -hl [root@localhost ~]# df -hl文件系统         容量    已用    可用    已用%.     挂载点/dev/sda3       ...

  10. 在VS2013中强制IIS Express应用程序池使用经典模式

    直接在文件夹地址栏输入 %userprofile%\documents\iisexpress\config\applicationhost.config 会打开上边的配置文件 将 <siteDe ...