给定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[200001];
ll t,n,m,temp[200001];
ll vis[200001];
ll check(ll mid)//尺取求比mid小的区间个数
{int i,j;ll sum=0;ll num=0;memset(vis,0,sizeof(vis));for(i=0,j=0;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=0;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 = 0 ; i < n ; ++i)a[i] = lower_bound(temp,temp+cnt,a[i]) - temp;ll left=0,right=((ll)n*((ll)n-1))/2;while(left<=right){ll mid=(left+right)/2;if(check(mid))//如果小于mid的区间个数比m多的话,说明值还不够小{ans=mid;right=mid-1;}else{left=mid+1;}}printf("%lld\n",ans);}
}

转载于:https://www.cnblogs.com/Lis-/p/9393788.html

HihoCoder - 1483 区间最值相关推荐

  1. 牛客网【每日一题】7月21日题目精讲—区间权值

    来源:牛客网: 区间权值 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097152K 64bit IO Format: %lld 题目描述 输入描述: ...

  2. RMQ问题-ST表倍增处理静态区间最值

    简介 ST表是利用倍增思想处理RMQ问题(区间最值问题)的一种工具. 它能够做到O(nlogn)预处理,O(1)查询的时间复杂度,效率相当不错. 算法 1.预处理 ST表利用倍增的思想.以洛谷的P38 ...

  3. RMQ算法,求区间最值

    poj 3264 Balanced Lineup@ 2016-07-27 11:15 49人阅读 评论(0) 收藏 举报  分类: RMQ(Range MinimumMaximum Quer)(4)  ...

  4. 问题 G: 区间权值

    问题 G: 区间权值 时间限制: 1 Sec  内存限制: 128 MB 提交: 112  解决: 49 [提交] [状态] [讨论版] [命题人:admin] 题目描述 小Bo有n个正整数a1..a ...

  5. Segment Tree Beats 区间最值问题

    Segment Tree Beats 区间最值问题 线段树一类特殊技巧! 引出:CF671C Ultimate Weirdness of an Array 其实是考试题,改题的时候并不会区间取最值,区 ...

  6. RMQ(求区间最值问题)

    学习博客:https://blog.csdn.net/qq_31759205/article/details/75008659 RMQ(Range Minimum/Maximum Query),即区间 ...

  7. hdu1754 I hate it线段树模板 区间最值查询

    题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...

  8. 【bzoj4355】Play with sequence 线段树区间最值操作

    题目描述 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C. 2)给出参数U,V,C,对于区间[U,V]里的每个数 ...

  9. 【bzoj4695】最假女选手 线段树区间最值操作

    题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作: 1.给一个区间[L,R] 加上一个数x  2.把一个区间[L,R] 里小于x 的数变成x  3.把一个区间[L,R] ...

最新文章

  1. Android Dialog 弹出的时候标题栏闪烁一下的处理方法
  2. R语言当前目录获取及设置函数(getwd setwd)实战
  3. 搞懂了这几点,你就学会了Web编程
  4. webpack 多页面 html,webpack打包多页应用,如何处理不同html页面(通过a标签)之间的跳转?...
  5. python怎么玩pdf_如何使用Python玩转PDF各种骚操作?
  6. 光盘显示容量但读不出文件_软网推荐:文件夹容量属性增强显示
  7. HT For Web 拓扑图背景设置
  8. 在WinAVR中设置Makefile自动编译多个源文件
  9. docker linux 快速开窗口_Linux搭建docker环境并简单实用
  10. docker host and docker container
  11. python调用nacos账号密码_python-nacos-sdk
  12. P1068 分数线划定
  13. Spring框架最终注解标签注入方法
  14. 数学智力题 武士数独题目_数学智力题九宫格
  15. 英语教学计划软件测试,第一学期英语教学计划
  16. ▶GODOT 101
  17. SQLiteDatabaseLockedException: database is locked
  18. android跳转到应用市场并进入指定包名的应用详情
  19. 定时监控服务端口是否正常 发送邮件
  20. precision与Recall

热门文章

  1. 如何启动netcat_Netcat用法
  2. Linux 底层原理 —— epoll 与多路复用
  3. MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?
  4. php项目的建立,PHP开发-ZendStudio初学教程-建立PHP项目
  5. java切换jdk版本_切换JDK版本quick
  6. mysql key_mysql 索引 key 的用法
  7. 基于Java+SpringBoot+vue+element实现物流管理系统
  8. Java1.7之后Arrays.sort对数组排序DualPivotQuicksort.sort
  9. ❤️六W字《计算机基础知识》(四)(建议收藏)❤️
  10. Java 查找链表中的元素