原题:

题意:

给你一个长度为N的正整数组A,对于这个数组的所有子区间,若长度小于k则不管它,若长度大于等于k则取第k大放入数组B

问你B中第M大的数是谁

一眼序列分治,然而没思路

数据结构?能想到从大到小排序,然后小于第i个数的都视为1,用数据结构维护第i个数在多少个区间是第k大

然后就没有然后了……

序列分治和数据结构自闭了两个小时,最后才想起来试试别的思路

比如DP或二分什么的

终于灵稽一动

答案满足二分单调性

二分的答案m越大,[m+1,n]中的数作为第k大的区间的总数量就越大

那么二分一个答案m,问题转化为求[m+1,n]中的数作为第k大的区间的总数量

因为只需要[m+1,n]中的任意一个数作为第k大,而[1,m]的数没有任何用,可以无视

那么可以把大于m的数看成1,小于等于m的数k看成0

问题转化为统计有多少个子区间,使得区间内有k个1

只需要O(n)复杂度,可以双指针,左边指针i每次加1,如果经过1就让区间中1的减1,如果1的个数小于k,就让右边的指针j往右跑到刚好等于k为止,把n-j+1统计到结果即可

注意二分的写法,容易写错

代码:

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define LL long long
int rd(){int z=,mk=; char ch=getchar();
while(ch<''||ch>''){if(ch=='-')mk=-; ch=getchar();}
while(ch>=''&&ch<=''){z=(z<<)+(z<<)+ch-''; ch=getchar();}
return z*mk;
}
int n,o; LL m;
int a[];
int b[];
LL cclt(int x){
for(int i=;i<=n;++i) b[i]=(a[i]>=x);
LL bwl=;
for(int i=,j=,k=;i<=n && j<=n;++i){
for(;k!=o && j<n;) k+=b[++j];
if(j>n || (j==n && k!=o)) break;
bwl+=n-j+;
k-=b[i];
}
return bwl;
}
int bnrsch(int x,int y){
int l=x,r=y,md;
while(l+<r){
md=(l+r)>>;
(cclt(md)>=m ? l : r)=md;
}
return cclt(r)>=m ? r : l;
}
int main(){
//freopen("ddd.in","r",stdin);
int T; cin>>T;
while(T --> ){
cin>>n>>o>>m;
int mx=,mn=;
for(int i=;i<=n;++i){
a[i]=rd();
mx=max(mx,a[i]);
mn=min(mn,a[i]);
}
printf("%d\n",bnrsch(mn,mx));
}
return ;
}

【2017中国大学生程序设计竞赛-哈尔滨站】B - K-th Number的更多相关文章

  1. HDU6237-A Simple Stone Game-找素因子(欧拉函数)-2017中国大学生程序设计竞赛-哈尔滨站-重现赛

    A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  2. HDU6235-Permutation-水题-2017中国大学生程序设计竞赛-哈尔滨站-重现赛

    Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Tot ...

  3. HDU 6237.A Simple Stone Game-欧拉函数找素因子 (2017中国大学生程序设计竞赛-哈尔滨站-重现赛)

    A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  4. HDU 6235.Permutation (2017中国大学生程序设计竞赛-哈尔滨站-重现赛)

    Permutation Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Tot ...

  5. 2017中国大学生程序设计竞赛-哈尔滨站 Solution

    A - Palindrome 题意:给出一个字符串,找出其中有多少个子串满足one-half-palindromic 的定义 思路:其实就是找一个i, j  使得 以i为中轴的回文串长度和以j为中轴的 ...

  6. 2017中国大学生程序设计竞赛-哈尔滨站 A - Palindrome

    Palindrome Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Tota ...

  7. 2017中国大学生程序设计竞赛-哈尔滨站 H - A Simple Stone Game

    A Simple Stone Game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Ot ...

  8. HDU 6273.Master of GCD-差分数组 (2017中国大学生程序设计竞赛-杭州站-重现赛(感谢浙江理工))

    Super-palindrome 题面地址:http://acm.hdu.edu.cn/downloads/CCPC2018-Hangzhou-ProblemSet.pdf 这道题是差分数组的题目,线 ...

  9. 2017中国大学生程序设计竞赛 - 女生专场 Deleting Edges(思维+最短路)

    Deleting Edges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

随机推荐

  1. guns系统部署方式及常见问题

    项目框架:guns 开发IDE:Idea 2018.1 两种打包方式:war 和jar. 1.正常打包的姿势 1.1按照下图修改为你想到打包的方式. ​ 1.2 执行打包 ​​ clean packa ...

  2. CSS - Animate动画

    下载地址:https://daneden.github.io/animate.css/ 关键CSS样式:animate.css 引入CSS样式 <link rel="styleshee ...

  3. smoothscroll

    smoothscroll是一款jQuery插件,可以平滑地滚动到指定的地方. 可以解决chrome锚点失效的问题. 官方网站 http://iamdustan.com/smoothscroll/ gi ...

  4. 数据库工具DbVisualize安装、破解教程,亲测可用

    之前工作中遇到生产环境不允许导入Oracle的dmp文件,只能导入sql脚本,但是表中存在clob字段,直接用plsql工具无法导出clob字段,用了下dbvisualizer可以直接导出,亲测可用. ...

  5. 论文阅读 | ERNIE: Enhanced Representation through Knowledge Integration

    摘要 知识加强的语义表示模型. knowledge masking strategies  :  entity-level  masking   / phrase-level masking    实 ...

  6. [转帖]Linux 下实践 VxLAN:虚拟机和 Docker 场景

    Linux 下实践 VxLAN:虚拟机和 Docker 场景 https://www.cnblogs.com/bakari/p/11264520.html 实践了下 没问题 作者写的很perfect ...

  7. 关于 resultType 与 parameterType 的基本使用的区别

    以下关于      resultType    与    parameterType   的基本使用的区别 : 1.使用  resultType :   主要针对于从数据库中提取相应的数据出来 2.使 ...

  8. 如何给django admin.py配置超级管理员?注册表格?

    admin.py是django给我们提供的功能非常强大的后台,况且支持拓展,,如果你要是觉得admin的后台不够牛逼你可以自己写一个!如何自己写一个后台,后面我有时间了会给大家更新!一起学习!一起进步 ...

  9. python3列表、元组

    列表.元组操作 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作.列表中的每个元素都分配一个数字也就是它的位置,或叫索引,第一个索引是0,第二个索引是1,依此类推. ...

  10. MySql常用字符集

    常用字符集 位(bit):是计算机 内部数据 储存的最小单位,11001100是一个八位二进制数. 字节(byte):是计算机中 数据处理 的基本单位,习惯上用大写 B 来表示,1B(byte,字节) ...