#整体二分,树状数组#洛谷 3332 [ZJOI2013]K大数查询
分析
虽然树套树也可以做,这里考虑整体二分,
对于二分的答案\(mid\),1操作实际上就是如果\(c>mid\)就给区间整体加1,
2操作即询问区间和是否超过\(k\),如果超过\(k\)就在\([mid+1,r]\)中找答案
简单的区间加可以用树状数组实现
代码
#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int N=200011; typedef long long lll;
struct rec{int l,r; lll x; int rk;}q[N],q1[N],q2[N];
lll ans[N],b[N],n,m,tot,T;
inline lll iut(){
rr lll ans=0,f=1; rr char c=getchar();
while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans*f;
}
inline void print(lll ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
struct Tree_Array{
lll c[N];
inline void update(int x,lll y){
for (;x<=n;x+=-x&x) c[x]+=y;
}
inline lll query(int x){
rr lll ans=0;
for (;x;x-=-x&x) ans+=c[x];
return ans;
}
}c0,c1;
inline void dfs(int L,int R,int l,int r){
if (l>r) return;
if (L==R){
for (rr int i=l;i<=r;++i)
if (q[i].rk) ans[q[i].rk]=b[L];
return;
}
rr int mid=(L+R)>>1,tot1=0,tot2=0;
for (rr int i=l;i<=r;++i)
if (q[i].rk){
rr lll now=c0.query(q[i].r)*q[i].r-c1.query(q[i].r)-c0.query(q[i].l-1)*(q[i].l-1)+c1.query(q[i].l-1);
if (q[i].x<=now) q2[++tot2]=q[i];
else q[i].x-=now,q1[++tot1]=q[i];
}else if (q[i].x>mid)
c0.update(q[i].l,1),c1.update(q[i].l,q[i].l-1),c0.update(q[i].r+1,-1),c1.update(q[i].r+1,-q[i].r),q2[++tot2]=q[i];
else q1[++tot1]=q[i];
for (rr int i=l;i<=r;++i)
if (!q[i].rk&&q[i].x>mid)
c0.update(q[i].l,-1),c1.update(q[i].l,1-q[i].l),c0.update(q[i].r+1,1),c1.update(q[i].r+1,q[i].r);
for (rr int i=1;i<=tot1;++i) q[l+i-1]=q1[i];
for (rr int i=1;i<=tot2;++i) q[l+i+tot1-1]=q2[i];
dfs(L,mid,l,l+tot1-1),dfs(mid+1,R,l+tot1,r);
}
signed main(){
n=iut(),m=iut();
for (rr int i=1;i<=m;++i){
rr int opt=iut(),l=iut(),r=iut(); rr lll x=iut();
q[i]=(rec){l,r,x,0};
if (opt==1) b[++tot]=x;
else q[i].rk=++T;
}
sort(b+1,b+1+tot),tot=unique(b+1,b+1+tot)-b-1;
for (rr int i=1;i<=m;++i) if (!q[i].rk)
q[i].x=lower_bound(b+1,b+1+tot,q[i].x)-b;
dfs(1,tot,1,m);
for (rr int i=1;i<=T;++i) print(ans[i]),putchar(10);
return 0;
}
#整体二分,树状数组#洛谷 3332 [ZJOI2013]K大数查询的更多相关文章
- 洛谷 P3332 [ZJOI2013]K大数查询 解题报告
P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...
- 洛谷 P3332 [ZJOI2013]K大数查询 (整体二分理解)
链接: P3332 题意: 维护 \(n(1\leq n\leq 5\times10^4)\) 个可重整数集,编号从 \(1\) 到 \(n\).有 \(m(1\leq m\leq5\times10^ ...
- 洛谷 P3332 [ZJOI2013]K大数查询 || bzoj3110
用树套树就很麻烦,用整体二分就成了裸题.... 错误: 1.尝试线段树套平衡树,码农,而且n*log^3(n)慢慢卡反正我觉得卡不过去 2.线段树pushdown写错...加法tag对于区间和的更新应 ...
- 洛谷P3332 [ZJOI2013]K大数查询 权值线段树套区间线段树_标记永久化
Code: #include <cstdio> #include <algorithm> #include <string> #include <cstrin ...
- [洛谷P3332][ZJOI2013]K大数查询
题目大意:有$n$个位置,$m$个操作.操作有两种: $1\;l\;r\;x:$在区间$[l,r]$每个位置加上一个数$x$ $2\;l\;r\;k:$询问$[l,r]$中第$k$大的数是多少. 题解 ...
- 【BZOJ-2527】Meteors 整体二分 + 树状数组
2527: [Poi2011]Meteors Time Limit: 60 Sec Memory Limit: 128 MBSubmit: 831 Solved: 306[Submit][Stat ...
- 【BZOJ3110】【整体二分+树状数组区间修改/线段树】K大数查询
Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如果是2 a b c形式,表示询问从第a个位置到第b个位 ...
- BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组
BZOJ_3110_[Zjoi2013]K大数查询_整体二分+树状数组 Description 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位 ...
- 【bzoj3110】[Zjoi2013]K大数查询 整体二分+树状数组区间修改
题目描述 有N个位置,M个操作.操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c.如果是2 a b c形式,表示询问从第a个位置到第b个位置,第C大的数 ...
- 【bzoj4009】[HNOI2015]接水果 DFS序+树上倍增+整体二分+树状数组
题目描述 给出一棵n个点的树,给定m条路径,每条路径有一个权值.q次询问求一个路径包含的所有给定路径中权值第k小的. 输入 第一行三个数 n和P 和Q,表示树的大小和盘子的个数和水果的个数. 接下来n ...
随机推荐
- Notepad++设置删除当前行快捷键
Notepad++默认能实现"删除当前行"效果的快捷键是Ctrl + L,实际上这不并是真正意义上的删除当前行,而是剪切当前行. 而Eclipse中实现删除当前行的快捷键是:Ctr ...
- [golang] 变量声明和初始化 var, :=, new() 和 make()
[golang] 变量声明和初始化 var, :=, new() 和 make() 说明 go语言中,提供了多种变量声明和初始化的方法.这里着重一一说明.并提供一个简单的指南. 指南 使用make() ...
- HashMap源码窥探
目录 前言 HashMap的数据结构 HashMap的put方法 HashMap的get方法 HashMap的初始化 HashMap的containsKey方法 HashMap的putAll方法 Ha ...
- Linux Cheat Sheet
- 【Azure Redis 缓存】对于Azure Redis 从 Redis 4 升级到 Redis 6 的一些疑问
问题描述 使用Azure Redis服务,客户端使用Redisson 3.X , 在近期Microsoft Azure对Redis服务进行大规模变动升级( Redis 版本由 4 升级到 6),对于这 ...
- 【Azure 应用服务】在创建App Service时,遇见“No available instances to satisfy this request. App Service is attempting to increase capacity.”错误
问题描述 在创建新的App Service,遇见了资源不满足当前需求的提示.详细消息为: "Code": "Conflict","Message&qu ...
- 【Azure 应用服务】App Servie网站报403 ModSecurity Action错误
问题描述 App Service 部署应用程序,然后通过App Gateway(WAF) 提供公网访问,但是一直遇见403报错,刷新页面,回退,重新Web页面能缓解403问题. 问题分析 通过浏览器F ...
- 【Azure Redis 缓存】当使用Azure Redis 集群服务时候,发生了Moved的几点分析
问题描述 当使用Azure Redis 集群服务时候,发生了Moved的几点分析 问题分析 1. 关于 Moved 问题,原因有可能是内存碎片整理,从而引起Redis发生failover. 2. ...
- 【aspose-words】Aspose.Words for Java模板语法详细剖析
前言 缘由 aspose-words模板语法再了解 垂死病中惊坐起,小丑竟是我自己.对于aspose-words的使用本狗自以为已炉火纯青,遂在新的迭代任务中毛遂自荐,并在小姐姐面前吹了一个大牛,分分 ...
- 3DES算法的起源与演进:保障信息安全的重要里程碑
一.3DES算法的起源与演进 3DES算法是DES算法的增强版,由IBM公司在上世纪90年代初提出.DES算法的密钥长度只有56位,随着计算机计算能力的提升,其安全性逐渐受到威胁.为了增强数据的安全性 ...