51Nod【1686】——1686 第K大区间(尺取+二分)

原创 2016年08月28日 17:02:01
基准时间限制:1 秒 空间限制:131072 KB

定义一个区间的值为其众数出现的次数。
现给出n个数,求将所有区间的值排序后,第K大的值为多少。
众数(统计学/数学名词)_百度百科

Input

第一行两个数n和k(1<=n<=100000,k<=n*(n-1)/2)
第二行n个数,0<=每个数<2^31

Output

一个数表示答案。

Input示例

4 2
1 2 3 2

Output示例

2

看到一脸懵逼,后来发现看错题了。。。。。,由于值最后价值为[1,n],所以我们可以通过二分,去检查二分出来的值是否正确,大于它的是否为k-1个。检验的时候可以通过尺取的方式。

#include <bits/stdc++.h>
#define fread(x) freopen(x,"r",stdin)
#define fwrite(x) freopen(x,"w",stdout)
using namespace std;
typedef long long LL;
const int Max = 1e6;
LL arr[Max],a[Max];
int Ls[Max];
int n,k;
int num[Max];
bool ok(int s) {
    memset(num,0,sizeof(num));
    LL nu = 0; int L = 1;
    for(int i = 1;i<=n;i++ ){
        num[Ls[i]]++;
        if(num[Ls[i]] > s) {
            while(num[Ls[i]]> s) {
                nu+=(n-i+1);
                num[Ls[L++]]--;
            }
        }
        if(nu >= k) return false;
    }
    return nu<=k;
}
int Solve() {
    int L = 1,R = n,ans =  1;
    while(L<=R) {
        int mid = (L+R)>>1;
        if(ok(mid)) {
            ans = mid;
            R = mid-1;
        }
        else L = mid+1; 
    }
    return ans;
}
int main() {
    scanf("%d %d",&n,&k);
    for(int i =1 ; i<=n;i++) {
        scanf("%lld",&arr[i]);
        a[i] = arr[i];
    }
    sort(arr+1,arr+n+1);
    arr[0] = 1;
    for(int i = 2;i <= n;i++) if(arr[arr[0]] != arr[i]) arr[++arr[0]] = arr[i];
    for(int i = 1;i <= n;i++) Ls[i] = lower_bound(arr+1,arr+arr[0]+1,a[i])-arr;
    printf("%d\n",Solve());
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

51Nod-1686-第K大区间

ACM模版描述题解十分有意思的二分,二分第k大的数是多少,设为mid,然后cala(mid),只要计算出有多少个区间的众数的次数是>= mid的即可。使用尺取法+二分可以实现O(nlogn)复杂度的算...
  • f_zyj
  • f_zyj
  • 2016年10月06日 00:28
  • 768

51nod1686 第K大区间

链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意:中文题。 分析:二分答案就行了。但是!有一个坑,k...
  • Fsss_7
  • Fsss_7
  • 2016年03月30日 20:22
  • 443

51Nod【1686】——1686 第K大区间(尺取+二分)

51Nod 1686 第k大区间 基准时间限制:1 秒 空间限制:131072 KB定义一个区间的值为其众数出现的次数。 现给出n个数,求将所有区间的值排序后,第K大的值为多少。 众数(统计学/数...
  • huayunhualuo
  • huayunhualuo
  • 2016年08月28日 17:02
  • 480

51nod 1686 第K大区间 (二分+滑动窗口+离散化)

1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题  收藏  关注 定义一个区间的值为其众...
  • h1021456873
  • h1021456873
  • 2016年04月12日 15:27
  • 482

解题报告:51nod 1686 第K大区间 二分+尺取

题目链接: 51nod 1686第k大区间 思路: 可以发现答案范围为1~n,那么考虑二分答案。 check函数可以用尺取的方式,每当r右移,左移l使得当前序列的值小于check的值,同时加上...
  • qq_32570675
  • qq_32570675
  • 2017年03月14日 21:02
  • 162

二分 51Nod1686 第K大区间

传送门:点击打开链接 题意:定义一个区间的值为其众数出现的次数。 现给出n个数,求将所有区间的值排序后,第K大的值为多少。 二分第k大的数是多少,设为m,之后的check,只需要计算有多少个区间...
  • qwb492859377
  • qwb492859377
  • 2016年04月07日 20:06
  • 549

51nod 1686 第K大区间(二分 尺取)

题意:定义一个区间的值为其众数出现的次数。现给出n个数,求将所有区间的值排序后,第K大的值为多少。 思路:答案具有单调性,所以可以二分,关键是check的时候怎么统计有多少区间满足>=mid...
  • CillyB
  • CillyB
  • 2017年09月29日 17:36
  • 105

51NOD 1105 第K大的数(二分好题)

传送门 数组A和数组B,里面都有n个整数。数组C共有n^2个整数,分别是A[0] * B[0],A[0] * B[1] ……A[1] * B[0],A[1] * B[1]……A[n - 1] * B...
  • qingshui23
  • qingshui23
  • 2016年07月15日 21:36
  • 1583

51Nod 1686(第K大区间)

题意:中文题,定义一个区间的值为其众数出现的次数。 现给出n个数,求将所有区间的值排序后,第K大的值为多少。 离散化二分答案加尺取判断 #include #include #include us...
  • constbh
  • constbh
  • 2017年08月18日 20:48
  • 47

51nod 1686 第K大区间

二分答案,求解时,采用了容斥。 #include using namespace std; const int MAXN=100100; int a[MAXN],b[MAXN]; long long...
  • xin_jun
  • xin_jun
  • 2016年11月24日 01:38
  • 154
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:51Nod【1686】——1686 第K大区间(尺取+二分)
举报原因:
原因补充:

(最多只允许输入30个字)