HihoCoder - 1483 区间最值
给定n个数A1...An,小Ho想了解AL..AR中有多少对元素值相同。小Ho把这个数目定义为区间[L,R]的价值,用v[L,R]表示。
例如1 1 1 2 2这五个数所组成的区间的价值为4。
现在小Ho想知道在所有的的v[L,R](1 <= L <= R <= n)中,第k小的值是多少。
Input
第一行一个数T(T<=10),表示数据组数。
对于每一组数据:
第一行两个数n,k(1<=n<=200,000,1<=k<=n*(n+1)/2)
第二行n个数A1…An(1<=Ai<=1,000,000,000)
Output
一个数表示答案。
Sample Input
2
4 7
1 1 2 3
3 6
100 100 100
Sample Output
0
3 题意:我们给出n个数,我们求任意一段区间,他们相同的数的次数就是区间的值,然后我们按值排序求第k个区间的值是多少 思路:开始我用的n2,果断超时。。然后我们看到ai的范围有这么大,我们又要记录次数,显然我们可以用map,但是我用map也超时了,
所以有个高级的操作,因为n的范围数组能开的下,只是ai值大而已,所以我们可以离散化,然后我们想一下,怎么求答案呢,如果我们直接求出所有的区间再排序输出的话n2复杂度
所以发现不行,我们仔细想想,我们能得知我们区间长度越小,我们的区间值肯定更小,我们可以二分去处理,二分的话最小值是0没有一个相同,最大的时候也就是全部的数都相同,可以推出是n*(n-1)/2
因为我们要求是求第k个区间的值,那么我们就只要去寻找判断,小于当前数的区间个数有多少个,如果小于这个数的区间比k还大的话,说明我们当前的数肯定比我们要求的小,所以我们向右扩展,反之亦然 然后我们想如何去求多少个区间比他小呢?
我们可以不用求出所有区间的值为什么呢,因为我们区间的个数和值的大小息息相关
如果[l.r]是比k小的,那么[l,r-1],[l,r-2]....[l,l]都是小于k的数,这里就用到了我们的尺取法
那么我们就把它变成了一个nlogn的算法
#include<cstdio>
#include<cmath>
#include<cstring>
#include<map>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[];
ll t,n,m,temp[];
ll vis[];
ll check(ll mid)//尺取求比mid小的区间个数
{
int i,j;
ll sum=;
ll num=;
memset(vis,,sizeof(vis));
for(i=,j=;i<n;i++)
{
for(;j<n&&sum+vis[a[j]]<=mid;j++)
{
sum+=vis[a[j]];
vis[a[j]]++;
}
num+=j-i;//尺取思想核心
vis[a[i]]--;
sum-=vis[a[i]];
}
return num>=m;
}
int main()
{
ll ans;
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld",&n,&m);
for(int i=;i<n;i++)
{
scanf("%lld",&a[i]);
temp[i]=a[i];
}
int cnt;
sort(temp,temp+n);//离散化
cnt = unique(temp,temp+n) - temp;
for(int i = ; i < n ; ++i)a[i] = lower_bound(temp,temp+cnt,a[i]) - temp;
ll left=,right=((ll)n*((ll)n-))/;
while(left<=right)
{
ll mid=(left+right)/;
if(check(mid))//如果小于mid的区间个数比m多的话,说明值还不够小
{
ans=mid;
right=mid-;
}
else{
left=mid+;
}
}
printf("%lld\n",ans);
}
}
HihoCoder - 1483 区间最值的更多相关文章
- HDU 1754 I Hate It(线段树单点替换+区间最值)
I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...
- hdu1754 I hate it线段树模板 区间最值查询
题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...
- HDU 1754区间最值 & SPLAY
真是亲切的1754啊..第一道傻逼版的线段树做的是这个,后来学了zkw做的是这个,在后来决定打lrj线段树又打了一遍,如今再用splay和老朋友见面 从上到下依次为:加了读入优化的splay,sp ...
- HDU-1754I Hate It 线段树区间最值
这道题比较基本,就是用线段树维护区间最值,可以算是模板吧-.. I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768 ...
- HDU 1754 I Hate It(线段树单点更新区间最值查询)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu2852KiKi's K-Number(区间K值)
http://acm.hdu.edu.cn/showproblem.php?pid=2852 区间K值写错了... #include <iostream> #include<cstd ...
- RAM区间最值
RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...
- 【HDU】1754 I hate it ——线段树 单点更新 区间最值
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 【POJ】3264 Balanced Lineup ——线段树 区间最值
Balanced Lineup Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 34140 Accepted: 16044 ...
随机推荐
- 【消息队列】kafka是如何保证消息不被重复消费的
一.kafka自带的消费机制 kafka有个offset的概念,当每个消息被写进去后,都有一个offset,代表他的序号,然后consumer消费该数据之后,隔一段时间,会把自己消费过的消息的offs ...
- p1465 Preface Numbering
用这个函数转成罗马数字统计就行了. #include <iostream> #include <cstdio> #include <cmath> #include ...
- php url处理
http_build_query() $data = array("name"=>"callback" , "value"=>& ...
- Maxim and Array CodeForces - 721D (贪心)
大意: 给定序列, 每次操作选择一个数+x或-x, 最多k次操作, 求操作后所有元素积的最小值 贪心先选出绝对值最小的调整为负数, 再不断选出绝对值最小的增大它的绝对值 #include <io ...
- [Fiddler] ReadResponse() failed: The server did not return a complete response for this request. Server returned 0 bytes.
待解决 [Fiddler] ReadResponse() failed: The server did not return a complete response for this request. ...
- mysql创建存储过程,批量建表分表00到99
这里以sqlyong为软件示例: --创建存储过程DELIMITER $$ CREATE PROCEDURE `createTablesWithIndex`() BEGIN DECLARE `@i` ...
- ubuntu开启慢日志
ubuntu 开启mysql日志记录 1.找到mysql的配置文件sudo vim /etc/mysql/my.cnf将下面两行的#去掉#general_log_file = /var/log/mys ...
- leetcode-algorithms-16 3Sum Closest
leetcode-algorithms-16 3Sum Closest Given an array nums of n integers and an integer target, find th ...
- iphone手机在网页返回上一页时,部分字体变大问题
最近做一个项目是,发现了一个iphone的兼容性问题,在返回上一页后,部分字体会变大,刷新就会正常. 经过总结,发现都是span标签里面的字体变大.经过查询发现,需要给span添加一个属性:displ ...
- Lexicography
An anagram of a string is any string that can be formed using the same letters as the original. (We ...