HDU5412 CRB and Queries 整体二分
刚觉得最近写代码比较顺畅没什么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 整体二分的更多相关文章
- HDU - 5412 CRB and Queries (整体二分)
题目链接 动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉. 另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺 ...
- hdu 5412 CRB and Queries(整体二分)
题意 动态区间第k大 (n<=100000,m<=100000) 题解 整体二分的应用. 与静态相比差别不是很大.(和CDQ还有点像)所以直接上代码. #include<iostre ...
- Hdu CRB and Queries(整体二分)
CRB and Queries Time Limit: 6000 MS Memory Limit: 131072 K Problem Description There are N boys in C ...
- hdu5412——CRB and Queries
1.题目大意:区间第k大,单点修改 2.随便搞搞就好了= =,树套树或主席树,我写的很丑 #include <cstdio> #include <cstdlib> #inclu ...
- 整体二分初探 两类区间第K大问题 poj2104 & hdu5412
看到好多讲解都把整体二分和$CDQ$分治放到一起讲 不过自己目前还没学会$CDQ$分治 就单独谈谈整体二分好了 先推荐一下$XHR$的 <浅谈数据结构题的几个非经典解法> 整体二分在当中有 ...
- (困难) CF 484E Sign on Fence,整体二分+线段树
Bizon the Champion has recently finished painting his wood fence. The fence consists of a sequence o ...
- 整体二分QAQ
POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...
- BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
[题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...
- [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...
随机推荐
- Caffe系列1——网络文件和求解分析
1. 首先,我们先看一个完整的文件:lenet_train_test.prototxt name: "LeNet" #整个网络的名称 layer { #数据层——训练数据 name ...
- mysql 多表join
两个表可以简单地写为 select a.,b. from a left join b on a.id =b.id; 三个以上 select a.,b. from a left join b on a. ...
- poj3294Life Forms
传送门 我真是一个垃圾 模板题都不会做 模板题还要别人教 细节写法还要别人教 别人一分钟AC,教我算法还教我写法,最后写出来的别人算法还比我优秀一百倍 数据结构把脑子学傻了,看到题就想怎么用数据结构, ...
- windows环境下,svn未备份情况下重新恢复
公司有个同事在未打招呼的情况下把公司服务器进行重新装系统,崩溃啊.SVN之前未备份,还好SVN的库(Repositories)还在,如下图: 恢复办法如下: 由于之前安装的就是VisualSVN-Se ...
- Python中实现对list做减法操作介绍
Python中实现对list做减法操作介绍 这篇文章主要介绍了Python中实现对list做减法操作介绍,需要的朋友可以参考下 问题描述:假设我有这样两个list, 一个是list1,list1 = ...
- NAT后的FTP服务器部署笔记
(2019年2月19日注:这篇文章原先发在自己github那边的博客,时间是2017年2月5日) 寒假开始以后,过年之前有一个任务,为实验室的人搭建一个FTP,用之前部署好的物理服务器.这本就是网管干 ...
- Java 使用JDBC连接MySQL
// 这学期本来不打算深入学习Java的,课上的小项目也就随便写了一个简单计算器和扫雷游戏就糊弄过去.可是我们的Eliza老师偏偏什么都讲了,考虑到期末也会涉及到JDBC的内容,前些天试着学习一番. ...
- pycharm优化
一.版本选择 建议安装5.0版本,因为好注册,这个你懂得. 下载地址: https://confluence.jetbrains.com/display/PYH/Previous+PyCharm+Re ...
- java基础温习 -- Thread
启动线程两种方式: 1. 实现Runnable接口: 2. 继承Thread类. 选用:能使用接口,就不用从Thread类继承. 使用继承的方法不够灵活,从这个类继承了就不能从其他类继承: 实现 ...
- 基于在树上走的DP问题
笔者已经很久没有打过题解了,如果打题解,就总是要连着一个知识点来打题解. 最近做过一共两道这样的题目.笔者认为这样的题有较强的可拓展性,比较有意义. 所以就打一篇博客. 问题概述 先说说这是个什么样的 ...