首先对于$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. caffe运行错误 target_blobs.blobs_size()与 source_layer.blobs_size() 不一致

    解决方法参考:http://blog.csdn.net/zhangla1220/article/details/50697352 感谢博主!!! 最新下载的caffe代码,运行mnist,训练时可以正 ...

  2. keystore password was incorrect

    一.问题由来 最近在部署后台系统项目的时候,希望给项目增加一些安全措施,在项目中添加了SSL证书,可是在自己添加完该证书后,测试启动项目立马报错. 报错信息如下: org.springframewor ...

  3. Python实现九九乘法表

  4. 3.2 Dependencies of the Projects in the Solution 解决方案中项目间的依赖项

    3.2 Dependencies of the Projects in the Solution 解决方案中项目间的依赖项 The diagram below shows the essential ...

  5. 初学Python “登录”案例 更新!!

    更新内容:添加了登录次数,如果超过限制的次数,则提示账户被锁定,去某邮箱申请解锁账户! 此次仅把登录系统更新之后源代码放到这里,不在共享源文件在网盘了! 1 ''' 2 登录界面 3 ''' 4 5 ...

  6. kivy画个半圆

    from kivy.uix.boxlayout import BoxLayout from kivy.app import App class BoxLayoutWidget(BoxLayout): ...

  7. HDI PCB一阶和二阶和三阶如何区分??

      一阶板,一次压合即成,可以想像成最普通的板二阶板,两次压合,以盲埋孔的八层板为例,先做2-7层的板,压好,这时候2-7的通孔埋孔已经做好了,再加1层和8层压上去,打1-8的通孔,做成整板.三阶板就 ...

  8. 【Azure 应用服务】App Service For Linux 部署Java Spring Boot应用后,查看日志文件时的疑惑

    编写Java Spring Boot应用,通过配置logging.path路径把日志输出在指定的文件夹中. 第一步:通过VS Code创建一个空的Spring Boot项目 第二步:在applicat ...

  9. vcs命令

    转载:VCS_weixin_34256074的博客-CSDN博客 timing check相关的: +notimingcheck命令,可以用在compile时,也可以用在run time的时候, 都是 ...

  10. Python Linux Ubuntu apt安装PyCharm

    PyCharm一个是Python集成开发环境,它既提供收费的专业版,也提供免费的社区版本.PyCharm带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试.语法高亮.Proj ...