第K大区间
来源:互联网 发布:马龙世界杯2017知乎 编辑:程序博客网 时间:2024/04/27 20:00
51NOD 1686
中文题
这题很坑。。。。区间众数是从大开始依次减小的排在一起,然后去找。。。一开始理解反了。。。
主要是利用二分和尺取法去求,题目给的数比较大,一开始先离散化,然后每次二分一个值,利用尺取法判断大于等于mid的区间是否超过k个。
因为是从大开始排列,所以不需要用n*(n-1)/2-res;而是直接是res…..
#include <algorithm>#include <iostream>#include <cstring>#include <cstdlib>#include <vector>#include <cstdio>#include <bitset>#include <cmath>#include <queue>#include <stack>#include <map>#include <set>#define FOR(i,a,b) for(int i=a;i<=b;i++)#define ROF(i,a,b) for(int i=a;i>=b;i--)#define mem(i,a) memset(i,a,sizeof(i))#define rson mid+1,r,rt<<1|1#define lson l,mid,rt<<1#define mp make_pair#define pb push_back#define ll long long#define LL long longusing namespace std;template <typename T>inline void read(T &_x_){ _x_=0;bool f=false;char ch=getchar(); while (ch<'0'||ch>'9') {if (ch=='-') f=!f;ch=getchar();} while ('0'<=ch&&ch<='9') {_x_=_x_*10+ch-'0';ch=getchar();} if(f) _x_=-_x_;}const double eps = 1e-8;const int maxn = 2e5+7;const int mod = 1e9+7;const ll inf = 1e15;ll n,m;ll a[maxn],b[maxn];ll cnt[maxn];bool check(ll mid){ mem(cnt,0); ll l=1,r=1; ll res=0; while(r<=n){ cnt[a[r]]++; while(cnt[a[r]]>=mid){ res+=n-r+1; cnt[a[l]]--; l++; } if(res>=m) return true; r++; } return false;}int main(){ read(n),read(m); FOR(i,1,n) read(a[i]),b[i]=a[i]; sort(b+1,b+1+n); int pos = unique(b+1,b+1+n)-b; FOR(i,1,n) a[i] = lower_bound(b+1,b+1+pos,a[i])-b; ll l=0,r=n*(n-1)/2,mid; while(l+1<r){ mid=(l+r)/2; if(check(mid)) l=mid; else r = mid; } printf("%I64d\n",l); return 0;}
阅读全文
0 0
- 区间第K大
- 第K大区间
- 区间第k大
- 静态区间第K大
- poj2104 区间第K大
- 区间第K大值
- 区间第K大(划分树)
- ZOJ2112(区间动态求第K大)
- 区间第k大(poj 2104)
- 带修改的区间第k大
- poj2104(区间第k大+离散化)
- 线段树求解区间第k大
- 51nod1686 第K大区间
- 51nod 第K大区间
- 51nod 1686 第k大区间
- 二分 51Nod1686 第K大区间
- 51nod1685:第K大区间2
- 51nod1685 第K大区间2
- 遍历FTP下的所有文件
- 树上博弈
- (六) u-boot 启动内核解析
- 深搜和广搜
- 线程其实很简单
- 第K大区间
- Linux命令行—使用Linux环境变量
- html实现搜索框
- 大数据(七)Hadoop-MapReduce
- 排序与查找
- jquery二维码插件
- html好看的下拉菜单样式
- Meteor Shower (bfs)
- 16、反转链表(递归方法)