感觉整体二分是个很有趣的东西。

在别人的博客上看到一句话

对于二分能够解决的询问,如果有多个,那么如果支持离线处理的话,那么就可以使用整体二分了

树套树写了一天还是WA着,调得焦头烂额,所以决定学cdq分治的写法,虽然不知道整体二分和cdq有什么不可不说的关系,就先写了这道主席树模板题(orz LLZ大佬)。

然后历史总是惊人的相似,和上午写cdq分治一样,又在同一个地方栽了跟头

两个cdq模板都是cmp写错,两个整体二分都是把que[i]写成了i QAQ

然后这个代码在洛谷上会T掉,在POJ可以A,就很难受了(vjudge上waiting了35分钟。。。)

//Twenty
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
const int maxn=++;
const int INF=1e9+;
int n,m,tot,sum[maxn],ans[maxn];
struct node{
int op,id,l,r,v;
node(){};
node(int op,int id,int l,int r,int v):op(op),id(id),l(l),r(r),v(v){}
}p[maxn],tp[maxn];
void input() {
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) {
int x;
scanf("%d",&x);
p[i]=node(,i,i,i,x);
}
for(int i=;i<=m;i++) {
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
p[i+n]=node(,i,x,y,z);
}
}
void add(int x,int y) {
for(;x<=n+m;x+=(x&(-x)))
sum[x]+=y;
}
int qry(int x) {
int res=;
for(;x;x-=(x&(-x)))
res+=sum[x];
return res;
}
#define mid ((l+r)>>1)
int lq[maxn],rq[maxn];
void solve(int ql,int qr,int l,int r) {
if(l==&&r==) {
int debug=;
}
//int mid=((l+r)>>1);
if(r<l||qr<ql) return;
if(l==r) {
for(int i=ql;i<=qr;i++)
if(p[i].op==)
ans[p[i].id]=l;
return;
}
int lcnt=,rcnt=;
for(int i=ql;i<=qr;i++) {
if(p[i].op) { //insert
if(p[i].v<=mid) {
add(p[i].id,);
lq[++lcnt]=i;
}
else rq[++rcnt]=i;
}
else { //query
int now=qry(p[i].r)-qry(p[i].l-);
if(now>=p[i].v) lq[++lcnt]=i;
else p[i].v-=now,rq[++rcnt]=i;
}
}
for(int i=;i<=lcnt;i++)
if(p[lq[i]].op&&p[lq[i]].v<=mid) add(p[lq[i]].id,-);
for(int i=;i<lcnt;i++) tp[ql+i]=p[lq[i+]];
for(int i=;i<rcnt;i++) tp[ql+lcnt+i]=p[rq[i+]];
for(int i=ql;i<=qr;i++) p[i]=tp[i];
solve(ql,ql+lcnt-,l,mid);
solve(ql+lcnt,qr,mid+,r);
}
void print() {
for(int i=;i<=m;i++)
printf("%d\n",ans[i]);
}
int main()
{
input();
solve(,m+n,-INF,INF);
print();
return ;
}

K-th number

POJ 2104:K-th Number 整体二分的更多相关文章

  1. poj 3111 K Best 最大化平均值 二分思想

    poj 3111 K Best 最大化平均值 二分思想 题目链接: http://poj.org/problem?id=3111 思路: 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书 设定条件 ...

  2. POJ 2104:K-th Number(整体二分)

    http://poj.org/problem?id=2104 题意:给出n个数和m个询问求区间第K小. 思路:以前用主席树做过,这次学整体二分来做.整体二分在yr大佬的指点下,终于大概懂了点了.对于二 ...

  3. POJ2104 K-th Number [整体二分]

    题目传送门 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 69053   Accepted: 24 ...

  4. BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]

    有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...

  5. BZOJ3110:[ZJOI2013]K大数查询(整体二分)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  6. BZOJ 3110 K大数查询 | 整体二分

    BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...

  7. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  8. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  9. 静态区间第K小(整体二分、主席树)

    题目链接 题解 主席树入门题 但是这里给出整体二分解法 整体二分顾名思义是把所有操作放在一起二分 想想,如果求\([1-n]\)的第\(k\)小怎么二分求得? 我们可以二分答案\(k\), \(O(n ...

随机推荐

  1. iOS组件化开发-CocoaPods安装

    首先要检查Mac是否安装了rvm(ruby version manager).打开终端,输入指令$ rvm -v ,若没有安装 curl -L https://get.rvm.io | bash -s ...

  2. (补充)9.Struts2中的OGNL表达式

    OGNL表达式概述 1. OGNL是Object Graphic Navigation Language(对象图导航语言)的缩写 * 所谓对象图,即以任意一个对象为根,通过OGNL可以访问与这个对象关 ...

  3. flink on yarn启动失败

    我启动hadoop on yarn 集群后 [root@node1 flink-1.6.1]# ./bin/yarn-session.sh -n 2 -jm 1024 -tm 1024 报的如下错误 ...

  4. 5. java运算符

    1.算术运算符 注意: % 取余数 (1)自增 (++)前自增:先自增完毕,再运算整个表达式,语句分号前面的都是运算表达式: 后自增,先运算完整个表达式(分号前面的都是表达式),再进行自增: 2.赋值 ...

  5. pycharm 2020 激活码 破解教程

    以下是安装完pycharm后进行破解!!   1.修改hosts,在hosts文件最后添加2行“0.0.0.0 account.jetbrains.com”和“0.0.0.0 www.jetbrain ...

  6. Python with语句的概率,不多说了直接上代码!

    python中的with语句用于访问资源.它确保执行指定的__exit__(“清理”)操作,而不管释放被访问资源的处理过程中的错误或异常,例如读取和写入文件后自动关闭.线程中锁的自动获取和释放等. p ...

  7. sublime快捷键汇总

    Sublime Text 3 快捷键精华版 Ctrl+Shift+P:打开命令面板Ctrl+P:搜索项目中的文件Ctrl+G:跳转到第几行Ctrl+W:关闭当前打开文件Ctrl+Shift+W:关闭所 ...

  8. Openssl命令的使用

    用途: pkcs8格式的私钥转换工具.它处理在PKCS#8格式中的私钥文件.它可以用多样的PKCS#5 (v1.5 and v2.0)和 PKCS#12算法来处理没有解密的PKCS#8 Private ...

  9. BZOJ 4455: [Zjoi2016]小星星(容斥+树形dp)

    传送门 解题思路 首先题目中有两个限制,第一个是两个集合直接必须一一映射,第二个是重新标号后,\(B\)中两点有边\(A\)中也必须有.发现限制\(2\)比较容易满足,考虑化简限制\(1\).令\(f ...

  10. JS常见的报错类型

    解决错误前,首先要学会阅读报错信息 eg:Uncaught TypeError: ... is not a function Uncaught 表示没有被catch语句捕获到的错误 TypeError ...