[ZJJOI2013]K大数查询

链接

luogu

思路

整体二分。

代码

#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大数查询 整体二分的更多相关文章

  1. BZOJ 3110 K大数查询 | 整体二分

    BZOJ 3110 K大数查询 题面 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个 ...

  2. 【BZOJ-3110】K大数查询 整体二分 + 线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6265  Solved: 2060[Submit][Sta ...

  3. P3332 [ZJOI2013]K大数查询 整体二分

    终于入门整体二分了,勉勉强强算是搞懂了一个题目吧. 整体二分很多时候可以比较好的离线处理区间\(K\)大值的相关问题.考虑算法流程: 操作队列\(arr\),其中有询问和修改两类操作. 每次在答案的可 ...

  4. BZOJ 3110: [Zjoi2013]K大数查询 [整体二分]

    有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数是多少. N ...

  5. BZOJ3110:[ZJOI2013]K大数查询(整体二分)

    Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位 ...

  6. BZOJ.3110.[ZJOI2013]K大数查询(整体二分 树状数组/线段树)

    题目链接 BZOJ 洛谷 整体二分求的是第K小(利用树状数组).求第K大可以转为求第\(n-K+1\)小,但是这样好像得求一个\(n\). 注意到所有数的绝对值\(\leq N\),将所有数的大小关系 ...

  7. [ZJOI2013]K大数查询——整体二分

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是: 1 a b c:表示在第a个位置到第b个位置,每个位置加上一个数c 2 a b c:表示询问从第a个位置到第b个位置,第C大的数是多少. ...

  8. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  9. 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改

    题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...

随机推荐

  1. Java中接口和Sala中的特质的区别?

    1.先要区分是Java中哪个版本的接口,因为Java中不同版本接口是不一样2.Java8之前的接口(不包含Java8),这个版本的接口只能属性和抽象方法,和Scala中的特质有完全的不用因为Scala ...

  2. node、npm、gulp安装

    1.先安装node.js ,官网下载地址:https://nodejs.org/en/ 2.安装完node之后,npm自动就安装了.可以直接在visual studio code 通过命令查看 nod ...

  3. C#循环 — break VS continue

    一.简介 1.break语句:循环-循环中断并停止,退出当前循环: 流程图: 2.continue:循环-循环下一次迭代继续执行. 流程图: 执行过程:立即结果本次循环,判断循环条件,如果成立,则进入 ...

  4. K8S CoreDNS部署失败,问题分析

    1. 查询k8s集群部署pod的基本情况 如下图,我们可知容器coredns和dnsutils都部署成功,但是由于域名解析的问题,导致coredns和dnsutils的容器不断重启(原因heath检查 ...

  5. PIE SDK矢量栅格化算法

    1.算法功能简介 矢量栅格化,由矢量数据向栅格数据的转换一般比较方便.对于点.线目标,由其所在的栅格行.列数表示,对于面状目标,则需判定落人该面积内的像元.通常栅格(像元)尺寸均大于原来坐标表示的分辨 ...

  6. 微服务架构 ------ 插曲 linux LVM磁盘扩容

    1.LVM的基本概念 物理卷(PV):可以在上面建立卷组的媒介,可以是硬盘分区,也可以是硬盘本身或者回环文件,物理卷包括一个特殊的header,其余部分被切割成一块块物理区域. 卷组(VG):将一组物 ...

  7. sqlserver 远程链接

    远程链接的文档就不说了,网上好多. 这里就说下我遇到的情况,如果是阿里云的服务器的话,他的端口配置都是要到阿里云里的安全组里去配置的,第一次一直没想到,搞了一天才发现,在这里提醒各位好友.

  8. 在centos下安装rar解压.rar压缩包

    CentOS本身不自带rar环境,因此对于rar文件无法直接解压,需要先配置rar环境. 首先需要确定自己的系统是64位还是32位的,通过这个命令: [root@localhost]# uname - ...

  9. gulp教程、gulp-less安装

    gulp教程之gulp-less gulp详细入门教程 11.1.安装nodejs: 11.2.新建package.json文件:cnpm init 11.3.全局和本地安装gulp: cnpm in ...

  10. PHP生成唯一用户标识GUID

    代码如下: //生成唯一用户标识id function create_guid() { $charid = strtoupper(md5(uniqid(mt_rand(), true))); $hyp ...