hdu 5412 CRB and Queries(整体二分)
题意
动态区间第k大
(n<=100000,m<=100000)
题解
整体二分的应用。
与静态相比差别不是很大。(和CDQ还有点像)所以直接上代码。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=;
struct query{
int x,y,type,k,w;
}q[N],c1[N],c2[N];
int n,m,ans[N],tr[N],mx,tot,cnt,a[N];
int lowbit(int x){
return x&-x;
}
void add(int x,int w){
for(int i=x;i<=n;i+=lowbit(i)){
tr[i]+=w;
}
}
int getsum(int x){
int ans=;
for(int i=x;i;i-=lowbit(i)){
ans+=tr[i];
}
return ans;
}
void solve(int l,int r,int L,int R){
if(l>r)return;
if(L==R){
for(int i=l;i<=r;i++){
if(q[i].type==)ans[q[i].w]=L;
}
return ;
}
int mid=(L+R)>>;
int lnow=;int rnow=;
for(int i=l;i<=r;i++){
if(q[i].type==){
int tmp=getsum(q[i].y)-getsum(q[i].x-);
if(tmp>=q[i].k){
c1[++lnow]=q[i];
}
else{
q[i].k-=tmp;
c2[++rnow]=q[i];
}
}
else{
if(q[i].type==&&q[i].y<=mid)add(q[i].x,);
if(q[i].type==&&q[i].y<=mid)add(q[i].x,-);
if(q[i].y<=mid)c1[++lnow]=q[i];
else c2[++rnow]=q[i];
}
}
for(int i=l;i<=r;i++){
if(q[i].type==&&q[i].y<=mid)add(q[i].x,-);
if(q[i].type==&&q[i].y<=mid)add(q[i].x,);
}
for(int i=;i<=lnow;i++){
q[l+i-]=c1[i];
}
for(int i=;i<=rnow;i++){
q[l+lnow+i-]=c2[i];
}
solve(l,l+lnow-,L,mid);
solve(l+lnow,r,mid+,R);
}
int main(){
while(~scanf("%d",&n)){
mx=;cnt=;tot=;
for(int i=;i<=n;i++){
scanf("%d",&a[i]);
q[++cnt].type=;q[cnt].x=i;q[cnt].y=a[i];
mx=max(mx,a[i]);
}
scanf("%d",&m);
for(int i=;i<=m;i++){
int k;
scanf("%d",&k);
if(k==){
int x,y;
scanf("%d%d",&x,&y);
q[++cnt].type=;q[cnt].x=x;q[cnt].y=a[x];
q[++cnt].type=;q[cnt].x=x;q[cnt].y=y;
a[x]=y;
mx=max(mx,y);
}
else{
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
q[++cnt].type=;q[cnt].x=x;q[cnt].y=y;q[cnt].k=k;
q[cnt].w=++tot;
}
}
solve(,cnt,,mx);
for(int i=;i<=tot;i++){
printf("%d\n",ans[i]);
}
}
return ;
}
hdu 5412 CRB and Queries(整体二分)的更多相关文章
- HDU - 5412 CRB and Queries (整体二分)
题目链接 动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉. 另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺 ...
- hdu 5412 CRB and Queries
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5412 CRB and Queries Description There are $N$ boys i ...
- 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 整体二分
传送门 刚觉得最近写代码比较顺畅没什么Bug,cdq分治真是我的一个噩梦.. 整体二分模板题,带修改的区间第k小. vjudge不知抽什么风,用不了,hdu忘了密码了一直在那里各种试,难受.. 写得比 ...
- HDU 5412——CRB and Queries——————【线段树套Treap(并没有AC)】
CRB and Queries Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- 2015 Multi-University Training Contest 10 hdu 5412 CRB and Queries
CRB and Queries Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- HDU 5412 CRB and Queries 动态整体二分
Problem Description There are N boys in CodeLand.Boy i has his coding skill Ai.CRB wants to know who ...
- HDU 5412 CRB and Queries(区间第K大 树套树 按值建树)
题目链接:http://acm.hdu.edu.cn/showproblem.php? pid=5412 Problem Description There are N boys in CodeLan ...
- 整体二分 HDU - 5808
题目大意 有n个物品,排成一个序列,每个物品有一个di表示取到i要走的距离,vi表示i的价值. 给m组询问[l,r] ,c,sum,问由[l,r]的di<=c的物品能否凑出sum的价值(每个物品 ...
随机推荐
- MHA+ProxySQL 读写分离高可用
文档结构如下: 1.ProxySQL说明 ProxySQL是mysql的一款中间件的产品,是灵活的mysql代理层,可以实现读写分离,支持query路由器的功能,支持动态指定sql进行缓存,支持动态加 ...
- BZOJ 4636 (动态开节点)线段树
思路: 偷懒 懒得离散化 搞了个动态开节点的线段树 (其实是一样的--..) 注意会有a=b的情况 要判掉 //By SiriusRen #include <cstdio> #includ ...
- C#调用Exe程序示例
在编写程序时经常会使用到调用可执行程序的情况,本文将简单介绍C#调用exe的方法.在C#中,通过Process类来进行进程操作. Process类在System.Diagnostics包中. 示例一 ...
- 人生苦短,请用 Chrome!
在网络层,互联网提供所有应用程序都要使用的两种类型的服务,尽管目前理解这些服务的细节并不重要,但在所有TCP/IP概述中,都不能忽略他们: 无连接分组交付服务(Connectionless Packe ...
- lua_pcall与lua_call之间的区别
lua_pcall与lua_call之间的区别 定义: void lua_call (lua_State *L, int nargs, int nresults); int lua_pcall (lu ...
- SpringBoot学习笔记(15)----SpringBoot使用Druid
直接访问Druid官网wiki,有详细教程,地址如下: SpringBoot支持Druid地址:https://github.com/alibaba/druid/tree/master/druid-s ...
- 在javascript中对于this指向的再次理解
总所周知,function () {}函数体内的this对象指向的是调用该函数的对象,那么我们看一下这个例子 <script> var length = 3; function fn () ...
- eclipse界面更改为黑色
效果如下: 更改很简单,该两个配置就行了,如下图: 1.在window中打开Preferences,然后跟下图一样配置就行了.
- [arc076e]connected?
题意: 给出一个$R\times C$的棋盘,其中$1$到$N$之间的每个正整数都会在棋盘上出现两次,第$i$个数出现的位置是$(X_{i,1},Y_{i,1})$和$(X_{i,2},Y_{i,2} ...
- 【问题】解决python3不支持mysqldb
Django框架使用的还是python2.x的MySQLdb,而python3.x使用的是pymysql,centos7上默认安装的python2.7,自己安装了python3.6的版本,在运行dja ...