博客
关于我
Codeforces Round #716 (Div. 2) D. Cut and Stick
阅读量:686 次
发布时间:2019-03-17

本文共 2291 字,大约阅读时间需要 7 分钟。

显然:

对于一个区间我们只需要负责处理最多次出现的那个元素
(我们把剩下的元素称为其他元素)
而最优策略是拿两个最多元素和一个其他元素组合成一个序列

故某个区间的答案是

m a x ( 最 多 元 素 个 数 − 其 他 元 素 , 1 ) max(最多元素个数-其他元素,1) max(,1)

所以对于单个区间,我们只需要求出其中出现次数最多的元素个数。

这个是好做的。
因为每次加上一个数或者删去一个数,区间出现次数最多元素的元素个数只会增加或者减少一,所以我们只需要用一个 c n t [ i ] cnt[i] cnt[i]记录 i i i出现的次数, r n k [ i ] rnk[i] rnk[i]记录出现次数为 i i i次的元素个数。
每次维护 c n t [ i ] cnt[i] cnt[i] r n k [ i ] rnk[i] rnk[i]即可。(可以知道这个的复杂度是很低的,因为上文"出现次数最多元素的元素个数只会增加或者减少一")

同时因为询问是连续区间,所以想到莫队,复杂度可以控制在 O ( n n ) O(n\sqrt n) O(nn )以内。

#include
using namespace std; #define ll long long const int maxn=3e5+50; int n,q; int a[maxn],ans[maxn],rnk[maxn],cnt[maxn]; int nowl=1,nowr=0,nowans=0; struct qu { int l,r,num; }query[maxn]; bool cmp(qu a,qu b) { int t=sqrt(n); if(a.r/t!=b.r/t)return a.r/t
0)rnk[cnt[a[x]]]--; cnt[a[x]]++; rnk[cnt[a[x]]]++; nowans=max(nowans,cnt[a[x]]); } void del(int x) { rnk[cnt[a[x]]]--; cnt[a[x]]--; rnk[cnt[a[x]]]++; while(rnk[nowans]==0)nowans--; } int main() { scanf("%d%d",&n,&q); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=q;i++) { scanf("%d%d",&query[i].l,&query[i].r); query[i].num=i; } sort(query+1,query+1+q,cmp); for(int i=1;i<=q;i++) { while(nowr
query[i].l) { nowl--; add(nowl); } while(nowr>query[i].r) { del(nowr); nowr--; } while(nowl

但就本题而言我们的做法可以有很多种,其中有两种觉得非常有借鉴意义。

1、如果有一个数在区间内出现了超过 ( n + 1 ) / 2 (n+1)/2 (n+1)/2次,那么它一定在某个子区间内出现超过 ( n + 1 ) / 2 (n+1)/2 (n+1)/2次(否则矛盾),所以我们只需要用线段树处理出每个区间超过 ( n + 1 ) / 2 (n+1)/2 (n+1)/2次的数,然后分别 c h e c k check check即可。
2、如果有一个数在区间内出现了超过 ( n + 1 ) / 2 (n+1)/2 (n+1)/2次,那么我们随机一个位置,随机到这个数的概率大于 1 / 2 1/2 1/2,所以我们随机 n n n次, c h e c k check check每次取到的值,找到这个数的概率是非常大的。
注:check就简单二分下标~

同时顺便也学到了,对于出现次数大于 ( n + 1 ) / 2 (n+1)/2 (n+1)/2的众数我们有摩尔投票算法可以 O ( n ) O(n) O(n)求出…

b y   t h e   w a y by\,the\,way bytheway我们还可以复习一下中位数的一些冷知识,对于一个区间我们可以先二分一个数,然后统计大于这个数和小于这个数的数的个数,来 c h e c k check check,复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)

转载地址:http://ihvhz.baihongyu.com/

你可能感兴趣的文章
Nginx配置实例-动静分离实例:搭建静态资源服务器
查看>>
Nginx配置实例-反向代理实例:根据访问的路径跳转到不同端口的服务中
查看>>
Nginx配置实例-负载均衡实例:平均访问多台服务器
查看>>
Nginx配置文件nginx.conf中文详解(总结)
查看>>
nginx配置详解、端口重定向和504
查看>>
Nginx配置负载均衡到后台网关集群
查看>>
Nginx配置限流,技能拉满!
查看>>
Nginx面试三连问:Nginx如何工作?负载均衡策略有哪些?如何限流?
查看>>
Nginx:NginxConfig可视化配置工具安装
查看>>
ngModelController
查看>>
ngrok | 内网穿透,支持 HTTPS、国内访问、静态域名
查看>>
NHibernate学习[1]
查看>>
NHibernate异常:No persister for的解决办法
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_日期类型_以及null数据同步处理补充---大数据之Nifi工作笔记0057
查看>>
NIFI1.21.0_Mysql到Mysql增量CDC同步中_补充_更新时如果目标表中不存在记录就改为插入数据_Postgresql_Hbase也适用---大数据之Nifi工作笔记0059
查看>>
NIFI1.21.0_NIFI和hadoop蹦了_200G集群磁盘又满了_Jps看不到进程了_Unable to write in /tmp. Aborting----大数据之Nifi工作笔记0052
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表多表增量同步_增删改数据分发及删除数据实时同步_通过分页解决变更记录过大问题_02----大数据之Nifi工作笔记0054
查看>>
NIFI1.21.0通过Postgresql11的CDC逻辑复制槽实现_指定表或全表增量同步_实现指定整库同步_或指定数据表同步配置_04---大数据之Nifi工作笔记0056
查看>>
NIFI1.23.2_最新版_性能优化通用_技巧积累_使用NIFI表达式过滤表_随时更新---大数据之Nifi工作笔记0063
查看>>
NIFI从MySql中增量同步数据_通过Mysql的binlog功能_实时同步mysql数据_根据binlog实现数据实时delete同步_实际操作04---大数据之Nifi工作笔记0043
查看>>