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
- 题意:
- 思路:先离散化,然后二分答案,check的时候用尺取法取计算有多少个区间的价值<=mid,然后和k比较,复杂度为O(n*logn)
代码:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long LL;
- const int maxn=2e5+10;
- int a[maxn],n,vis[maxn],num[maxn],tep[maxn];
- LL k;
- int check(LL x)
- {
- int l=1;
- LL sum=0,ans=0;
- for(int i=1;i<=n;i++)vis[a[i]]=0;
- for(int i=1;i<=n;i++)
- {
- sum=sum+vis[a[i]];
- vis[a[i]]++;
- while(sum>x&&l<=i)
- {
- vis[a[l]]--;
- sum-=vis[a[l]];
- l++;
- }
- ans=ans+(i-l+1);
- }
- if(ans>=k)return 1;
- return 0;
- }
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- scanf("%d%lld",&n,&k);
- int cnt=0;
- for(int i=1;i<=n;i++)scanf("%d",&a[i]),tep[i]=a[i];
- sort(tep+1,tep+n+1);
- for(int i=1;i<=n;i++)
- {
- if(tep[i]==tep[i-1])continue;
- else num[cnt++]=tep[i];
- }
- for(int i=1;i<=n;i++)a[i]=lower_bound(num,num+cnt,a[i])-num;
- LL l=0,r=(LL)(n-1)*n/2;
- while(l<=r)
- {
- LL mid=(l+r)>>1;
- if(check(mid))r=mid-1;
- else l=mid+1;
- }
- cout<<r+1<<endl;
- }
- return 0;
- }
hihocoder-1483区间价值 (二分+尺取法)的更多相关文章
- 51nod-1686 第K大区间(二分+尺取法)
题目链接: 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数 ...
- 51nod 1564 区间的价值 | 分治 尺取法
51nod 1564 区间的价值 题面 一个区间的价值是区间最大值×区间最小值.给出一个序列\(a\), 求出其中所有长度为k的子区间的最大价值.对于\(k = 1, 2, ..., n\)输出答案. ...
- HihoCoder - 1483 区间最值
给定n个数A1...An,小Ho想了解AL..AR中有多少对元素值相同.小Ho把这个数目定义为区间[L,R]的价值,用v[L,R]表示. 例如1 1 1 2 2这五个数所组成的区间的价值为4. 现在小 ...
- HDU - 6231 K-th Number (2017CCPC哈尔滨站 二分+尺取法)
Alice are given an array A[1..N] with N numbers. Now Alice want to build an array B by a parameter K ...
- luogu 1712 区间(线段树+尺取法)
题意:给出n个区间,求选择一些区间,使得一个点被覆盖的次数超过m次,最小的花费.花费指的是选择的区间中最大长度减去最小长度. 坐标值这么大,n比较小,显然需要离散化,需要一个技巧,把区间转化为半开半闭 ...
- POJ 3061 Subsequence ( 二分 || 尺取法 )
题意 : 找出给定序列长度最小的子序列,子序列的和要求满足大于或者等于 S,如果存在则输出最小长度.否则输出 0(序列的元素都是大于 0 小于10000) 分析 : 有关子序列和的问题,都可以考虑采用 ...
- 51Nod 1686 第K大区间(离散化+尺取法)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意: 思路: 第K大值,所以可以考虑二分法,然后用尺取法去扫描, ...
- luogu P1712 [NOI2016]区间 贪心 尺取法 线段树 二分
LINK:区间 没想到尺取法. 先说暴力 可以发现答案一定可以转换到端点处 所以在每个端点从小到大扫描线段就能得到答案 复杂度\(n\cdot m\) 再说我的做法 想到了二分 可以进行二分答案 从左 ...
- poj_2739 尺取法
题目大意 给定一个数字N,N可能由1个或多个连续的素数求和得到,比如41 = 2+3+5+7+11+13, 41 = 11+13+17, 41 = 41.求出对于N,所有可能的组合形式. 题目分析 先 ...
随机推荐
- Delphi 正则表达式语法(5): 边界
Delphi 正则表达式语法(5): 边界 // \b 单词边界 var reg: TPerlRegEx; begin reg := TPerlRegEx.Create(nil); reg ...
- zend studio设置utf8
1. windows -> preference -> general -> workspace 2.项目右键 -> properities -> resource 3. ...
- xshell下载安装
打开网址http://www.netsarang.com/download/software.html 找到最新版的xshell,点击下载 在跳转的页面填写个人信息,许可证类型选择家庭和学校使用,除了 ...
- java栈的实现
可以采用数组与链表两种方法来实现栈. 1.用数组实现栈 import java.util.Arrays; public class MyStack<E>{ private Object[] ...
- SET 语句积累
SET IDENTITY_INSERT 表名字 off 注解: 把值插入到自动编号(或者说是标识列,IDENTITY)中去,需要设定 SET IDENTITY_INSERT 语法:SET IDENTI ...
- yum安装mysql后root用户的临时密码
1.查看root用户临时随机密码 yum 安装mysql后,无法通过空密码登录数据库,如下: [root@ mysql]# mysql -u root -p Enter password: ERROR ...
- m2eclipse插件——添加依赖不显示搜索结果
使用Eclipse,安装m2eclipse插件之后,选中Maven项目的pom文件,添加依赖,点击“Add Dependency”的时候,输入要检索的jar包名称,search result却一直为空 ...
- LeetCode——Sum of Two Integers
LeetCode--Sum of Two Integers Question Calculate the sum of two integers a and b, but you are not al ...
- nginx+tomcat网页动静分离配置
1.环境描述 nginx server (Proxy):192.168.1.135(作为代理服务器)WEB server1: 192.168.1.138(使用tomcat作为web容器)WEB ser ...
- 二路归并排序,利用递归,时间复杂度o(nlgn)
public class MergeSort { public void mergeSort(int[]data, int left, int right) { if(left >= right ...