51Nod 1686(第K大区间)
来源:互联网 发布:中行外汇行情分析软件 编辑:程序博客网 时间:2024/05/22 17:24
题意:中文题,定义一个区间的值为其众数出现的次数。
现给出n个数,求将所有区间的值排序后,第K大的值为多少。
离散化二分答案加尺取判断
#include<cstdio>#include<algorithm>#include<cstring>using namespace std;const int maxn = 100006;typedef long long ll;int len;int num[maxn];int tmp[maxn];int vis[maxn];int id[maxn];int n;ll k;bool check(int mid){ int flag = 0; int l=0,r=0; ll ans = 0; memset(vis,0,sizeof(vis)); while(r<=n){ if(flag ==0) { if(r==n) break; vis[id[r]] ++; if(vis[id[r]]>=mid) flag = 1; r++; } else { while(flag!=0) { ans += n-r+1; vis[id[l]]--; l++; if(vis[id[r-1]]<mid) flag = 0; } } } if(ans>=k) return true; return false;}int main(){ scanf("%d%I64d",&n,&k); for(int i=0;i<n;i++) {scanf("%d",&num[i]); tmp[i] = num[i];} sort(tmp,tmp+n); len = 0; for(int i=1;i<n;i++) { if(tmp[i]!=tmp[i-1]) tmp[++len] = tmp[i]; } len++; for(int i=0;i<n;i++) { id[i] = lower_bound(tmp,tmp+len,num[i])-tmp; } int l = 1,r = n,mid; while(l<=r) { mid = (l+r)/2; bool flag = check(mid); //printf("sgdgghm\n"); if(flag) l = mid+1; else r=mid-1; } printf("%d\n",r); 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大区间 二分+尺取
- 8月18日训练笔记
- map 迭代器的遍历
- springMVC详解(上)
- 质数
- 常用加密 以及解密方法(包含测试方法) DES Base64 AES
- 51Nod 1686(第K大区间)
- [编程题] 堆棋子
- 斐波那契数列
- 图的基本存储的基本方式一(邻接矩阵)
- CodeForces
- LeetCode No.24 Swap Nodes in Pairs
- 最简单的条件判断程序
- hdu 6133 树状数组+分类讨论
- 2017.08.18总结