题目:

定义一个区间的值为其众数出现的次数。
现给出n个数,求将所有区间的值排序后,第K大的值为多少。

题解:

答案明显单调,我们考虑二分答案.
转化为判定问题后我们需要观察到一个性质:

如果一个区间的价值已经 >= mid了,那么这个无论左右端点向外延伸多少,区间价值一定仍然 >= mid

所以我们可以考虑找出所有的最小满足限制的区间,然后计算出可延伸区间。
所以我们枚举右端点,根据右端点找出对应的左端点,然后统计答案.
我们发现:根据右端点向右移动,左端点一定也向右移动。
所以我们使用双指针法,每一次计算出右端点所代表的值的上mid-1次出现的位置
用这个位置和左端点指针取max,每一次让ans += 所有<=下标左端点的点的个数.

单次判定\(O(n)\),总体\(O(nlogn)\)

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){x=0;char ch;bool flag = false;while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline void read(ll &x){x=0;char ch;bool flag = false;while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
const int maxn = 120000;
int last[maxn],nxt[maxn];
int b[maxn],n,a[maxn],c[maxn],pos[maxn];
inline void init(){memset(last,0,sizeof last);memset(nxt,0,sizeof nxt);memset(b,0,sizeof b);
}
inline ll check(int val){ll ret = 0;init();memset(c,0,sizeof c);for(int i=1;i<=n;++i){last[i] = c[a[i]];c[a[i]] = i;}memset(c,0,sizeof c);for(int i=n;i>=1;--i){nxt[i] = c[a[i]];c[a[i]] = i;}memset(c,0,sizeof c);memset(pos,0,sizeof pos);for(int i=1;i<=n;++i){if(++c[a[i]] == 1) pos[a[i]] = i;if(c[a[i]] == val) b[i] = pos[a[i]];else if(c[a[i]] > val){b[i] = nxt[b[last[i]]];}}if(val == 1) for(int i=1;i<=n;++i) b[i] = i;for(int L=0,R=1;R <= n;++R){L = max(L,b[R]);ret += L;}return ret;
}
int main(){read(n);ll k;read(k);for(int i=1;i<=n;++i){read(a[i]);b[i] = a[i];}sort(b+1,b+n+1);for(int i=1;i<=n;++i){a[i] = lower_bound(b+1,b+n+1,a[i]) - b;}int l = 1,r = n,ans = 0;while(l <= r){int mid = (l+r) >> 1;if(check(mid) >= k) ans = mid,l = mid+1;else r = mid-1;}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Skyminer/p/6601981.html

51nod 1686 第K大区间 二分瞎搞相关推荐

  1. 【二分+Two Pointers】51Nod 1686 第K大区间

    题面在这里 首先需要知道这样一个性质:给一个区间加入元素,众数的个数只会变多不会变少 然后就可以想到二分答案 只需要验证众数的个数大于等于mid的区间的个数是否大于等于K就好了 这个可以用 Two P ...

  2. ACM学习历程—51NOD 1685 第K大区间2(二分 树状数组 中位数)

    http://www.51nod.com/contest/problem.html#!problemId=1685 这是这次BSG白山极客挑战赛的E题. 这题可以二分答案t. 关键在于,对于一个t,如 ...

  3. 51Nod 1105 第K大的数 二分答案

    很典型的二分答案的题目 码着 #include<iostream> #include<algorithm> #include<string> #include< ...

  4. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 K-Dimensional Foil II(二分瞎搞)

    传送门 这题其实没有题面看起来复杂,实际上我们贪心的去想:对于下式                                                                   ...

  5. HDU1597【二分瞎搞】

    题意: 求第n个数: 思路: 可以看到一种序列: 1 12 123 1234 12345 123456 1234567 12345678 123456789 1234567891 1234567891 ...

  6. P2617 Dynamic Rankings 动态区间第K大【树套树】或【整体二分】

    传送门 动态区间第KKK大问题,单点修改(这里是第kkk小,即是从小到大第kkk个) 这里还有个区间修改,有点类似的 P3332 [ZJOI2013]K大数查询 分析 树套树 树套树,就是用一种树形结 ...

  7. 【HDU - 5700】【51nod - 1672】 区间交(贪心,STLset 或线段树第k大)

    题干: 小A有一个含有n个非负整数的数列与m个区间,每个区间可以表示为li,ri. 它想选择其中k个区间, 使得这些区间的交的那些位置所对应的数的和最大.(是指k个区间共同的交,即每个区间都包含这一段 ...

  8. 整体二分求区间第k大模板(POJ 2104)

    自己的模板,线段树实现的,可以参考一下 算法步骤 参考一下文章 http://www.cnblogs.com/dirge/articles/5810855.html https://www.cnblo ...

  9. Dynamic Rankings——带修改区间第k大

    三种做法: 1.整体二分: 二分mid 考虑小于mid的修改的影响 但是大于mid的修改可能会干掉小于mid的一些值 所以额外把一个修改变成一个值的删除和一个值的添加 这样就相互独立了! 整体二分,树 ...

最新文章

  1. 哪些方法不能够实施Spring AOP事务
  2. 【转】Android检查手机是否被root
  3. VTK:通过法线显示颜色用法实战
  4. sed是linux命令吗,Linux命令 sed
  5. 资源权限操作-查询所有资源权限
  6. mysql 主键 最佳实践_Spring Data Jpa + MySQL IDENTITY 主键下批量插入最佳实践
  7. centos6.x redhat6.x 升级openssh8.7
  8. 华为杯数学建模2020什么时候出结果_关于组织参加“华为杯”第十七届中国研究生数学建模竞赛通知...
  9. Gym 101206L Daylight Saving Time 根据年月日计算星期
  10. 论文索引平台EI,SCI
  11. 计算机原理教程 pdf,《计算机组成原理》教程 概述.pdf
  12. 蓝桥杯官网练习系统入门训练(二)
  13. 已经被废弃的 tcp_tw_recycle
  14. cad巧用插件自定义填充图形
  15. 如何在工具类中注入Service
  16. 搜狗浏览器异常问题 - 解决方案
  17. 合肥宏晶微MS9334芯片特性/HDMI一分四开发板/HDMI分配器芯片/HDMI 1分4芯片
  18. A链接标签点击不会触发任何行为的写法
  19. 《物流与供应链管理》读书笔记
  20. Coolpad CT180无线网卡驱动

热门文章

  1. 葡萄城 SpreadJS 表格控件 V11 产品白皮书
  2. 用户空间与内核空间,进程上下文与中断上下文[总结]【转】
  3. thinkphp3.2加载第三方函数库
  4. Java NIO框架Mina、Netty、Grizzly介绍与对比(zz)
  5. URAL 1404. Easy to Hack! (模拟)
  6. 最简单的基于FFmpeg的AVfilter例子(水印叠加)
  7. 内存管理tcmalloc
  8. Visual Studio 剪切板新特性
  9. 大一计算机专业,大一计算机专业学生
  10. Git常用指令——持续补充中