模板—算法—整体二分(区间k小值)
模板—算法—整体二分(区间k小值)
Code:
#include <cstdio>
#include <algorithm>
using namespace std;
#define N 200010
int num[N],number[N],tmp[N],ans[N],n,m,id[N];
struct Ask {int l,r,id,k;}ask[N],ask1[N],ask2[N];
void change(int x,int y) {while(x<=n) tmp[x]+=y,x+=x&-x;}
int find(int x) {int sum=0;while(x) sum+=tmp[x],x-=x&-x;return sum;}
bool cmp(const int &a,const int &b) {return num[a]<num[b];}
int find_ord(int x)
{
int l=1,r=n+1;
while(l<r)
{
int mid=(l+r)>>1;
if(number[mid]>=x) r=mid;
else l=mid+1;
} return l;
}
void solve(int l,int r,int tl,int tr)
{
if(l==r) {for(int i=tl;i<=tr;i++) ans[ask[i].id]=number[l]/*,printf("%d %d\n",ask[i].id,l)*/;return;}
for(int i=l;i<=(l+r)>>1;i++) change(id[i],1); int top1=0,top2=0;
for(int i=tl;i<=tr;i++)
if(find(ask[i].r)-find(ask[i].l-1)>=ask[i].k) ask1[++top1]=ask[i];
else ask2[++top2]=ask[i],ask2[top2].k-=find(ask[i].r)-find(ask[i].l-1);
for(int i=1;i<=top1;i++) ask[tl+i-1]=ask1[i];
for(int i=1;i<=top2;i++) ask[tl+top1+i-1]=ask2[i];
for(int i=l;i<=(l+r)>>1;i++) change(id[i],-1);
solve(l,(l+r)>>1,tl,tl+top1-1),solve(((l+r)>>1)+1,r,tl+top1,tr);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&num[i]),number[i]=num[i],id[i]=i;
sort(number+1,number+n+1),sort(id+1,id+n+1,cmp);
for(int i=1;i<=n;i++) num[i]=find(num[i]);
for(int i=1;i<=m;i++) scanf("%d%d%d",&ask[i].l,&ask[i].r,&ask[i].k),ask[i].id=i;
solve(1,n,1,m);
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
}
模板—算法—整体二分(区间k小值)的更多相关文章
- 【BZOJ3065】带插入区间k小值
题意: 带插入,修改的区间k小值在线查询 原序列长度<=35000,插入个数<=35000,修改个数<=70000,0<=权值<=70000 题解: Orz vfleak ...
- 【学习笔记】浅析平衡树套线段树 & 带插入区间K小值
常见的树套树 一般来说,在嵌套数据结构中,线段树多被作为外层结构使用. 但线段树毕竟是 静态 的结构,导致了一些不便. 下面是一个难以维护的例子: 带插入区间 \(k\) 小值问题 来源:Luogu ...
- bzoj 3065: 带插入区间K小值(分块)
Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它 ...
- 【bzoj3065】带插入区间K小值 替罪羊树套权值线段树
题目描述 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理性愉悦一下,查询区间k小值.他每次向它的随从伏特提出 ...
- 【BZOJ3065】带插入区间K小值 替罪羊树+权值线段树
[BZOJ3065]带插入区间K小值 Description 从前有n只跳蚤排成一行做早操,每只跳蚤都有自己的一个弹跳力a[i].跳蚤国王看着这些跳蚤国欣欣向荣的情景,感到非常高兴.这时跳蚤国王决定理 ...
- BZOJ 3065 带插入区间K小值(sag套线段树)
3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 4696 Solved: 1527[Submit][Status][Di ...
- 【BZOJ】3065: 带插入区间K小值
http://www.lydsy.com/JudgeOnline/problem.php?id=3065 题意:带插入.修改的区间k小值在线查询.(原序列n<=35000, 询问<=175 ...
- bzoj 3065: 带插入区间K小值 替罪羊树 && AC300
3065: 带插入区间K小值 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 1062 Solved: 253[Submit][Status] Des ...
- [BZOJ3065]带插入区间K小值 解题报告 替罪羊树+值域线段树
刚了一天的题终于切掉了,数据结构题的代码真**难调,这是我做过的第一道树套树题,做完后感觉对树套树都有阴影了......下面写一下做题记录. Portal Gun:[BZOJ3065]带插入区间k小值 ...
随机推荐
- CF763E Timofey and our friends animals
题目戳这里. 首先题解给的是并查集的做法.这个做法很好想,但是很难码.用线段树数来维护并查集,暴力合并. 这里推荐另一个做法,可以无视\(K\)的限制.我们给每条边加个边权,这个边权为这条边左端点的值 ...
- Working with large data sets in MySQL
What does working with large data sets in mySQL teach you ? Of course you have to learn a lot about ...
- UVA 11995 STL 使用
There is a bag-like data structure, supporting two operations: 1 x Throw an element x into the bag. ...
- hdu 3473 (划分树)2
Minimum Sum Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- HDU 1394 Minimum Inversion Number(树状数组/归并排序实现
Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- DOM 2
1.对文档的信息进行检索常用的方法: getElementById; getElementsByTagName; getAttribute;//得到的是属性值 2把需要的信息添加到DOM中常用的方法: ...
- Sencha Touch MVC 中 store 的使用
I have a UserStore that I want to load after succesful login of a user. I can't get this to work i.e ...
- html初探
HTML HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可以让浏 ...
- 联系人数据存储Demo源代码
源码下载地址:07-联系人数据存储.zip35.8 KB // MJPerson.h // // MJPerson.h // 07-联系人数据存储 // // Created by apple ...
- 【Git】GitHub之多人开发一个项目
首先我们要简单知道github跟Git的区别.git是版本控制工具, github是一个面向开源及私有软件项目的托管平台,也是程序员交流的地方. 接下来就开始讲怎么多人一起开发. 首先我们先拥有git ...