51nod-1686 第K大区间
来源:互联网 发布:儿童编程培训班 编辑:程序博客网 时间:2024/05/22 05:17
原题链接
1686 第K大区间
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
收藏
关注
定义一个区间的值为其众数出现的次数。
现给出n个数,求将所有区间的值排序后,第K大的值为多少。
众数(统计学/数学名词)_百度百科
Input
第一行两个数n和k(1<=n<=100000,k<=n*(n-1)/2)第二行n个数,0<=每个数<2^31
Output
一个数表示答案。
Input示例
4 21 2 3 2
Output示例
2
枚举右端点R,计算左端点L最大为多少,使得区间[L,R]的值大于等于t,对于每个R他对答案贡献为L。
#include <bits/stdc++.h>#define maxn 100005using namespace std;typedef long long ll;vector<int> v[maxn];int num1[maxn], num2[maxn], p[maxn];ll n, k, len;bool judge(int m){ll ans = 0;int kk = -1;for(int i = 0; i < n; i++){int d = lower_bound(num2, num2+len, num1[i]) - num2;p[d]++;if(p[d] >= m){kk = max(kk, v[d][p[d]-m]);}if(kk != -1){ans += kk + 1;}if(ans >= k) return true;}return false;}int main(){//freopen("in.txt", "r", stdin);scanf("%I64d%I64d", &n, &k);for(int i = 0; i < n; i++){ scanf("%d", num1+i); num2[i] = num1[i]; }sort(num2, num2+n);len = unique(num2, num2+n) - num2;for(int i = 0; i < n; i++){int e = lower_bound(num2, num2+len, num1[i]) - num2;v[e].push_back(i);}int l = 1, r = n+1;while(l < r){memset(p, 0, sizeof(p));int mid = (l + r) >> 1;if(judge(mid) == false) r = mid;else l = mid + 1;}printf("%d\n", l - 1);return 0;}
0 0
- 51nod 1686 第k大区间
- 51nod-1686 第K大区间
- 51Nod-1686-第K大区间
- 51nod 1686 第K大区间
- 51Nod 1686(第K大区间)
- 51nod 1686 第K大区间
- 51nod 1686 第K大区间
- 51nod 第K大区间
- 51nod 1686 第K大区间【离散化+二分】
- 51nod 1686 第K大区间 二分好题
- 51nod 1686 第K大区间(二分 尺取)
- 【二分+Two Pointers】51Nod 1686 第K大区间
- 51Nod-1175-区间中第K大的数
- 51Nod-1685-第K大区间2
- 51nod 1175 区间中第K大的数
- 51Nod【1686】——1686 第K大区间(尺取+二分)
- 51nod 1686 第K大区间 (二分+滑动窗口+离散化)
- 解题报告:51nod 1686 第K大区间 二分+尺取
- string 与char 的转换
- 第六节、AHK变量和运算符
- 理解 OpenStack 高可用(HA)(1):OpenStack 高可用和灾备方案 [OpenStack HA and DR]
- web分页
- Python——fifter函数
- 51nod-1686 第K大区间
- 直接插入排序
- 动态代理
- C++引用相关
- 数据结构(六)——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现
- 软件工程视频总结
- 【学习笔记】数字证书,私钥——公钥
- [LeetCode]Divide Two Integers
- Leetcode-18. 4Sum