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[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 区间最值相关推荐
- 牛客网【每日一题】7月21日题目精讲—区间权值
来源:牛客网: 区间权值 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097152K 64bit IO Format: %lld 题目描述 输入描述: ...
- RMQ问题-ST表倍增处理静态区间最值
简介 ST表是利用倍增思想处理RMQ问题(区间最值问题)的一种工具. 它能够做到O(nlogn)预处理,O(1)查询的时间复杂度,效率相当不错. 算法 1.预处理 ST表利用倍增的思想.以洛谷的P38 ...
- RMQ算法,求区间最值
poj 3264 Balanced Lineup@ 2016-07-27 11:15 49人阅读 评论(0) 收藏 举报 分类: RMQ(Range MinimumMaximum Quer)(4) ...
- 问题 G: 区间权值
问题 G: 区间权值 时间限制: 1 Sec 内存限制: 128 MB 提交: 112 解决: 49 [提交] [状态] [讨论版] [命题人:admin] 题目描述 小Bo有n个正整数a1..a ...
- Segment Tree Beats 区间最值问题
Segment Tree Beats 区间最值问题 线段树一类特殊技巧! 引出:CF671C Ultimate Weirdness of an Array 其实是考试题,改题的时候并不会区间取最值,区 ...
- RMQ(求区间最值问题)
学习博客:https://blog.csdn.net/qq_31759205/article/details/75008659 RMQ(Range Minimum/Maximum Query),即区间 ...
- hdu1754 I hate it线段树模板 区间最值查询
题目链接:这道题是线段树,树状数组最基础的问题 两种分类方式:按照更新对象和查询对象 单点更新,区间查询; 区间更新,单点查询; 按照整体维护的对象: 维护前缀和; 维护区间最值. 线段树模板代码 # ...
- 【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]里的每个数 ...
- 【bzoj4695】最假女选手 线段树区间最值操作
题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作: 1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] ...
最新文章
- Android Dialog 弹出的时候标题栏闪烁一下的处理方法
- R语言当前目录获取及设置函数(getwd setwd)实战
- 搞懂了这几点,你就学会了Web编程
- webpack 多页面 html,webpack打包多页应用,如何处理不同html页面(通过a标签)之间的跳转?...
- python怎么玩pdf_如何使用Python玩转PDF各种骚操作?
- 光盘显示容量但读不出文件_软网推荐:文件夹容量属性增强显示
- HT For Web 拓扑图背景设置
- 在WinAVR中设置Makefile自动编译多个源文件
- docker linux 快速开窗口_Linux搭建docker环境并简单实用
- docker host and docker container
- python调用nacos账号密码_python-nacos-sdk
- P1068 分数线划定
- Spring框架最终注解标签注入方法
- 数学智力题 武士数独题目_数学智力题九宫格
- 英语教学计划软件测试,第一学期英语教学计划
- ▶GODOT 101
- SQLiteDatabaseLockedException: database is locked
- android跳转到应用市场并进入指定包名的应用详情
- 定时监控服务端口是否正常 发送邮件
- precision与Recall
热门文章
- 如何启动netcat_Netcat用法
- Linux 底层原理 —— epoll 与多路复用
- MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?
- php项目的建立,PHP开发-ZendStudio初学教程-建立PHP项目
- java切换jdk版本_切换JDK版本quick
- mysql key_mysql 索引 key 的用法
- 基于Java+SpringBoot+vue+element实现物流管理系统
- Java1.7之后Arrays.sort对数组排序DualPivotQuicksort.sort
- ❤️六W字《计算机基础知识》(四)(建议收藏)❤️
- Java 查找链表中的元素