时间限制:1 秒 空间限制:131072 KB
 

定义一个区间的值为其众数出现的次数
现给出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
思路:二分答案t,统计众数出现次数大于等于t的区间有多少个。
枚举右端点R,计算左端点L最大为多少,使得区间[L,R]的值大于等于t,对于每个R他对答案贡献为L。
通过线性扫一遍找出每一个数的前面第t-1个与他相同的数字,记其位置为b[i],若不存在则为0。
若R增加,则[L,R+1]的值也必定大于等于t,所以新的L=max(L,b[R+1]),这样就可以找出每一个R对应的L,O(n)计算出答案。
总复杂度O(nlogn)
  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<stack>
7 #include<map>
8 #include<math.h>
9 using namespace std;
10 typedef long long LL;
11 int id[100005];
12 int cnt[100005];
13 int cp[100005];
14 int str[100005];
15 LL tt[100005];
16 typedef struct pp
17 {
18 LL x;
19 int id;
20 } ss;
21 ss ans[100005];
22 LL check(int mid);
23 bool cmp(pp n,pp m)
24 {
25 return n.x<m.x;
26 }
27 LL n,m;
28 int main(void)
29 {
30 int i,j,k;
31 while(scanf("%lld %lld",&n,&m)!=EOF)
32 {
33 memset(cnt,0,sizeof(cnt));
34 for(i=1; i<=n; i++)
35 {
36 scanf("%lld",&ans[i].x);
37 ans[i].id=i;
38 }
39 LL nn=ans[1].x;
40 int mm=1;
41 sort(ans+1,ans+n+1,cmp);
42 for(i=1; i<=n; i++)
43 {
44 if(ans[i].x!=nn)
45 {
46 mm++;
47 nn=ans[i].x;
48 }
49 tt[ans[i].id]=mm;
50 }
51 for(i=1;i<=n;i++)
52 {
53 ans[i].x=tt[i];
54 }
55 int maxx=0;
56 for(i=1; i<=n; i++)
57 {
58 cnt[ans[i].x]++;
59 if(maxx<cnt[ans[i].x])
60 {
61 maxx=cnt[ans[i].x];
62 }
63 }
64 int l=1;
65 int ask=1;
66 int r=maxx;
67 while(l<=r)
68 {
69 int mid=(l+r)/2;
70 LL ak=check(mid);
71 LL cnt1=(n)*(n-1)/2;
72 if(ak>=m)
73 { ask=mid;
74 l=mid+1;
75 }
76 else
77 { r=mid-1;
78
79 }
80 }printf("%d\n",ask);
81 }
82 return 0;
83 }
84 LL check(int mid)
85 {
86 int i,j,k;
87 LL sum=0;
88 if(mid==1)
89 return n*(n-1)/2;
90 else
91 {
92 memset(id,0,sizeof(id));
93 memset(cnt,0,sizeof(cnt));
94 memset(str,0,sizeof(str));
95 cnt[ans[1].x]++;str[ans[1].x]=1;id[1]=0;
96 for(i=2; i<=n; i++)
97 {
98 cnt[ans[i].x]++;
99 if(cnt[ans[i].x]==1)
100 {
101 str[ans[i].x]=i;
102 id[i]=0;
103 }
104 else if(cnt[ans[i].x]==mid)
105 {
106 id[i]=str[ans[i].x];
107 }
108 else if(cnt[ans[i].x]<mid)
109 {
110 id[i]=0;
111 }
112 else if(cnt[ans[i].x]>mid)
113 {
114 while(cnt[ans[i].x]>mid)
115 {
116 str[ans[i].x]++;
117 if(ans[str[ans[i].x]].x==ans[i].x)
118 {
119 cnt[ans[i].x]--;
120 break;
121 }
122 }id[i]=str[ans[i].x];
123 }
124 }
125 int L=0;
126 LL sum=0;
127 for(i=1; i<=n; i++)
128 {
129 L=max(L,id[i]);
130 sum+=L;
131
132 }printf("\n");
133 return sum;
134 }
135 }

1686 第K大区间的更多相关文章

  1. 51nod 1686 第k大区间

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

  2. 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大区间 二分

    第k大区间   定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. Input   第一行两个数n和k(1<=n<=100000,k<=n* ...

  5. 51Nod——T 1686 第K大区间

    https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1686 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 关于Stream的使用

    引言 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找.过滤和映射数据等操作.使用Stream API 对集合数据进行操作,就类似于使用 ...

  2. 学习 DDD - 通用语言的模式

    大家好,我是霸戈,这周学习了一些关于领域驱动设计的知识 ,对比较深刻的地方做了不少笔记,分享给大家. 在日常需求讨论的时候,经常会碰到一个需求会议开了一个多小时还没有达成共识.作为业务方(领域专家)明 ...

  3. HDC2021技术分论坛:异构组网如何解决共享资源冲突?

    作者:lijie,HarmonyOS软总线领域专家 相信大家对HarmonyOS的"超级终端"比较熟悉了.那么,您知道超级终端场景下的多种设备在不同环境下是如何组成一个网络的吗?这 ...

  4. addict, address, adequate

    addict Addiction is a biopsychosocial disorder characterized by repeated use of drugs, or repetitive ...

  5. 大数据学习day15----第三阶段----scala03--------1.函数(“_”的使用, 函数和方法的区别)2. 数组和集合常用的方法(迭代器,并行集合) 3. 深度理解函数 4 练习(用java实现类似Scala函数式编程的功能(不能使用Lambda表达式))

    1. 函数 函数就是一个非常灵活的运算逻辑,可以灵活的将函数传入方法中,前提是方法中接收的是类型一致的函数类型 函数式编程的好处:想要做什么就调用相应的方法(fliter.map.groupBy.so ...

  6. css相关,position定位详解

    CSS 有两个最重要的基本属性,前端开发必须掌握:display 和 position. display属性指定网页的布局.两个重要的布局,弹性布局flex和网格布局grid. 本文介绍非常有用的po ...

  7. 转 onSaveInstanceState()和onRestoreInstanceState()使用详解

    转 https://www.jianshu.com/p/27181e2e32d2 背景 如果系统由于系统约束(而不是正常的应用程序行为)而破坏了Activity,那么尽管实际 Activity实例已经 ...

  8. Linux基础命令---apachectl

    apachectl apachectl指令是apache http服务器的前端控制程序,可以协助控制apache服务的守护进程httpd. 此命令的适用范围:RedHat.RHEL.Ubuntu.Ce ...

  9. jmeter设置参数化

    设置参数化方法有3种 第一种: 1.打开 jmeter,导入badboy录制的脚本 导入后记得选择"step"右键选择change controller ->逻辑控制器-&g ...

  10. 【Java 8】Stream中的Pipeline理解

    基于下面一段代码: public static void main(String[] args) { List<String> list = Arrays.asList("123 ...