首先对于$p>50$,有经典的做法,即不断删去区间中不同的两数,最终剩下的即为出现次数超过一半的数(或没有),用线段树维护即可

那么对于$p\le 50$,类似的,即删去区间中不同的$\lfloor \frac{100}{p}\rfloor+1$个数,那么最终剩下的$\lfloor \frac{100}{p}\rfloor$个数中必然存在一个答案(或没有),同样可以维护

时间复杂度为$o(25n\log_{2}n)$,可以通过

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 150005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 #define vii vector<pair<int,int> >
8 #define fi first
9 #define se second
10 vii empty,v,f[N<<2];
11 int n,m,p,a[N],tag[N<<2];
12 vii merge(vii x,vii y){
13 v.clear();
14 for(int i=0,j=0;(i<x.size())||(j<y.size());){
15 pair<int,int> o;
16 if ((i<x.size())&&((j==y.size())||(x[i].fi<y[j].fi)))o=x[i++];
17 else o=y[j++];
18 if ((v.size())&&(o.fi==v[v.size()-1].fi))v[v.size()-1].se+=o.se;
19 else v.push_back(o);
20 }
21 while (v.size()>=p){
22 int mn=v[0].se;
23 for(int i=1;i<p;i++)mn=min(mn,v[i].se);
24 for(int i=p-1;i>=0;i--){
25 v[i].se-=mn;
26 if (!v[i].se)v.erase(v.begin()+i);
27 }
28 }
29 return v;
30 }
31 void upd(int k,int l,int r,int x){
32 tag[k]=x;
33 f[k].clear();
34 f[k].push_back(make_pair(x,r-l+1));
35 }
36 void down(int k,int l,int r){
37 if (tag[k]){
38 upd(L,l,mid,tag[k]);
39 upd(R,mid+1,r,tag[k]);
40 tag[k]=0;
41 }
42 }
43 void build(int k,int l,int r){
44 if (l==r){
45 f[k].push_back(make_pair(a[l],1));
46 return;
47 }
48 build(L,l,mid);
49 build(R,mid+1,r);
50 f[k]=merge(f[L],f[R]);
51 }
52 void update(int k,int l,int r,int x,int y,int z){
53 if ((l>y)||(x>r))return;
54 if ((x<=l)&&(r<=y)){
55 upd(k,l,r,z);
56 return;
57 }
58 down(k,l,r);
59 update(L,l,mid,x,y,z);
60 update(R,mid+1,r,x,y,z);
61 f[k]=merge(f[L],f[R]);
62 }
63 vii query(int k,int l,int r,int x,int y){
64 if ((l>y)||(x>r))return empty;
65 if ((x<=l)&&(r<=y))return f[k];
66 down(k,l,r);
67 return merge(query(L,l,mid,x,y),query(R,mid+1,r,x,y));
68 }
69 int main(){
70 scanf("%d%d%d",&n,&m,&p);
71 p=100/p+1;
72 for(int i=1;i<=n;i++)scanf("%d",&a[i]);
73 build(1,1,n);
74 for(int i=1;i<=m;i++){
75 int p,l,r,x;
76 scanf("%d%d%d",&p,&l,&r);
77 if (p==1){
78 scanf("%d",&x);
79 update(1,1,n,l,r,x);
80 }
81 else{
82 v=query(1,1,n,l,r);
83 printf("%d ",v.size());
84 for(int j=0;j<v.size();j++)printf("%d ",v[j].fi);
85 printf("\n");
86 }
87 }
88 }

[cf643G]Choosing Ads的更多相关文章

  1. 题解-CF643G Choosing Ads

    CF643G Choosing Ads \(n\) 和 \(m\) 和 \(p\) 和序列 \(a_i(1\le i\le n)\).\(m\) 种如下操作: 1 l r id 令 \(i\in[l, ...

  2. 「CF643G」 Choosing Ads

    「CF643G」 Choosing Ads 传送门 如果你知道摩尔投票法可以扩展事实上是个一眼题,又好写又好调. 首先摩尔投票法是用来求众数定义为超过所有数个数一半的数的一个算法. 大致算法流程: 将 ...

  3. @codeforces - 674G@ Choosing Ads

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定长度为 n 的序列,m 次询问以及参数 p.共有两类询问: ...

  4. Codeforces 643G - Choosing Ads(线段树)

    Codeforces 题目传送门 & 洛谷题目传送门 首先考虑 \(p>50\) 的时候怎么处理,也就是求一个区间的绝对众数.我们知道众数这个东西是不能用线段树直接维护的,因为对于区间 ...

  5. 多校联训 DS 专题

    CF1039D You Are Given a Tree 容易发现,当 \(k\) 不断增大时,答案不断减小,且 \(k\) 的答案不超过 \(\lfloor\frac {n}{k}\rfloor\) ...

  6. FineReport如何用JDBC连接阿里云ADS数据库

    在使用FineReport连接阿里云的ADS(AnalyticDB)数据库,很多时候在测试连接时就失败了.此时,该如何连接ADS数据库呢? 我们只需要手动将连接ads数据库需要使用到的jar放置到%F ...

  7. 【转】arm 开发工具比较(ADS vs RealviewMDK vs RVDS)

      ADS REALVIEW MDK RVDS 公司 ARM Keil(后被ARM收购) ARM 版本 最新1.2 ,被RVDS取代 最新4.0 是否免费 破解情况 有 有 工程管理 CodeWarr ...

  8. CF219D. Choosing Capital for Treeland [树形DP]

    D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...

  9. NTFS系统的ADS交换数据流

    VC++ 基于NTFS的数据流创建与检测 What are Alternate Streams?(交换数据流) NTFS alternate streams , 或者叫streams,或者叫ADS(w ...

随机推荐

  1. DistSQL:像数据库一样使用 Apache ShardingSphere

    Apache ShardingSphere 5.0.0-beta 深度解析的第一篇文章和大家一起重温了 ShardingSphere 的内核原理,并详细阐述了此版本在内核层面,特别是 SQL 能力方面 ...

  2. Java基础语法(语法、位运算、JavaDoc等)

    一.注释.标识符.关键字 1.注释(comments) 平时我们编写代码,在代码量比较少的时候,我们还可以看懂自己编写的代码,但是当项目结构一旦复杂起来,我们就需要用到注释了! 注释并不会被程序执行, ...

  3. HDC 2021 | HMS Core 6.0:连接与通信论坛,为App打造全场景连接体验

    如何在弱网环境下让用户享受无中断沉浸体验? 如何在全场景互联中让多设备交互如丝般顺滑? 如何在无网区域让移动终端发出紧急求助信息? 连接无处不在,连接与体验息息相关!流畅的网络体验已成为应用开发的关键 ...

  4. Setoolkit部署

    禁止使用本文的知识进行违法犯罪活动!!学习这些内容是为了更好的防范钓鱼网站 详见我的github仓库 Setoolkit : Social-Engineer Toolkit(社会工程学工具包) 其作为 ...

  5. Java并行任务框架Fork/Join

    Fork/Join是什么? Fork意思是分叉,Join为合并.Fork/Join是一个将任务分割并行运行,然后将最终结果合并成为大任务的结果的框架,父任务可以分割成若干个子任务,子任务可以继续分割, ...

  6. PyCharm中目录directory与包package的区别及相关import详解

    一.概念介绍 在介绍目录directory与包package的区别之前,先理解一个概念---模块 模块的定义:本质就是以.py结尾的python文件,模块的目的是为了其他程序进行引用. 目录(Dire ...

  7. HTML中的emment

    emment的优点和使用方法: 优点:Emment是前端开发者必备的工具,使用它可以大大提高前端开发效率. 使用方法:Emment的使用方法非常简单,直接在编辑器上输入HTML和CSS代码的缩写,然后 ...

  8. OO第四单元及学期总结

    OO第四单元及学期总结 第四单元两次作业的架构设计 第一次作业 类图: 树形结构:使用Operation类管理UMLOperation以及parent为该UMLOperation的参数(UMLpara ...

  9. mybatis自定义分页拦截器

    最近看了一下项目中代码,发现系统中使用的mybatis分页使用的是mybatis自带的分页,即使用RowBounds来进行分页,而这种分页是基于内存分页,即一次查出所有的数据,然后再返回分页需要的数据 ...

  10. Noip模拟63 2021.9.27(考场惊现无限之环)

    T1 电压机制 把题目转化为找那些边只被奇数环包含. 这样的话直接$dfs$生成一棵树,给每个点附上一个深度,根据其他的非树边都是返祖边 可以算出环内边的数量$dep[x]-dep[y]+1$,然后判 ...