第k大区间
 

定义一个区间的值为其众数出现的次数
现给出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

题解:
  二分答案,
  我们假设x,计算出多少个区间的众数大于等于K就好了
  方法就是:枚举一个区间的右端点,那么我们假设找到一个左端点尽量大,那么就是固定的右端点的答案,累加就是了
  注意这题不要用map等STL,会超时
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include<vector>
using namespace std;
const int N = 1e5+, M = , mod = 1e9+, inf = 0x3f3f3f3f;
typedef long long ll;
//不同为1,相同为0
void read(ll &x){
char ch=getchar();x=;
for (;ch<'';ch=getchar());
for (;ch>='';ch=getchar()) x=x*+ch-'';
}
vector<int> G[N];
int H[N];
ll n,k,a[N],pos[N],b[N];
ll cal(int x) {
if(x==) return n*(n-)/;
ll ans = ,L = ;
for(int i=;i<=n;i++) G[i].clear();
memset(H,,sizeof(H));
for(int i=;i<=n;i++) {
if(H[a[i]]>=x-) {
pos[i] = G[a[i]][H[a[i]]+ - x];
}
else pos[i] = ;
L = max(L,pos[i]);
ans+=L;
H[a[i]]++;
int tmp = H[a[i]];
G[a[i]].push_back(i);
}
// cout<<pos[n]<<endl;
//cout<<ans<<endl;
return ans;
}
int main() {
read(n),read(k);
for(int i=;i<=n;i++) read(a[i]), b[i] = a[i];
sort(b+,b+n+);
int c = unique(b+,b+n+)-b-;
for(int i=;i<=n;i++) a[i] = lower_bound(b+,b+c+,a[i]) - b; // cout<<cal(2)<<endl;
int l = , r = n;
ll ans = ;
while(l<=r) {
int mid = (l+r)>>;
if(cal(mid)>=k) l = mid+, ans = mid;
else r = mid-;
}
printf("%lld\n",ans);
//cout<<ans<<endl;
return ;
}

51NOD 1686 第K大区间 二分的更多相关文章

  1. 51nod 1686 第K大区间 二分瞎搞

    题目: 定义一个区间的值为其众数出现的次数. 现给出n个数,求将所有区间的值排序后,第K大的值为多少. 题解: 答案明显单调,我们考虑二分答案. 转化为判定问题后我们需要观察到一个性质: 如果一个区间 ...

  2. 51nod 1686 第k大区间

    1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...

  3. 51nod 1686 第K大区间2

    1685 第K大区间2 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百科 Input 第一行两个数n和k(1<=n ...

  4. 51nod 1686 第K大区间【离散化+二分】

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意: 定义一个区间的值为其众数出现的次数. 现给出n ...

  5. 51Nod 1686 第K大区间(离散化+尺取法)

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 题意: 思路: 第K大值,所以可以考虑二分法,然后用尺取法去扫描, ...

  6. 【题解】51nod 1686第K大区间

    成功的秘诀,在于克服自己看题解的冲动……[笑哭].自己A掉这题还是灰常开心的~ 以及爱死 two - pointer ! two - pointer 大法是真的好哇……这个题目有上一题的经验:求第\( ...

  7. 1686 第K大区间(尺取+二分)

    1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...

  8. 1686 第K大区间

    1686 第K大区间 时间限制:1 秒 空间限制:131072 KB   定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. 众数(统计学/数学名词)_百度百 ...

  9. 51nod-1686 第K大区间(二分+尺取法)

    题目链接: 第K大区间 基准时间限制:1 秒 空间限制:131072 KB    定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input 第一行两个数 ...

随机推荐

  1. [JXOI 2018] 游戏 解题报告 (组合数+埃氏筛)

    interlinkage: https://www.luogu.org/problemnew/show/P4562 description: solution: 注意到$l=1$的时候,$t(p)$就 ...

  2. Spring生态简介

    目录 概述 项目说明 主要项目 社区项目 保留项目 最后总结 概述 做Java开发的人一提起Spring,首先在脑海中浮现出的就是"IoC","AOP",&qu ...

  3. C - Game With Sticks

    Problem description After winning gold and silver in IOI 2014, Akshat and Malvika want to have some ...

  4. 导入Excel时去除多余的空白行

    https://blog.csdn.net/shuishousuiyue/article/details/44773987 按着上面链接用的第一种方式,如下图所示:第二种方式要遍历每一个Excel单元 ...

  5. 状态模式(state)C++实现

    状态模式 当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类. 状态模式主要解决的是当控制一个对象状态转换的条件表达式过于复杂时的情况.把状态的判断逻辑转移到表示不同状态的一系列类 ...

  6. 创建异步对象XHR的兼容写法、get、post上传数据的方式

    兼容ie7以下,创建异步对象的函数 function creatXHR(){ if(typeof XMLHttpRequest != "undefined"){ return ne ...

  7. ibatis设置启用及关闭命名空间

    使ibatis用命名空间能够有效避免sql配置命名冲突,默认为启用状态,可以通过settings标签设置为关闭状态,例如: <settings> <setting name=&quo ...

  8. hdu1811 Rank of Tetris 拓扑排序+并查集

    这道题是拓扑排序和并查集的综合运用. 由于排行榜是一种从高到低的排序.所以在拓扑排序的时候,如果有一次加入的入度为零的点数大于1,就有变得不确定了(UNCERTAIN). 由于只有一棵树,当树的数量大 ...

  9. 开发手机APP过程,不同使用场景APP搜索框的样式及区别

    搜索框是 app 内最常见的控件之一,可以帮助用户快速又精准找到期望的内容与功能.不同的使用场景下,根据页面中搜索的重要程度,搜索框也有着不同的样式. 下面就常州开发APP公司和大家聊聊常见的四种样式 ...

  10. postgreSQL格式化时间的函数详解

    数据类型格式化函数:    PostgreSQL格式化函数提供一套有效的工具用于把各种数据类型(日期/时间.integer.floating point和numeric)转换成格式化的字符串以及反过来 ...