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 ...
随机推荐
- 11gR2 集群(CRS/GRID)新功能—— SCAN(Single Client Access Name)
https://blogs.oracle.com/database4cn/11gr2-crsgrid-scansingle-client-access-name
- Android开发时经经常使用的LogUtil
在开发过程中经经常使用到Log.我们常写的一种方式就是自己定义一个LogUtil工具类 private static boolean LOGV = true; private static boole ...
- 编写MyLayer,2 锚点,3 精灵的创建,4 zorder
1 编写MyLayer 头文件:MyLayer.h #include "cocos2d.h" USING_NS_CC; //代表的是: using namespace c ...
- Linux - 环境变量与位置变量
环境变量 [root@local ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin 注:只有自己执行 ...
- nyoj 21--三个水杯(隐式图bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...
- mysqls,为node.js而编写的sql语句生成插件 (crud for mysql).
It is written in JavaScript,crud for mysql.You can also use transactions very easily. mysqls 一款专为nod ...
- 【转】window 安装redis服务、卸载redis服务和启动redis服务
1.安装redis服务 redis-install.bat 1 echo install redis-server23 D:\redis\redis-server.exe --service-inst ...
- MessageDigest的功能及用法(加密解密)
MessageDigest的功能及用法 MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法.信息摘要是安全的单向哈希函数,它接收任意大小的数据,并输出固定长度 ...
- [lua]异步串行流程*协程
local function param_pack( params, callback ) table.insert(params, callback) return params end local ...
- Tomcat 报错 记录
Resource is out of sync with the file system: 该错误为替换了image中的图片而没有进行更新,造成找不到该资源,进而保存,解决只要eclipse刷新一下F ...