题目链接:https://www.luogu.com.cn/problem/P3332

思路:我们区间修改用一个线段树维护就可以了。

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define mid (l+r>>1)LL a[200000+10], sum[50000*4+10], laz[50000*4+10], rec[50000*4+10];
void BT(LL i, LL l, LL r){sum[i]=laz[i]=rec[i]=0;if(l==r){sum[i]=a[l];return ;}BT(i<<1, l, mid); BT((i<<1)+1, mid+1, r);sum[i]=sum[i<<1]+sum[(i<<1)+1];
}void pushdown(LL i, LL l, LL r){if(rec[i]){//清空线段树rec[i]=0;laz[i<<1]=laz[(i<<1)+1]=sum[i<<1]=sum[(i<<1)+1]=0;rec[(i<<1)]=rec[(i<<1)+1]=1;}if(laz[i]){laz[(i<<1)]+=laz[i]; laz[(i<<1)+1]+=laz[i];sum[(i<<1)]+=laz[i]*(mid-l+1);sum[(i<<1)+1]+=laz[i]*(r-mid);laz[i]=0;}
}void add(LL i, LL l, LL r, LL L, LL R, LL v){if(l==L&&r==R){laz[i]+=v;sum[i]+=v*(r-l+1);return ;}if(laz[i]||rec[i]) pushdown(i, l, r);if(R<=mid) add(i<<1, l, mid, L, R, v);else if(L>mid) add((i<<1)+1, mid+1, r, L, R, v);else add(i<<1, l, mid, L, mid, v), add((i<<1)+1, mid+1, r, mid+1, R, v);sum[i]=sum[i<<1]+sum[(i<<1)+1];
}LL query(LL i, LL l, LL r, LL L, LL R){if(l==L&&r==R){return sum[i];}if(laz[i]||rec[i]) pushdown(i, l, r);if(R<=mid) return query(i<<1, l, mid, L, R);if(L>mid) return query((i<<1)+1, mid+1, r, L, R);return query(i<<1, l, mid, L, mid)+query((i<<1)+1, mid+1, r, mid+1, R);
}struct node{LL x, y, type, l, r, k, id;//值 添加/删除 查询/修改 区间 第k大 询问数
}q[100000+5], q1[100000+5], q2[100000+5];
LL tot, totx, n, m, ans[100000+5];void solve(LL ql, LL qr, LL l, LL r){if(ql>qr) return ;if(l==r){for(LL i=ql; i<=qr; i++){if(q[i].type==2){ans[q[i].id]=l;}}return ;}rec[1]=1, laz[1]=sum[1]=0;//清空线段树LL t1=0, t2=0;for(LL i=ql; i<=qr; i++){if(q[i].type==1){if(q[i].x>mid){//第k大add(1, 1, n, q[i].l, q[i].r, q[i].y);q2[t2++]=q[i];}else{q1[t1++]=q[i];}}else{LL tt=query(1, 1, n, q[i].l, q[i].r);if(tt<q[i].k){q[i].k-=tt;q1[t1++]=q[i];}else{q2[t2++]=q[i];}}}for(LL i=0; i<t1; i++) q[ql+i]=q1[i];for(LL i=0; i<t2; i++) q[ql+t1+i]=q2[i];solve(ql, ql+t1-1, l, mid);solve(ql+t1, qr, mid+1, r);
}int main(){tot=0, totx=0;scanf("%lld%lld", &n, &m);BT(1, 1, n);LL k, x, y, v;for(LL i=1; i<=m; i++){scanf("%lld%lld%lld%lld", &k, &x, &y, &v);if(k==1){q[++tot].x=v, q[tot].y=1, q[tot].type=1, q[tot].l=x, q[tot].r=y;}else{q[++tot].type=2, q[tot].k=v, q[tot].l=x, q[tot].r=y, q[tot].id=++totx;}}solve(1, m, -n, n);for(LL i=1; i<=totx; i++){printf("%lld\n", ans[i]);}return 0;
}

P3332 [ZJOI2013]K大数查询 - 整体二分-区间修改相关推荐

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

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

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

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

  3. 洛谷 P3332 [ZJOI2013]K大数查询 解题报告

    P3332 [ZJOI2013]K大数查询 题目描述 有\(N\)个位置,\(M\)个操作.操作有两种,每次操作如果是\(\tt{1\ a\ b\ c}\)的形式表示在第\(a\)个位置到第\(b\) ...

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

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

  5. [ZJJOI2013]K大数查询 整体二分

    [ZJJOI2013]K大数查询 链接 luogu 思路 整体二分. 代码 #include <bits/stdc++.h> #define ll long long using name ...

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

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

  7. bzoj3110 [Zjoi2013]K大数查询

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

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

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

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

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

最新文章

  1. mysql 8.0数据备份恢复_第7章 备份和恢复
  2. IPMI从驱动到应用(中篇 )
  3. 网易云信集成视频教程(一):如何快速实现安卓登录登出?
  4. jdk 安装 linux环境
  5. SQLAlchemy Mapping Table Columns
  6. SQLServer之修改存储过程
  7. linux7不能使用yum,CentOS7.6无法使用yum命令,无法更新解决方法
  8. tcpdump抓包工具各参数详解
  9. C# SolidWorks二次开发-工程图-更换工程图图纸格式/模板
  10. 两个队列实现一个栈-----队列面试题3
  11. 【SLAM小车】硬件_TB6612FNG设计记录
  12. YUY与RGB格式区别
  13. 解决 kindle 书籍字体颜色偏淡问题的方法
  14. 从前,有座山,山里有座庙,庙里有苦逼IT
  15. 51智能小车前进后退左右旋转
  16. [学习][数据结构]二叉搜索树
  17. 一位网友的网络求职经历
  18. 使用 parted 对单个磁盘进行分区并进行配额
  19. 使用pycharm配置出现Conda executable path is empty问题
  20. 可视化搭建平台的地图组件和日历组件方案选型

热门文章

  1. 【对讲机的那点事】使用对讲机,你了解对讲机电池使用寿命及安全吗?
  2. Python中模块的使用1
  3. 酷炫小程序相册源码,制作属于自己的相册,免费下载
  4. 《大数据时代》读书笔记——知道“是什么”就够了,没必要知道“为什么”。我们不必非得知道现象背后的原因,而是要让数据自己“发声”
  5. HDU 6447 YJJ's Salesman
  6. LeaRun快速开发平台,快速开发.net/java项目
  7. HyperLynx(十四)高级分析技术
  8. UEFI怎么用 UEFI安全启动设置添加方法步骤图解
  9. 【航天信息开票软件V3.0金税盘版安装恢复过程】有坑有心得
  10. 论文Express | 谷歌DeepMind最新动作:使用强化对抗学习,理解绘画笔触