区间价值?hihocoder1483《二分!!+尺取法》
来源:互联网 发布:淘宝助手上传宝贝教程 编辑:程序博客网 时间:2024/05/29 13:57
区间价值?hihocoder1483《二分!!+尺取法》
给定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*(n+1)/2种(每个数都相等)。区间一共也是n*(n+1)/2种,于是我们将答案从0~n*(n+1)/2二分查询。假设查到当前答案为x,如果知道区间价值大于x的,就能求出价值小于x的,如果大于x的区间比n*(n+1)/2-k大,说明x比正确答案小。
#include<iostream>#include<cstdio>#include<string.h>#include<algorithm>using namespace std;const int N=200010;long long n,k;int a[N],sor[N],temp[N];//sor,temp为离散化过渡数组int num[N];//区间里i出现的次数bool getsum(long long cnt){ long long res=0,sum=0; //sum为满足价值大于cnt的区间数,res为当前区间的价值 int head=1,en=1; memset(num,0,sizeof(num)); while(head<=n) { while(en<=n) { if(res+num[a[en]]<=cnt) { res+=num[a[en]]++; en+=1; } else break; } sum+=(n-en)+1; num[a[head]]-=1; res-=num[a[head]]; head+=1; } if(sum>(n+1)*n/2-k) return true; else return false;}long long getans(long long left,long long right){ while(left<right) { long long m=(left+right)/2; if(getsum(m)) left=m+1; else right=m; } return left;}int main(){ int T; scanf("%d",&T); sor[0]=0; int tot; while(T--) { tot=0; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); sor[i]=a[i]; } sort(sor+1,sor+n+1); for(int i=1;i<=n;i++) //离散 { if(sor[i]==sor[i-1]) continue; temp[tot++]=sor[i]; } for(int i=1;i<=n;i++) { a[i]=lower_bound(temp+0,temp+tot-1,a[i])-temp; } long long ans=getans(0,n*(n+1)/2); printf("%lld\n",ans); }return 0;}
阅读全文
0 0
- 区间价值?hihocoder1483《二分!!+尺取法》
- 尺取法 枚举区间
- hihocoder 1483 区间价值(二分+双指针)
- 51NOD1495 中国好区间 【尺取法】
- POJ 3061 Subsequence 二分或者尺取法
- POJ 3061 Subsequence 二分或者尺取法
- POJ 3061 Subsequence(二分/尺取法)
- poj3061(二分前缀和或者尺取法)
- day_6-acm 二分查找+尺取法
- la2678(前缀和,二分/尺取法)
- poj 3579 二分加尺取法
- 51nod 1686 二分+尺取法
- poj 3061 Subsequence(二分,尺取法)
- POJ 3061-Subsequence(尺取法,二分)
- 【尺取法/二分+优化】Audition SPOJ
- 【尺取法】swpu涨姿势之区间刷新
- hdu6103Kirinriki(第六场尺取法取区间最大)
- 小小粉丝度度熊--尺取法、合并一些重复的区间。
- HDU
- Java IO基础
- Leetcode#9. Palindrome Number(回文数)
- 关于页面跳转的一些总结 浏览器对象与页面刷新 -- JAVA web
- 解决 error C1083: 无法打开预编译头文件xxx.pch: No such file or directory
- 区间价值?hihocoder1483《二分!!+尺取法》
- Unity克隆游戏对象
- CART之回归树构建
- angular demo1
- 使用opencv2查看图片彩色直方图
- hdu1203 I NEED A OFFER!(01背包)
- The Super Powers
- vue项目搭建(vue-cli)以及其他配置
- HDU 5978 && 2016ICPC大连 H: To begin or not to begin