传送门

刚觉得最近写代码比较顺畅没什么Bug,cdq分治真是我的一个噩梦。。

整体二分模板题,带修改的区间第k小。

vjudge不知抽什么风,用不了,hdu忘了密码了一直在那里各种试,难受。。

写得比较鬼畜。

整体二分,传了三个l,r分别是二分答案的 el ,er ,对当前答案可能有贡献的修改区间的 l , r ,答案在当前二分区间中的询问区间 ql, qr

每次对el, er 取个mid,然后修改区间是按时间排好序的,按时间扫过去,在修改值大于mid的地方+1(区间第k小等价于大于等于它的数有len-k+1个),同时把这些区间往右放,其余区间往作放。

然后对于询问区间查询区间内1的个数,就知道了区间中大于等于mid的数的个数,如果个数大于等于len-k+1就把询问区间往右放,否则减去查询的值往左放。

el==er时对所有的询问区间更新答案。

注意的时我的这种鬼畜写法往右放时二分区间是mid,r,往左是l,mid-1,所以对于偶数长度的区间强制mid靠右才ok。。

跑得还蛮快的。

反正我觉得树套树优秀多了,虽然跑得慢一点。

//Achen
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<queue>
#include<ctime>
#include<cmath>
const int N=;
typedef long long LL;
using namespace std;
int n,m,cq,v[N],ans[N]; template<typename T> void read(T &x) {
char ch=getchar(); x=; T f=;
while(ch!='-'&&(ch<''||ch>'')) ch=getchar();
if(ch=='-') f=-,ch=getchar();
for(;ch>=''&&ch<='';ch=getchar()) x=x*+ch-''; x*=f;
} struct node {
int ti,pos,v,f;
node(){}
node(int ti,int pos,int v,int f):ti(ti),pos(pos),v(v),f(f){}
}cg[N],tp[N];
struct qs{
int id,ti,l,r,k;
qs(){}
qs(int id,int ti,int l,int r,int k):id(id),ti(ti),l(l),r(r),k(k){}
}q[N],t[N]; int sum[N];
void add(int x,int v) {
for(int i=x;i<=n;i+=(i&(-i)))
sum[i]+=v;
}
int qry(int x) {
int res=;
for(int i=x;i;i-=(i&(-i)))
res+=sum[i];
return res;
} void cdq(int el,int er,int l,int r,int ql,int qr) {
if(el>er||ql>qr) return;
if(el==er) {
for(int i=ql;i<=qr;i++) ans[q[i].id]=el;
return;
}
int mid=((el+er)>>); if((el+er)&) mid++;
int ll=l-,rr=r+,lx=ql-,rx=qr+,now=ql;
for(int i=l;i<=r+;i++) {
while(now<=qr&&(i==r+||q[now].ti<cg[i].ti)) {
int dd=qry(q[now].r)-qry(q[now].l-);
if(dd>=q[now].k) t[--rx]=q[now];
else { q[now].k-=dd; t[++lx]=q[now]; }
now++;
} if(i==r+) break;
if(cg[i].v>=mid) {
tp[--rr]=cg[i];
add(cg[i].pos,cg[i].f);
}
else tp[++ll]=cg[i];
}
int tr=rr,trr=rx;
for(int i=rr;i<=r;i++) add(tp[i].pos,-tp[i].f);
for(int i=l;i<=ll;i++) cg[i]=tp[i];
for(int i=r;i>ll;i--) cg[i]=tp[tr++];
for(int i=ql;i<=lx;i++) q[i]=t[i];
for(int i=qr;i>lx;i--) q[i]=t[trr++];
cdq(el,mid-,l,ll,ql,lx);
cdq(mid,er,rr,r,rx,qr);
} int main() {
while(scanf("%d",&n)==) {
int el=1e9,er=;
for(int i=;i<=n;i++) {
read(v[i]);
el=min(el,v[i]); er=max(er,v[i]);
cg[i]=node(i,i,v[i],);
}
read(m); cq=;
for(int i=;i<=m;i++) {
int o,x,y,k;
read(o); read(x); read(y);
if(o==) {
cg[++n]=node(n+i,x,v[x],-);
cg[++n]=node(n+i,x,y,); v[x]=y;
el=min(el,y); er=max(er,y);
}
else {
read(k);
q[++cq]=qs(cq,n+i,x,y,y-x+-k+);
}
}
cdq(el,er,,n,,cq);
for(int i=;i<=cq;i++) printf("%d\n",ans[i]);
}
return ;
}
/*
5
7 1 9 9 5
1
2 3 3 1
*/

HDU5412 CRB and Queries 整体二分的更多相关文章

  1. HDU - 5412 CRB and Queries (整体二分)

    题目链接 动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉. 另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺 ...

  2. hdu 5412 CRB and Queries(整体二分)

    题意 动态区间第k大 (n<=100000,m<=100000) 题解 整体二分的应用. 与静态相比差别不是很大.(和CDQ还有点像)所以直接上代码. #include<iostre ...

  3. Hdu CRB and Queries(整体二分)

    CRB and Queries Time Limit: 6000 MS Memory Limit: 131072 K Problem Description There are N boys in C ...

  4. hdu5412——CRB and Queries

    1.题目大意:区间第k大,单点修改 2.随便搞搞就好了= =,树套树或主席树,我写的很丑 #include <cstdio> #include <cstdlib> #inclu ...

  5. 整体二分初探 两类区间第K大问题 poj2104 & hdu5412

    看到好多讲解都把整体二分和$CDQ$分治放到一起讲 不过自己目前还没学会$CDQ$分治 就单独谈谈整体二分好了 先推荐一下$XHR$的 <浅谈数据结构题的几个非经典解法> 整体二分在当中有 ...

  6. (困难) CF 484E Sign on Fence,整体二分+线段树

    Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence o ...

  7. 整体二分QAQ

    POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...

  8. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  9. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

随机推荐

  1. LINQ用法总结

    之前一直用sql和拉姆达表达式,一直感觉linq不好用.用熟练了感觉期功能好强大,查询性能例外考究.这里讲讲基本用法. 内联查询: var list2 = (from a in db.Role whe ...

  2. python 简单的图片比较

    # by movie on 2019/12/18 from PIL import Image from PIL import ImageChops path1 = 'images/trumpA689. ...

  3. C#一般处理程序设置和读取session(session报错“未将对象引用设置到对象的实例”解决)

    登陆模块时,用到了session和cookie.在一般处理程序中处理session,一直报错.最后找到问题原因是需要调用 irequiressessionstate接口. 在ashx文件中,设置ses ...

  4. Ubuntu GitHub操作——分支、合并与标签

    分支 分支是用来将特性开发绝缘开来的.在你创建仓库的时候,master 是"默认的"分支.在其他分支上进行开发,完成后再将它们合并到主分支上. 创建一个叫做"featur ...

  5. codeforces 1136E-Nastya Hasn't Written a Legend

    传送门:QAQQAQ 题意:有一个数组a和一个数组k,数组a一直保持一个性质:a[i + 1] >= a[i] + k[i].有两种操作:1,给某个元素加上x,但是加上之后要保持数组a的性质.比 ...

  6. centos7 yum 安装tomcat7

    查看yum中tomcat信息 yum info tomcat 安装 yum install tomcat 安装管理界面 yum install tomcat-webapps tomcat-admin- ...

  7. history配置

    /etc/profile配置文件中,末尾增加如下参数项: HFILE=`who -m | awk '{print $1}'`readonly HISTFILE=/var/history/$HFILE- ...

  8. BMP 图片格式

     BMP根据颜色深度,可以分为2(1位).16(4位).256(8位).65536(16位)和1670万(24位)以及32位含有alpha通道.8位图像可以是 索引彩色图像外,也可以是灰阶图像,而索引 ...

  9. Android 开发 防止按键连续点击

    前言 按键防止连续点击是任何一个项目都要考虑的功能.下面我们将介绍几种防止按键连续点击的方法 用工具类实现 /** *@content:按键延时工具类,用于防止按键连点 *@time:2019-5-1 ...

  10. linux拆分文件

    1.先看下文件总的行数: wc -l filename 我们现在来看看它具体的参数该怎么用: split支持自定义输出文件大小和输出文件行数两种模式,此外还可以定义每一行最大的值. -l 按输出文件行 ...