BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)
Time Limit: 10 Sec Memory Limit: 128 MB
Submit: 9094 Solved: 3808
[Submit][Status][Discuss]
Description
Input
Output
对于每一次询问,你都需要输出他的答案,每一个输出占单独的一行。
Sample Input
3 2 1 4 7
Q 1 4 3
C 2 6
Q 2 5 3
Sample Output
6
HINT
Source
整体二分真是个好东西啊,
而且特别好写。
思想大概就是把所有的询问全都放到一块处理,然后剩下的就和普通的处理一样了。
修改操作的话就是先删除再增加
第$k$大为经典操作,每次找比当前小的有多少个的时候用树状数组维护
#include<cstdio>
#include<cstring>
#include<vector>
#define lowbit(x) ((x) & (-x))
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
using namespace std;
const int MAXN = 1e5 + , INF = 1e9 + ;
char buf[ << ], *p1 = buf, *p2 = buf;
inline int read() {
char c = getchar(); int x = , f = ;
while(c < '' || c > '') {if(c == '-') f = -; c = getchar();}
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * f;
}
struct Query {
int opt, l, r, k, id;
};
vector<Query> Q;
int N, M, a[MAXN], ans[MAXN], T[MAXN];
void Add(int pos, int val) { for(int i = pos; i <= N; i += lowbit(i)) T[i] += val;}
int Sum(int pos) {
int ans = ;
for(int i = pos; i > ; i -= lowbit(i)) ans += T[i];
return ans;
}
void Solve(int lb, int rb, vector<Query> &Q) {
if(Q.empty()) return ;
if(rb - lb == ) {
for(int i = ; i < Q.size(); i++)
if(Q[i].opt == )
ans[Q[i].id] = lb;
return ;
}
vector<Query>L, R;
int mid = (lb + rb) >> ;
for(int i = ; i < Q.size(); i++) {
Query p = Q[i];
if(p.opt == ) {// l:pos r:opt k:val
if(p.k < mid) Add(p.l, p.r), L.push_back(p);
else R.push_back(p);
} else {// l: Ql R: Ql k:you know
int kth = Sum(p.r) - Sum(p.l - );
if(kth >= p.k) L.push_back(p);
else p.k -= kth, R.push_back(p);
}
}
for(int i = ; i < L.size(); i++)
if(L[i].opt == )
Add(L[i].l, -L[i].r);
Solve(lb, mid, L); Solve(mid, rb, R);
}
main() {
N = read(); M = read();
for(int i = ; i <= N; i++) Q.push_back((Query){, i, , a[i] = read(), });
for(int i = ; i <= M; i++) {
char c = '_';while(c != 'C' && c != 'Q') c = getchar();
if(c == 'C') {
int pos = read(), val = read();
Q.push_back((Query){, pos, -, a[pos], });
Q.push_back((Query){, pos, , a[pos] = val, });
} else {
int ll = read(), rr = read(), kth = read();
Q.push_back((Query){, ll, rr, kth, i});
}
}
memset(ans, -0x3f, sizeof(ans));
Solve(, 1e9, Q);
for(int i = ; i <= M; i++)
if(ans[i] >= -INF)
printf("%d\n", ans[i]);
return ;
}
BZOJ1901: Zju2112 Dynamic Rankings(整体二分 树状数组)的更多相关文章
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
- BZOJ 1901 Dynamic Rankings (整体二分+树状数组)
题目大意:略 洛谷传送门 这道题在洛谷上数据比较强 貌似这个题比较常见的写法是树状数组套主席树,动态修改 我写的是整体二分 一开始的序列全都视为插入 对于修改操作,把它拆分成插入和删除两个操作 像$C ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组
题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...
- 【bzoj2527】[Poi2011]Meteors 整体二分+树状数组
题目描述 有N个成员国.现在它发现了一颗新的星球,这颗星球的轨道被分为M份(第M份和第1份相邻),第i份上有第Ai个国家的太空站. 这个星球经常会下陨石雨.BIU已经预测了接下来K场陨石雨的情况.BI ...
- bzoj 1901: Zju2112 Dynamic Rankings【整体二分+树状数组||主席树+树状数组】
整体二分: 对于每一个修改操作,标记为1,并且加一个标记为-1的这个位置原来值,并且对于a数列每个点都当成修改操作 然后整体二分,扫当前操作区间lr,把在值域区间标记为1和-1的操作都在树状数组对应位 ...
随机推荐
- socket编程(一)
因为下载器涉及到socket的知识,就花了一天学习了.因为时间原因分成几部分.(这里记录上的是基于Windows平台的) #include <stdio.h> #include <w ...
- JEECMS站群管理系统-- Jeecms安装过程
Jeecms是基于java技术研发的站群管理系统,稳定.安全.高效.跨平台.无限扩展是jeecms 的优点,系统支持mysql.oracle.sqlserver.db2等主流数据库. 轻松建设大规模网 ...
- 学习JVM-GC原理
1. 前言 Java和C++之间显著的一个区别就是对内存的管理.和C++把内存管理的权利赋予给开发人员的方式不同,Java拥有一套自动的内存回收系统(Garbage Collection,GC)简称G ...
- CentOS安装最新Git
1.依赖库安装 yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel yum install gcc pe ...
- python复习目录
目录 一.计算机基础 二.python 2.1初始python 2.1 python基础1 2.2 python基础2 三.函数 3.1 函数进阶 3.2 函数之装饰器 3.3 递归函数之二分查找 3 ...
- pymongo模块
import pymongo # 创建与MongoDB服务器的连接 mongoclient = pymongo.MongoClient(host='127.0.0.1', port=27017) # ...
- #include stdio.h(5)
#include <stdio.h> int main() { //1.数组的排序-冒泡排序 /* 1.规则:相邻的两个数据进行比较 2.如果有N个数据,需要选择N-1次参照物来比较, 因 ...
- Lync二次开发关于Lync启动退出问题
以前使用C++开发的version.dll文件,由于各个用户环境的不同,造成某些用户加载不了我们开发的插件,并且写version.dll的同事还没找到好的解决办法,所以得换一种思路去解决这个问题,就是 ...
- Java Knowledge series 4
JVM & Bytecode Has-a or Is-a relationship(inheritance or composition) 如果想利用新类内部一个现有类的特性,而不想使用它的接 ...
- CAD鼠标移动到对象时显示对象内容
//定义事件 Editor ed = doc.Editor; ed.PointMonitor += new PointMonitorEventHandler(ed_Po ...