[POJ2104]Kth Number-[整体二分]
Description
Solution
将所有询问放在一起,二分答案的同时把区间[l,r]内的数按大小分类。
Code
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
struct P{int num,id;}b[];
bool cmp(P x,P y){return x.num<y.num;}
int rk[],all=; int n,m,a[];
struct node{int l,r,k,id;
}q[],st[][];int ans[]; int suml[],sumr[],_sort[];
void solve(int ql,int qr,int l,int r,int ansl,int ansr)
{
if (ql>qr) return;
if (ansl==ansr)
{
for (int i=ql;i<=qr;i++) ans[q[i].id]=ansl;
return;
}
int ansmid=ansl+ansr>>,cnt=,js0=,js1=;
suml[l-]=sumr[l-]=;
for (int i=l;i<=r;i++)
{
suml[i]=a[i]<=ansmid;sumr[i]=a[i]>ansmid;
if (a[i]<=ansmid) _sort[++cnt]=a[i];
}
for (int i=l;i<=r;i++) if (a[i]>ansmid) _sort[++cnt]=a[i];
for (int i=l;i<r;i++) suml[i+]+=suml[i],sumr[i+]+=sumr[i];
for (int i=ql;i<=qr;i++)
if (suml[q[i].r+l-]-suml[q[i].l+l-]>=q[i].k)
{
st[][++js0]=q[i];
st[][js0].l=suml[q[i].l+l-];
st[][js0].r=suml[q[i].r+l-];
if (a[q[i].l+l-]>ansmid) ++st[][js0].l;
} else
{
st[][++js1]=q[i];
st[][js1].l=sumr[q[i].l+l-];
st[][js1].r=sumr[q[i].r+l-];
st[][js1].k-=suml[q[i].r+l-]-suml[q[i].l+l-];
if (a[q[i].l+l-]<=ansmid) ++st[][js1].l;
}
for (int i=;i<=js0;i++) q[i+ql-]=st[][i];
for (int i=;i<=js1;i++) q[i+ql+js0-]=st[][i];
for (int i=l;i<=r;i++) a[i]=_sort[i-l+];
solve(ql,ql+js0-,l,l+suml[r]-,ansl,ansmid);
solve(ql+js0,qr,l+suml[r],r,ansmid+,r);
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%d",&b[i].num);b[i].id=i;
}
sort(b+,b+n+,cmp);
for (int i=;i<=n;i++)
{
if (b[i].num!=b[i-].num) all++,rk[all]=b[i].num;
a[b[i].id]=all;
}
for (int i=;i<=m;i++)
{
scanf("%d%d%d",&q[i].l,&q[i].r,&q[i].k);q[i].id=i;
}
solve(,m,,n,,n);
for (int i=;i<=m;i++) printf("%d\n",rk[ans[i]]); }
[POJ2104]Kth Number-[整体二分]的更多相关文章
- POJ2104 K-th Number [整体二分]
题目传送门 K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 69053 Accepted: 24 ...
- POJ2104 K-th Number(整体二分)
题解 又一次做这个题上一次用的是线段树上二分.这次用的是整体二分.结果: (第一个是整体二分) 整体二分就是对于所有查询都二分一个值.然后根据能不能成立把询问修改分成两部分,然后第二部分继承第一部分的 ...
- POJ 2104:K-th Number 整体二分
感觉整体二分是个很有趣的东西. 在别人的博客上看到一句话 对于二分能够解决的询问,如果有多个,那么如果支持离线处理的话,那么就可以使用整体二分了 树套树写了一天还是WA着,调得焦头烂额,所以决定学cd ...
- POJ2104 K-th Number —— 区间第k小 整体二分
题目链接:https://vjudge.net/problem/POJ-2104 K-th Number Time Limit: 20000MS Memory Limit: 65536K Tota ...
- poj2104 k-th number 主席树入门讲解
poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树 刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...
- POJ2104 K-th Number(整体二分)
嘟嘟嘟 整体二分是一个好东西. 理解起来还行. 首先,需要牢记的是,我们二分的是答案,也就是在值域上二分,同时把操作分到左右区间中(所以操作不是均分的). 然后我就懒得讲了-- 李煜东的<算法竞 ...
- POJ2104 K-th number (整体二分)
刚学了整体二分,用这种解法来解决这道题. 首先对于每个询问时可以二分解决的,这也是可以使用整体二分的前提.将原来的序列看成是插入操作,和询问操作和在一起根据值域进行二分.用树状数组来检验二分值. 1 ...
- POJ2104 K-th Number[主席树]【学习笔记】
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 51440 Accepted: 17594 Ca ...
- [poj2104] K-th Number (主席树)
主席树 Description You are working for Macrohard company in data structures department. After failing y ...
- POJ2104 K-th Number(主席树)
题目 Source http://poj.org/problem?id=2104 Description You are working for Macrohard company in data s ...
随机推荐
- Mysql不带条件更新报错
执行命令SET SQL_SAFE_UPDATES = 0;修改下数据库模式即可: 恢复安全模式:SET SQL_SAFE_UPDATES = 1;
- 20155328 2016-2017-2 《Java程序设计》第九周学习总结
20155328 2016-2017-2 <Java程序设计>第九周学习总结 教材学习内容总结 16.1 JDBC入门 JDBC是Java联机数据库的标准规范,定义一组标准类与接口,应用程 ...
- robotframwork接口测试(四)—其他库的安装
怎么知道自己的RF已经有哪些库了,可以看python安装目录下Python27\Lib\site-packages这个文件夹,有的话就可以直接引入了. 没有的话,就安装了. 1. 命令安装:这种最方便 ...
- UVA - 11987 Almost Union-Find(带删除的并查集)
I hope you know the beautiful Union-Find structure. In this problem, you’re to implement something s ...
- vlc源码分析(三) 调用live555接收RTSP数据
首先了解RTSP/RTP/RTCP相关概念,尤其是了解RTP协议:RTP与RTCP协议介绍(转载). vlc使用模块加载机制调用live555,调用live555的文件是live555.cpp. 一. ...
- mysql查询某个数据库表的数量
在mysql中有个数据库information_schema下的表tables记录了所有数据库中所有的表相关信息 TABLE_SCHEMA 数据库名称 SELECT COUNT( * ) FROM i ...
- Linux---关闭Elasticsearch进程,并重新启动
有时候,当我们启动elasticsearch之后, 经过很长一段时间没有操作, 自己已经忘了是否已经启动了elasticsearch, 这时候我们可以通过下面的方式验证是否启动,并重新启动: step ...
- linux下安装swoole扩展
一.下载swoole 地址:https://github.com/swoole/swoole-src二.将下载好的压缩包放在linux服务器下三.解压压缩包到任意目录 # unzip swoole-s ...
- 解决Js跨域访问的问题
1,最近有个需求,用Js获取Html标签<input type="file"/>的路径!遇到代码拒绝访问,提示安全验证,不允许跨域访问,简单的设置一下浏览器即可,不过对 ...
- I、Python 环境搭建
I.安装Python https://www.python.org/downloads/windows/ 下载路径总是变,认准那个名字 安装, 记住,所有语言都推荐安装在 默认路径,不要相信那些让你改 ...