[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 ...
随机推荐
- echarts仪表盘配置参数
require.config({ paths:{ echarts:"js/chart" } }); require([ 'echarts', 'echarts/chart/gaug ...
- css3鼠标经过出现转圈菜单(仿)
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...
- Java并发案例04---Future和 FutureTask
4.Future和 FutureTask 4.1 Future是Callable的返回结果. 它有三个功能 1.判断任务是否完成 2.能够中断任务 3.能够获取任务返回结果 4.2 FutureTas ...
- 3504. [CQOI2014]危桥【最大流】
Description Alice和Bob居住在一个由N座岛屿组成的国家,岛屿被编号为0到N-1.某些岛屿之间有桥相连,桥上的道路是双 向的,但一次只能供一人通行.其中一些桥由于年久失修成为危桥,最多 ...
- BZOJ2599:[IOI2011]Race(点分治)
Description 给一棵树,每条边有权.求一条简单路径,权值和等于K,且边的数量最小.N <= 200000, K <= 1000000 Input 第一行 两个整数 n, k 第二 ...
- 日常踩坑——Dev C++ pow()函数的坑
坑 Dev C++ pow()函数 那年冬天,显示屏前坐着如喽啰,那时候我含泪发誓,再也不用Dev. 蓝桥杯官网给提供的版本,没办法bug也得硬着头皮用. 16年蓝桥杯的第八题 四平方和定理: 在De ...
- Spyder中figure显示设置
Spyder是Python的一个IDE.和其他的Python的IDE相比,它最大的优点就是模仿MATLAB的“工作空间”的功能,可以很方便地观察和修改数组的值. 如果不是进行大规模的工程开发,重点专注 ...
- HTML5本地存储(Local Storage) 的前世今生
长久以来本地存储能力一直是桌面应用区别于Web应用的一个主要优势.对于桌面应用(或者原生应用),操作系统一般都提供了一个抽象层用来帮助应用程序保存其本地数据 例如(用户配置信息或者运行时状态等). 常 ...
- datetable dt.select使用詳情
当你从数据库里取出一些数据,然后要对数据进行整合,你很容易就会想到: 1DataTable dt = new DataTable();//假设dt是由"SELECT C1,C2,C3 FRO ...
- java的四舍五入
四舍五入是我们小学的数学问题,这个问题对于我们程序猿来说就类似于1到10的加减乘除那么简单了.在讲解之间我们先看如下一个经典的案例: public static void main(String[] ...