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 ...
随机推荐
- BA-WG-术语
ActiveX ActiveX 技术 使无论任何语言产生的软件在网络环境中能够实现互操作性的一组技术.ActiveX 建立在 Microsoft 的组件对象模型 (COM) 基础上.尽管 Active ...
- @Zookeeper可视化工具。 ZK 安装 node-zk-browser。2015.10.22亲测可用
zookeeper基本是基于API和console进行znode的操作,并没有一个比较方便的操作界面,这里也发现了taobao 伯岩写的一个工具,可以比较方便的查询zookeeper信息. 工具的开发 ...
- sublime text 插件emmet快捷命令
原文链接:http://www.17yaobai.com/?p=255 语法: 后代:> 缩写:nav>ul>li <nav> <ul> <li> ...
- RubyMine快捷键
RubyMine快捷键 ctrl+shift+up/down 向上/向下移动代码段 alt+shift+up/down 向上/向下移动代码行 ctrl+y 删除一行 ctrl+shift+f10 运行 ...
- AC自己主动机模板(数组实现版)
BY 九野 做了一道题,用我的那种写法华丽丽的超时了.,无奈学一学数组实现的 #include<stdio.h> #include<string.h> #include< ...
- 压缩&&解压命令汇总
下面是搜集的Linux系统下,压缩&&解压命令,以备參考使用. .tar 解包: tar xvf FileName.tar 打包:tar cvf FileName.ta ...
- luogu1313 计算系数
题目大意:给定一个多项式(ax+by)^k,请求出多项式展开后x^n*y^m 项的系数. 将原式化为(ax+by)*(ax+by)*...①,然后将其拆解,拆解时x乘了多少次,a就乘了多少次,y,b同 ...
- ubuntu之修改ls显示颜色
Linux 系统中 ls 文件夹的痛苦我就不说了,为了不伤眼睛,一般 ssh 终端背景都用的黑色,文件夹又是你妈的深蓝色,每次看文件夹都要探头仔细去看.这下彻底解决这个问题. 因为ubuntu下的 ...
- linux中udev简单的用法-->【转】
本文转载自:http://blog.csdn.net/qq_29729577/article/details/50825134 udev是Linux提供的一种在用户态管理设备的一种机制,udev的详细 ...
- Cookies操作类
实现代码: //声名一个数据集合 var listString = new List<string>() { "a", "b", "c&q ...