BZOJ 3110 [ZJOI2013]K大数查询 (整体二分+线段树)
和dynamic rankings这道题的思想一样
只不过是把树状数组换成线段树区间修改,求第$K$大的而不是第$K$小的
这道题还有负数,需要离散
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N1 50500
#define M1 100500
#define ll long long
#define dd double
#define inf 233333333
using namespace std; int gint()
{
int ret=,fh=;char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
}
ll gll()
{
ll ret=;int fh=; char c=getchar();
while(c<''||c>''){if(c=='-')fh=-;c=getchar();}
while(c>=''&&c<=''){ret=ret*+c-'';c=getchar();}
return ret*fh;
} struct SEG{
ll sum[N1<<],tag[N1<<];int use[N1<<],que[N1<<],tl;
void pushdown(int l,int r,int rt)
{
if(!tag[rt]) return;
int mid=(l+r)>>;
sum[rt<<]+=tag[rt]*(mid-l+); tag[rt<<]+=tag[rt];
sum[rt<<|]+=tag[rt]*(r-mid); tag[rt<<|]+=tag[rt];
if(!use[rt<<]) use[rt<<]=,que[++tl]=rt<<;
if(!use[rt<<|]) use[rt<<|]=,que[++tl]=rt<<|;
tag[rt]=;
}
void pushup(int rt){ sum[rt]=sum[rt<<]+sum[rt<<|]; }
void update(int L,int R,int l,int r,int rt,int w)
{
if(!use[rt]) use[rt]=,que[++tl]=rt;
if(L<=l&&r<=R){ sum[rt]+=(r-l+)*w; tag[rt]+=w; return;}
int mid=(l+r)>>; pushdown(l,r,rt);
if(L<=mid) update(L,R,l,mid,rt<<,w);
if(R>mid) update(L,R,mid+,r,rt<<|,w);
pushup(rt);
}
ll query(int L,int R,int l,int r,int rt)
{
if(L<=l&&r<=R) return sum[rt];
int mid=(l+r)>>; ll ans=; pushdown(l,r,rt);
if(L<=mid) ans+=query(L,R,l,mid,rt<<);
if(R>mid) ans+=query(L,R,mid+,r,rt<<|);
return ans;
}
void clr(){ while(tl){ use[que[tl]]=; sum[que[tl]]=; tag[que[tl]]=; que[tl--]=; } }
}s;
struct node{int fl,l,r,ans,t;ll K;}a[N1],tmp[N1];
int n,m,ma,nn;
int f[N1],w[N1],use[N1]; void alldic(int l,int r,int ql,int qr)
{
if(l>r||ql>qr) return;
int mid=(l+r)>>,i,j,S=ql,E;ll sum;
for(i=ql;i<=qr;i++)
{
if(a[i].fl==){
if(a[i].K>=mid){ s.update(a[i].l,a[i].r,,n,,); use[i]=; }
if(a[i].K>mid){ tmp[S++]=a[i]; }
}else{
sum=s.query(a[i].l,a[i].r,,n,);
if(sum<a[i].K){ a[i].K-=sum; }
else{ f[a[i].t]=w[mid]; tmp[S++]=a[i]; use[i]=; }
}
}
for(i=ql,E=S;i<=qr;i++)
{
if(!use[i]){ tmp[E++]=a[i]; }
else{ use[i]=; }
}
for(i=ql;i<=qr;i++) a[i]=tmp[i];
s.clr();
alldic(mid+,r,ql,S-); alldic(l,mid-,S,E-);
} int main()
{
scanf("%d%d",&n,&m);
int i,j; memset(f,-,sizeof(f));
for(i=;i<=m;i++){ a[i].fl=gint(); a[i].l=gint(); a[i].r=gint(); a[i].K=gll(); a[i].t=i; if(a[i].fl==) w[++ma]=a[i].K; }
sort(w+,w+ma+); ma=unique(w+,w+ma+)-(w+);
for(i=;i<=m;i++){ if(a[i].fl==) a[i].K=lower_bound(w+,w+ma+,a[i].K)-w; }
alldic(,ma,,m);
for(i=;i<=m;i++) if(f[i]!=-) printf("%d\n",f[i]);
return ;
}
BZOJ 3110 [ZJOI2013]K大数查询 (整体二分+线段树)的更多相关文章
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]
有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...
- BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
[题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...
- 【BZOJ-3110】K大数查询 整体二分 + 线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6265 Solved: 2060[Submit][Sta ...
- BZOJ 3110 [Zjoi2013]K大数查询 (CDQ分治+树状数组)
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是 ...
- BZOJ 3110 [Zjoi2013]K大数查询(整体二分)
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 11654 Solved: 3505[Submit][St ...
- BZOJ 3110: [Zjoi2013]K大数查询 [树套树]
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6050 Solved: 2007[Submit][Sta ...
- bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1384 Solved: 629[Submit][Stat ...
- 树套树专题——bzoj 3110: [Zjoi2013] K大数查询 & 3236 [Ahoi2013] 作业 题解
[原题1] 3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MB Submit: 978 Solved: 476 Descri ...
随机推荐
- TortoiseGit生成PuttyKey与GitHub的SSH进行关联
1.打开Puttygen 要到进度条满格为止,知道出现如下界面: 把上面的Key复制. 最后点击[Save private key]保存. 2.登录GitHub进行如下操作: Settings-> ...
- Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数
Thread.yield()方法表示交出主动权,join表示等待当前线程,可以指定秒数 学习了:http://www.importnew.com/14958.html 膜拜一下 源码膜拜: Threa ...
- Hook的两个小插曲
看完了前面三篇文章后,这里我们来一个小插曲~~~~ 第一个小插曲.是前面文章一个CM精灵的分析.我们这里使用hook代码来搞定. 第二个小插曲,是如今一些游戏,都有了支付上限,比如每天仅仅能花20块钱 ...
- ORACLE NOLOGGING研究
熟悉oracle的人都知道.通过设置oracle的nologging选项,能够使某些操作高速完毕,风险是数据库备份可能失效.能够使用nologging的操作有非常多,搜集资料整理例如以下: 1.索引的 ...
- SDUT 1500-Message Flood(set)
Message Flood Time Limit: 1500ms Memory limit: 65536K 有疑问?点这里^_^ 题目描写叙述 Well, how do you feel abo ...
- 分布式设计《初尝memcached》
之前听说过高性能的分布式缓存开源工具,但一直没有真正接触过,如今接触的产品中实用到过分布式缓存.所以决定一探到底.memcached是一个优秀的开源的分布式缓存工具.也是眼下比較火热的分布 ...
- 当使用Spring MVC @Valid对输入框进行验证的时候,可能会遇到以下的异常:Neither BindingResult nor plain target object for bean name ‘mybean’ available as request attribute
转自:https://www.cnblogs.com/wenhulu/p/5555457.html 当使用Spring MVC @Valid对输入框进行验证的时候,可能会遇到以下的异常: Neithe ...
- 【React Natvie】React-native-swiper的安装和配置【ES6】
react-native-swiper轮播图,是我们开发中特别常见的效果,首先感谢编写react-native-swiper的大神,让我们方便了很多.这个框架主要是用来做轮播图,焦点图等,内置了各种样 ...
- 使用asp.net 开发的一个东平人才网招聘程序
本人用asp.net 工作已经一两年时间了,在单位一般是做管理系统类的开发,针对的客户大都是政府机关,所以都是内网系统,虽然有成就感,但是无法再互联网上展示.虽然技术一般,但还是希望自己做一个网站在互 ...
- Android进程与线程
我们都知道,在操作系统中进程是OS分配资源的最小单位,而线程是执行任务的最小单位.一个进程可以拥有多个线程执行任务,这些线程可以共享该进程分配到的资源.当我们的app启动运行后,在该app没有其他组件 ...