BZOJ1901——Zju2112 Dynamic Rankings
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的更多相关文章
- [BZOJ1901]Zju2112 Dynamic Rankings
[BZOJ1901]Zju2112 Dynamic Rankings 试题描述 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i ...
- BZOJ-1901 Zju2112 Dynamic Rankings 函数式线段树 套 树状数组+离线处理
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MB Submit: 6058 Solved: 2521 [Su ...
- 【树状数组套权值线段树】bzoj1901 Zju2112 Dynamic Rankings
谁再管这玩意叫树状数组套主席树我跟谁急 明明就是树状数组的每个结点维护一棵动态开结点的权值线段树而已 好吧,其实只有一个指针,指向该结点的权值线段树的当前结点 每次查询之前,要让指针指向根结点 不同结 ...
- BZOJ1901 Zju2112 Dynamic Rankings 主席树
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1901 题意概括 给你一段序列(n个数),让你支持一些操作(共m次), 有两种操作,一种是询问区间第 ...
- [luogu2617][bzoj1901][Zju2112]Dynamic Rankings【树套树+树状数组+主席树】
题目网址 [传送门] 题目大意 请你设计一个数据结构,支持单点修改,区间查询排名k. 感想(以下省略脏话inf个字) 真的强力吹爆洛谷数据,一般的树套树还给我T了一般的点,加强的待修主席树还给我卡了几 ...
- bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)
带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀. 对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了. 3k4人AC的题#256...应该不算慢 #incl ...
- 【分块】bzoj1901 Zju2112 Dynamic Rankings
区间k大,分块大法好,每个区间内存储一个有序表. 二分答案,统计在区间内小于二分到的答案的值的个数,在每个整块内二分.零散的暴力即可. 还是说∵有二分操作,∴每个块的大小定为sqrt(n*log2(n ...
- 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings
论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...
- 【基数排序】bzoj1901 Zju2112 Dynamic Rankings
论NOIP级别的n²算法…… 跟分块比起来,理论上十万的数据只慢4.5倍左右的样子…… #include<cstdio> #include<algorithm> using n ...
随机推荐
- python 时间类型和相互转换
time有四种类型(time, datetime, string, timestamp) 1. time string string是最简单的表示time的方式 如如下代码生成的即为string &g ...
- asp.net与Matlab类型转换(待补全)
上上篇的博客已经提到如何配置环境,即如何在asp.net中调用matlab生成的dll文件.这篇博客打算做个笔记,那就是matlab和C#数据类型如何转换.随着需求的增加,我会不断增加新的类型转换. ...
- easyUI数据表格datagrid之分页
一.分页函数 /**========================================= * 分页函数 */function pagerFilter(data) { if(typeof ...
- php实现文件上传下载功能小结
文件的上传与下载是项目中必不可少的模块,也是php最基础的模块之一,大多数php框架中都封装了关于上传和下载的功能,不过对于原生的上传下载还是需要了解一下的.基本思路是通过form表单post方式实现 ...
- ansible执行playbook时间显示的python脚本
import datetime import os import time from ansible.plugins.callback import CallbackBase class Callba ...
- ansible加密命令
ansible-vault用于配置文件加密,如编写的playbook配置文件中包含敏感信息,不希望其他人随意查看,ansible-valut可加密/解密这个配置文件,刚试了下也可以加密txt文档,猜想 ...
- php 生成随机字符串 abcdeft....789
) { $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; $str = &quo ...
- MemberCached安装
先上干货.. http://yunpan.cn/cmnABPWq27Mk7 访问密码 2ab3 这包里是安装包和一个比较合适的例子..例子是从CSDN上下载的..觉得对新手有帮助. 不过在这之前.. ...
- Python开发【第十二篇】:DOM
文档对象模型(Document Object Model,DOM)是一种用于HTML和XML文档的编程接口.它给文档提供了一种结构化的表示方法,可以改变文档的内容和呈现方式.我们最为关心的是,DOM把 ...
- css3实现渐变的iPhone滑动解锁效果
先贴代码 <!DOCTYPE html> <html> <head> <style> p{ width:50%; margin:0 auto; line ...