[ZJJOI2013]K大数查询 整体二分
[ZJJOI2013]K大数查询
链接
思路
整体二分。
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll _=5e5+7;
ll read() {
ll x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
ll n,m,ans[_];
struct OPT {ll opt,a,b,c,id;}Q[_],tmp1[_],tmp2[_];
namespace seg {
#define ls rt<<1
#define rs rt<<1|1
struct node {
ll l,r,lazy,siz;
unsigned ll tot;
}e[_<<2];
void build(ll l,ll r,ll rt) {
e[rt].l=l,e[rt].r=r,e[rt].siz=r-l+1;
ll mid=(l+r)>>1;
if(l==r) return;
build(l,mid,ls);
build(mid+1,r,rs);
}
void pushdown(ll rt) {
if(e[rt].lazy) {
e[ls].tot+=e[ls].siz*e[rt].lazy;
e[rs].tot+=e[rs].siz*e[rt].lazy;
e[ls].lazy+=e[rt].lazy;
e[rs].lazy+=e[rt].lazy;
e[rt].lazy=0;
}
}
void modify(ll L,ll R,ll ad,ll rt) {
if(L<=e[rt].l&&e[rt].r<=R) {
e[rt].tot+=e[rt].siz*ad;
e[rt].lazy+=ad;
return;
}
ll mid=(e[rt].l+e[rt].r)>>1;
pushdown(rt);
if(L<=mid) modify(L,R,ad,ls);
if(R>mid) modify(L,R,ad,rs);
e[rt].tot=e[ls].tot+e[rs].tot;
}
unsigned ll query(ll L,ll R,ll rt) {
if(L<=e[rt].l&&e[rt].r<=R) return e[rt].tot;
ll mid=(e[rt].l+e[rt].r)>>1;
unsigned ll ans=0;
pushdown(rt);
if(L<=mid) ans+=query(L,R,ls);
if(R>mid) ans+=query(L,R,rs);
return ans;
}
}
void solve(ll l,ll r,ll vl,ll vr) {
if(vl==vr||l>r) {
for(ll i=l;i<=r;++i) ans[Q[i].id]=vl;
return;
}
ll mid=(vl+vr)>>1,p=-1,q=-1;
for(ll i=l;i<=r;++i) {
if(Q[i].opt==1) {
if(Q[i].c>mid) {
seg::modify(Q[i].a,Q[i].b,1,1);
tmp2[++q]=Q[i];
} else tmp1[++p]=Q[i];
} else {
ll tmp=seg::query(Q[i].a,Q[i].b,1);
if(Q[i].c<=tmp) tmp2[++q]=Q[i];
else Q[i].c-=tmp,tmp1[++p]=Q[i];
}
}
for(ll i=l;i<=r;++i)
if(Q[i].opt==1&&Q[i].c>mid) seg::modify(Q[i].a,Q[i].b,-1,1);
for(ll i=0;i<=p;++i) Q[l+i]=tmp1[i];
for(ll i=0;i<=q;++i) Q[l+p+1+i]=tmp2[i];
solve(l,l+p,vl,mid);
solve(l+p+1,r,mid+1,vr);
}
int main() {
n=read(),m=read();
seg::build(1,n,1);
ll cnt=0;
for(ll i=1;i<=m;++i) {
Q[i].opt=read();
Q[i].a=read(),Q[i].b=read(),Q[i].c=read();
if(Q[i].opt==2) Q[i].id=++cnt;
}
solve(1,m,-n,n);
for(ll i=1;i<=cnt;++i)
printf("%lld\n",ans[i]);
return 0;
}
[ZJJOI2013]K大数查询 整体二分的更多相关文章
- BZOJ 3110 K大数查询 | 整体二分
BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...
- 【BZOJ-3110】K大数查询 整体二分 + 线段树
3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6265 Solved: 2060[Submit][Sta ...
- P3332 [ZJOI2013]K大数查询 整体二分
终于入门整体二分了,勉勉强强算是搞懂了一个题目吧. 整体二分很多时候可以比较好的离线处理区间\(K\)大值的相关问题.考虑算法流程: 操作队列\(arr\),其中有询问和修改两类操作. 每次在答案的可 ...
- BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]
有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...
- BZOJ3110:[ZJOI2013]K大数查询(整体二分)
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)
题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...
- [ZJOI2013]K大数查询——整体二分
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是: 1 a b c:表示在第a个位置到第b个位置,每个位置加上一个数c 2 a b c:表示询问从第a个位置到第b个位置,第C大的数是多少. ...
- BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分
[题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
随机推荐
- Java中接口和Sala中的特质的区别?
1.先要区分是Java中哪个版本的接口,因为Java中不同版本接口是不一样2.Java8之前的接口(不包含Java8),这个版本的接口只能属性和抽象方法,和Scala中的特质有完全的不用因为Scala ...
- node、npm、gulp安装
1.先安装node.js ,官网下载地址:https://nodejs.org/en/ 2.安装完node之后,npm自动就安装了.可以直接在visual studio code 通过命令查看 nod ...
- C#循环 — break VS continue
一.简介 1.break语句:循环-循环中断并停止,退出当前循环: 流程图: 2.continue:循环-循环下一次迭代继续执行. 流程图: 执行过程:立即结果本次循环,判断循环条件,如果成立,则进入 ...
- K8S CoreDNS部署失败,问题分析
1. 查询k8s集群部署pod的基本情况 如下图,我们可知容器coredns和dnsutils都部署成功,但是由于域名解析的问题,导致coredns和dnsutils的容器不断重启(原因heath检查 ...
- PIE SDK矢量栅格化算法
1.算法功能简介 矢量栅格化,由矢量数据向栅格数据的转换一般比较方便.对于点.线目标,由其所在的栅格行.列数表示,对于面状目标,则需判定落人该面积内的像元.通常栅格(像元)尺寸均大于原来坐标表示的分辨 ...
- 微服务架构 ------ 插曲 linux LVM磁盘扩容
1.LVM的基本概念 物理卷(PV):可以在上面建立卷组的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件,物理卷包括一个特殊的header,其余部分被切割成一块块物理区域. 卷组(VG):将一组物 ...
- sqlserver 远程链接
远程链接的文档就不说了,网上好多. 这里就说下我遇到的情况,如果是阿里云的服务器的话,他的端口配置都是要到阿里云里的安全组里去配置的,第一次一直没想到,搞了一天才发现,在这里提醒各位好友.
- 在centos下安装rar解压.rar压缩包
CentOS本身不自带rar环境,因此对于rar文件无法直接解压,需要先配置rar环境. 首先需要确定自己的系统是64位还是32位的,通过这个命令: [root@localhost]# uname - ...
- gulp教程、gulp-less安装
gulp教程之gulp-less gulp详细入门教程 11.1.安装nodejs: 11.2.新建package.json文件:cnpm init 11.3.全局和本地安装gulp: cnpm in ...
- PHP生成唯一用户标识GUID
代码如下: //生成唯一用户标识id function create_guid() { $charid = strtoupper(md5(uniqid(mt_rand(), true))); $hyp ...