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-[整体二分]的更多相关文章

  1. POJ2104 K-th Number [整体二分]

    题目传送门 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 69053   Accepted: 24 ...

  2. POJ2104 K-th Number(整体二分)

    题解 又一次做这个题上一次用的是线段树上二分.这次用的是整体二分.结果: (第一个是整体二分) 整体二分就是对于所有查询都二分一个值.然后根据能不能成立把询问修改分成两部分,然后第二部分继承第一部分的 ...

  3. POJ 2104:K-th Number 整体二分

    感觉整体二分是个很有趣的东西. 在别人的博客上看到一句话 对于二分能够解决的询问,如果有多个,那么如果支持离线处理的话,那么就可以使用整体二分了 树套树写了一天还是WA着,调得焦头烂额,所以决定学cd ...

  4. POJ2104 K-th Number —— 区间第k小 整体二分

    题目链接:https://vjudge.net/problem/POJ-2104 K-th Number Time Limit: 20000MS   Memory Limit: 65536K Tota ...

  5. poj2104 k-th number 主席树入门讲解

    poj2104 k-th number 主席树入门讲解 定义:主席树是一种可持久化的线段树 又叫函数式线段树   刚开始学是不是觉得很蒙逼啊 其实我也是 主席树说简单了 就是 保留你每一步操作完成之后 ...

  6. POJ2104 K-th Number(整体二分)

    嘟嘟嘟 整体二分是一个好东西. 理解起来还行. 首先,需要牢记的是,我们二分的是答案,也就是在值域上二分,同时把操作分到左右区间中(所以操作不是均分的). 然后我就懒得讲了-- 李煜东的<算法竞 ...

  7. POJ2104 K-th number (整体二分)

    刚学了整体二分,用这种解法来解决这道题. 首先对于每个询问时可以二分解决的,这也是可以使用整体二分的前提.将原来的序列看成是插入操作,和询问操作和在一起根据值域进行二分.用树状数组来检验二分值. 1 ...

  8. POJ2104 K-th Number[主席树]【学习笔记】

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 51440   Accepted: 17594 Ca ...

  9. [poj2104] K-th Number (主席树)

    主席树 Description You are working for Macrohard company in data structures department. After failing y ...

  10. POJ2104 K-th Number(主席树)

    题目 Source http://poj.org/problem?id=2104 Description You are working for Macrohard company in data s ...

随机推荐

  1. angularJs的工具方法1

    一.angular.bind();   改this指向 <!DOCTYPE HTML> <html ng-app> <head> <meta http-equ ...

  2. 5、Dubbo-监控中心

    5.1).dubbo-admin 图形化的服务管理页面:安装时需要指定注册中心地址,即可从注册中心中获取到所有的提供者/消费者进行配置管理 5.2).dubbo-monitor-simple 简单的监 ...

  3. Emgu学习之(三)——操作图像数据

    Visual Studio Community 2015 工程和代码:http://pan.baidu.com/s/1jHmlQeE 内容 在这篇文章中将提到以下内容: 修改像素值 图像ROI 图像加 ...

  4. 树莓派 4G模块 PPP 拨号 NDIS 拨号

    资料参考:树莓派使用4G模块(华为ME909s-821)亲身尝试的可行方法(上)

  5. ubuntu配置telnet服务

    1.安装xinetd 以及telnetd #:~$ sudo apt-get install xinetd telnetd 2.配置文件(若文件不存在就手动添加文件和相应配置信息) 1): #:~$ ...

  6. NopCommerce学习(1) Caching

    redis教程 http://www.runoob.com/redis/redis-tutorial.html 下载地址:https://github.com/MSOpenTech/redis/rel ...

  7. ORACLE逐行累计求和方法(OVER函数)

    1.RANK ( ) OVER ( [QUERY_PARTITION_CLAUSE] ORDER_BY_CLAUSE ) DENSE_RANK ( ) OVER ( [QUERY_PARTITION_ ...

  8. @property & @synthesize & @dynamic 及相关属性作用探究

    @property : iOS6 引入关键词. @property name; 指示编译器自动生成 name 的 setter 和 getter 方法 : - (NSString *)name; - ...

  9. hiveSql常见错误记录

    1. In strict mode, if ORDER BY is specified, LIMIT must also be specified. 这个错误提示是因为在hive下写的sql使用了or ...

  10. 19-3-8Python中编码的进阶、文件操作初识、深浅copy

    编码的进阶 ASCII:英文字母,数字,特殊符号,——>  二进制的对应关系 Str: 1个字符——> 1个字节 Unicode:万国码:世界上所有的文字与二进制的对应关系 1个字符——& ...