POJ2104 K-th number (整体二分)
刚学了整体二分,用这种解法来解决这道题。
首先对于每个询问时可以二分解决的,这也是可以使用整体二分的前提。将原来的序列看成是插入操作,和询问操作和在一起根据值域进行二分。用树状数组来检验二分值。
1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=100010,INF=1e9;
4 struct node{
5 int op,x,y,z;
6 }q[N<<1],lq[N<<1],rq[N<<1];
7 int n,m,t,c[N],ans[N];
8
9 int lowbit(int x){
10 return x&(-x);
11 }
12
13 int ask(int x){
14 int sum=0;
15 while(x){
16 sum+=c[x];
17 x-=lowbit(x);
18 }
19 return sum;
20 }
21
22 void change(int x,int y){
23 while(x<=n){
24 c[x]+=y;
25 x+=lowbit(x);
26 }
27 }
28
29 void solve(int L,int R,int l,int r){
30 if(l>r) return ;//操作序列为空
31 if(L==R){
32 for(int i=l;i<=r;i++){
33 if(q[i].op>0) ans[q[i].op]=L;
34 }
35 return ;
36 }
37 int mid=(L+R)>>1;
38 int lt=0,rt=0;
39 for(int i=l;i<=r;i++){
40 if(q[i].op==0){
41 if(q[i].y<=mid) change(q[i].x,1),lq[++lt]=q[i];
42 else rq[++rt]=q[i];
43 }
44 else{
45 int cnt=ask(q[i].y)-ask(q[i].x-1);
46 if(cnt>=q[i].z) lq[++lt]=q[i];
47 else q[i].z-=cnt,rq[++rt]=q[i];
48 }
49 }
50 for(int i=r;i>=l;i--){
51 if(q[i].op==0 && q[i].y<=mid) change(q[i].x,-1);
52 }
53 for(int i=1;i<=lt;i++) q[l+i-1]=lq[i];
54 for(int i=1;i<=rt;i++) q[l+lt+i-1]=rq[i];
55 solve(L,mid,l,l+lt-1);
56 solve(mid+1,R,l+lt,r);
57 }
58
59 int main(){
60 scanf("%d%d",&n,&m);
61 for(int i=1;i<=n;i++){
62 int val;scanf("%d",&val);
63 q[++t].op=0,q[t].x=i,q[t].y=val;
64 }
65 for(int i=1;i<=m;i++){
66 int l,r,k;
67 scanf("%d%d%d",&l,&r,&k);
68 q[++t].op=i,q[t].x=l,q[t].y=r,q[t].z=k;
69 }
70 solve(-INF,INF,1,t);
71 for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
72 return 0;
73 }
POJ2104 K-th number (整体二分)的更多相关文章
- POJ2104 K-th Number [整体二分]
题目传送门 K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 69053 Accepted: 24 ...
- POJ2104 K-th Number(整体二分)
题解 又一次做这个题上一次用的是线段树上二分.这次用的是整体二分.结果: (第一个是整体二分) 整体二分就是对于所有查询都二分一个值.然后根据能不能成立把询问修改分成两部分,然后第二部分继承第一部分的 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]
有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...
- BZOJ3110:[ZJOI2013]K大数查询(整体二分)
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ 3110 K大数查询 | 整体二分
BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- 【BZOJ-3110】K大数查询 整体二分 + 线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6265 Solved: 2060[Submit][Sta ...
- 静态区间第K小(整体二分、主席树)
题目链接 题解 主席树入门题 但是这里给出整体二分解法 整体二分顾名思义是把所有操作放在一起二分 想想,如果求\([1-n]\)的第\(k\)小怎么二分求得? 我们可以二分答案\(k\), \(O(n ...
- ZOJ 1112 Dynamic Rankings【动态区间第K大,整体二分】
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1112 题意: 求动态区间第K大. 分析: 把修改操作看成删除与增加 ...
- [ZJOI2013]K大数查询——整体二分
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是: 1 a b c:表示在第a个位置到第b个位置,每个位置加上一个数c 2 a b c:表示询问从第a个位置到第b个位置,第C大的数是多少. ...
随机推荐
- nginx的高级用法
一.根据url中的参数来确定缓存的key set_by_lua_block $dataArg { local enc = ngx.req.get_uri_args()["enc"] ...
- @DS("slave") 多数据源兼容事务问题解决方案
SpringBoot项目中用到多数据源,在方法上又必须加事务处理,此时可以对使用了@DS的方法或类添加@Transactional并添加事务隔离级别 举例: 1.这是一个方法,方法内需要实现多数据源查 ...
- 丽泽普及2022交流赛day20 1/4社论
目录 T1 正方形 T2 玩蛇 T3 嗷呜 T4 开车 T1 正方形 略 T2 玩蛇 略 T3 嗷呜 (插一个删一个?) 找出相同的,丢掉循环节 . 感觉非常离谱,,, 正确性存疑 正确性问 SoyT ...
- 丽泽普及2022交流赛day16 社论
这场比较平凡吧 . 省流: http://zhengruioi.com/contest/1087 目录 目录 A. Gene 题面 题解 算法一(正解) 算法二 B. Fight 题面 题解 算法一( ...
- npm中的安装环境依赖 -D,-S等等
什么都不写:这样不会写入到package.json中,直接安装到node_modules中,不建议这样写 -g:全局安装 -D:开发依赖,适合我们在开发阶段使用的依赖,包名会被注册到package.j ...
- 分库分表ShardingSphere-JDBC笔记整理
一.分库分表解决的现状问题 解决数据库本身瓶颈 连接数: 连接数过多时,就会出现'too many connections'的错误,访问量太大或者数据库设置的最大连接数太小的原因 Mysql默认的最大 ...
- The Data Way Vol.1|风口下的开源:如何看待开源与商业的关系?
关于「The Data Way」 「The Data Way」是由 SphereEx 公司出品的一档播客节目.这里有开源.数据.技术的故事,同时我们关注开发者的工作日常,也讨论开发者的生活日常:我们聚 ...
- 化整为零优化重用,Go lang1.18入门精炼教程,由白丁入鸿儒,go lang函数的定义和使用EP07
函数是基于功能或者逻辑进行聚合的可复用的代码块.将一些复杂的.冗长的代码抽离封装成多个代码片段,即函数,有助于提高代码逻辑的可读性和可维护性.不同于Python,由于 Go lang是编译型语言,编译 ...
- Spring源码 16 IOC refresh方法11
参考源 https://www.bilibili.com/video/BV1tR4y1F75R?spm_id_from=333.337.search-card.all.click https://ww ...
- Spring 03 切面编程
简介 AOP(Aspect Oriented Programming),即面向切面编程 这是对面向对象思想的一种补充. 面向切面编程,就是在程序运行时,不改变程序源码的情况下,动态的增强方法的功能. ...