P3332 [ZJOI2013]K大数查询

题目描述

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

输入输出格式

输入格式:

第一行\(N\),\(M\)接下来\(M\)行,每行形如\(\tt{1\ a\ b\ c}\)或\(\tt{2\ a\ b\ c}\)

输出格式:

输出每个询问的结果

说明

\(N,M\le 50000\)

\(a\le b\le N\)

\(1\)操作中\(abs(c)\le N\)

\(2\)操作中\(c\le long long\)


把整体二分的树状数组改成线段树区间操作即可


Code:

#include <cstdio>
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
const int N=1e5+10;
struct node{int op,l,r;ll c;}q[N],ql[N],qr[N];
int ans[N],n,m,Q;
ll sum[N<<1],tag[N<<1];
#define ls id<<1
#define rs id<<1|1
void pushdown(int id,int L,int R)
{if(tag[id]){int Mid=L+R>>1;sum[ls]+=tag[id]*(Mid+1-L),sum[rs]+=tag[id]*(R-Mid);tag[ls]+=tag[id],tag[rs]+=tag[id];tag[id]=0;}
}
void change(int id,int L,int R,int l,int r,ll d)
{if(L==l&&R==r){tag[id]+=d,sum[id]+=1ll*(R+1-L)*d;return;}pushdown(id,L,R);int Mid=L+R>>1;if(r<=Mid) change(ls,L,Mid,l,r,d);else if(l>Mid) change(rs,Mid+1,R,l,r,d);else change(ls,L,Mid,l,Mid,d),change(rs,Mid+1,R,Mid+1,r,d);sum[id]=sum[ls]+sum[rs];
}
ll query(int id,int L,int R,int l,int r)
{if(L==l&&R==r)return sum[id];pushdown(id,L,R);int Mid=L+R>>1;if(r<=Mid) return query(ls,L,Mid,l,r);else if(l>Mid) return query(rs,Mid+1,R,l,r);else return query(ls,L,Mid,l,Mid)+query(rs,Mid+1,R,Mid+1,r);
}
void divide(int l,int r,int s,int t)
{if(s>t) return;if(l==r) {rep(i,s,t)ans[q[i].op]=l;return;}int mid=l+r>>1,lp=0,rp=0;rep(i,s,t){if(q[i].op){ll c=query(1,1,n,q[i].l,q[i].r);if(c>=q[i].c) qr[++rp]=q[i];else ql[++lp]=q[i],ql[lp].c-=c;}else{if(q[i].c>mid) change(1,1,n,q[i].l,q[i].r,1),qr[++rp]=q[i];else ql[++lp]=q[i];}}rep(i,s,t)if(!q[i].op&&q[i].c>mid) change(1,1,n,q[i].l,q[i].r,-1);rep(i,s,s+lp-1) q[i]=ql[i+1-s];rep(i,s+lp,t) q[i]=qr[i+1-s-lp];divide(l,mid,s,s+lp-1),divide(mid+1,r,s+lp,t);
}
int main()
{scanf("%d%d",&n,&m);rep(i,1,m){scanf("%d%d%d%lld",&q[i].op,&q[i].l,&q[i].r,&q[i].c),--q[i].op;if(q[i].op) q[i].op=++Q;}divide(-n,n,1,m);rep(i,1,Q) printf("%d\n",ans[i]);return 0;
}

2018.11.1

转载于:https://www.cnblogs.com/butterflydew/p/9887148.html

洛谷 P3332 [ZJOI2013]K大数查询 解题报告相关推荐

  1. P3332 [ZJOI2013]K大数查询(整体二分做法)

    P3332 [ZJOI2013]K大数查询 题意: 题解: 利用整体二分来做,这个题和P3834 [模板]可持久化线段树 2的区别在于本题的修改是区间修改,所以将里面的树状数组改成线段树就行,区间修改 ...

  2. P3332 [ZJOI2013]K大数查询 - 整体二分-区间修改

    题目链接:https://www.luogu.com.cn/problem/P3332 思路:我们区间修改用一个线段树维护就可以了. #include <bits/stdc++.h> us ...

  3. P3332 [ZJOI2013]K大数查询【整体二分】或【树套树】

    传送门 给定一个长度为NNN的可重集合 支持修改,离线 求区间可重集合的并集第K大 这里介绍两种方法[树套树]和 [整体二分] 这里还有个单点修改,有点类似的 P2617 Dynamic Rankin ...

  4. BZOJ3110: [Zjoi2013]K大数查询

    BZOJ3110: [Zjoi2013]K大数查询 Description 有N个位置,M个操作. 操作有两种,每次操作如果是1 a b c的形式表示在第a个位置到第b个位置,每个位置加入一个数c 如 ...

  5. bzoj3110 [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 10703  Solved: 3209 [Submit][ ...

  6. 3110: [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 https://lydsy.com/JudgeOnline/problem.php?id=3110 分析: 整体二分+线段树. 两种操作:区间加入一个数,区 ...

  7. [BZOJ3110] [Zjoi2013]K大数查询

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 9208  Solved: 2737 [Submit][S ...

  8. bzoj 3110: [Zjoi2013]K大数查询(树套树)

    树套树: 本质:一棵树的每个节点套着另一棵树 通常时间复杂度:O(nlog²n) 空间复杂度:因为树的大小是nlogn,而每个节点又有一棵nlogn的树,所以最大空间复杂度为O(n²log²) 但事实 ...

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

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

最新文章

  1. 为什么对 Java 性能调优最后都像在调 you?
  2. 一个为制造业而生的AI助手,普通员工向它提问就能做数据分析
  3. sklearn-GridSearchCV调节超参数
  4. gradient 渐变
  5. slider控件控制文本框字体大小
  6. linux 解压tar.jz,linux系统压缩文件和解压缩命令
  7. Java面向对象设计原则
  8. 147页详述「结构在神经网络中的复兴」,图注意力网络一作博士论文公开
  9. javascript 函数式编程(1)
  10. tmap | R语言中专门绘制地图的工具包
  11. Python for和if的连写
  12. 通过TP-Link路由器WAN口嗅探PPPoE拨号密码-路由器拨号密码破解方法
  13. 51单片机外部中断实例
  14. 这就是CDN回源原理和CDN多级缓存啊!
  15. 程序员应该学习的一些数学知识
  16. 颠覆性创始人Tony Delgado在波多黎各启动编码训练营
  17. android 点击跳转到qq,Android应用跳转到手机QQ的方法
  18. 打开win10应用商店,提示管理员已阻止这个应用
  19. matlab-高数 diff 方向导数
  20. 一文看懂未来加密行业如何应对监管?

热门文章

  1. 广发银行运维实践分享:Docker适配传统运维那些事
  2. vmware虚拟机移植带来的问题
  3. DataGridView的DataGridViewComboBoxColumn列点击一次,自动处于编辑状态
  4. oracle基础之工具系列(持续更新中,,)
  5. 机器学习笔记(十)降维和度量学习
  6. Java实现余弦定理计算文本相似度
  7. [转]NS2 Data Collections by mitkook
  8. html在分页功能中如何实现当前页面的页码样式与其他页面不同_如何使用word文档?word文档使用技巧教程?...
  9. springcloud 与springboot的依赖关系以及版本的选择
  10. Chrome 浏览器降级后浏览网站不保留用户数据问题原因及解决方法