[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 ...
随机推荐
- centos虚拟机安装,配置静态ip可以访问网络
centos安装过程中需要注意几个问题 1.选择安装的软件 默认选择的是mininal,应该选择GNEME Desktop 安装的过程中可以设置network 配置linux网络命令 具体配置 退出键 ...
- 学习T-io框架,从写一个Redis客户端开始
前言 了解T-io框架有些日子了,并且还将它应用于实战,例如 tio-websocket-server,tio-http-server等.但是由于上述两个server已经封装好,直接应用就可以.所 ...
- ethereumjs/ethereumjs-vm-5-vm对象
1.运行文件 var Buffer = require('safe-buffer').Buffer // use for Node.js <4.5.0 var VM = require('./i ...
- USDT/BTC/ETC/HT的解释
USDT 泰达币 泰达币(USDT)是Tether公司推出的基于稳定价值货币美元(USD)的代币Tether USD(下称USDT),1USDT=1美元,用户可以随时使用USDT与USD进行1:1兑换 ...
- [LuoguP2158][SDOI2008]仪仗队
[LuoguP2158][SDOI2008]仪仗队(Link) 现在你有一个\(N \times N\)的矩阵,求你站在\((1,1)\)点能看到的点的总数. 很简洁的题面. 这道题看起来很难,但是稍 ...
- H.264的码率控制:CBR和VBR
CBR: Constants Bits Rate, 静态比特率. 比特率在流的进行过程中基本保持恒定并且接近目标比特率,当对复杂内容编码时质量会下降. 在流式播放方案中使用CBR编码最为有效;优点是带 ...
- Vue学习—Vue写一个图片轮播组件
1.先看效果: 熟悉的图片轮播,只要是个网站,百分之90以上会有个图片轮播.我认为使用图片轮播. 第一可以给人以一种美观的感受,而不会显得网站那么呆板, 第二可以增加显示内容,同样的区域可以显示更多内 ...
- Android开发之自己定义TabHost文字及背景(源码分享)
使用TabHost 能够在一个屏幕间进行不同版面的切换,而系统自带的tabhost界面较为朴素,我们应该怎样进行自己定义改动优化呢 MainActivity的源码 package com.dream. ...
- 安装Windows7步骤
我初次装Linux系统的时候,查过一些资料,然后也有网友教过我,这里做一个总结,和大家分享一下(U盘安装). 事实上我们平时电脑开机的时候,是有个启动顺序的,他并非直接进入我们的操作系统, ...
- Web—11-手机端页面适配
流式布局: 就是百分比布局,非固定像素,内容向两侧填充,理解成流动的布局,成为流式布局 视觉窗口: viewport是移动端持有.这是一个虚拟的区域,承载网页的. 承载关系:浏览器—->view ...