[cf643G]Choosing Ads
首先对于$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的更多相关文章
- 题解-CF643G Choosing Ads
CF643G Choosing Ads \(n\) 和 \(m\) 和 \(p\) 和序列 \(a_i(1\le i\le n)\).\(m\) 种如下操作: 1 l r id 令 \(i\in[l, ...
- 「CF643G」 Choosing Ads
「CF643G」 Choosing Ads 传送门 如果你知道摩尔投票法可以扩展事实上是个一眼题,又好写又好调. 首先摩尔投票法是用来求众数定义为超过所有数个数一半的数的一个算法. 大致算法流程: 将 ...
- @codeforces - 674G@ Choosing Ads
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定长度为 n 的序列,m 次询问以及参数 p.共有两类询问: ...
- Codeforces 643G - Choosing Ads(线段树)
Codeforces 题目传送门 & 洛谷题目传送门 首先考虑 \(p>50\) 的时候怎么处理,也就是求一个区间的绝对众数.我们知道众数这个东西是不能用线段树直接维护的,因为对于区间 ...
- 多校联训 DS 专题
CF1039D You Are Given a Tree 容易发现,当 \(k\) 不断增大时,答案不断减小,且 \(k\) 的答案不超过 \(\lfloor\frac {n}{k}\rfloor\) ...
- FineReport如何用JDBC连接阿里云ADS数据库
在使用FineReport连接阿里云的ADS(AnalyticDB)数据库,很多时候在测试连接时就失败了.此时,该如何连接ADS数据库呢? 我们只需要手动将连接ads数据库需要使用到的jar放置到%F ...
- 【转】arm 开发工具比较(ADS vs RealviewMDK vs RVDS)
ADS REALVIEW MDK RVDS 公司 ARM Keil(后被ARM收购) ARM 版本 最新1.2 ,被RVDS取代 最新4.0 是否免费 破解情况 有 有 工程管理 CodeWarr ...
- CF219D. Choosing Capital for Treeland [树形DP]
D. Choosing Capital for Treeland time limit per test 3 seconds memory limit per test 256 megabytes i ...
- NTFS系统的ADS交换数据流
VC++ 基于NTFS的数据流创建与检测 What are Alternate Streams?(交换数据流) NTFS alternate streams , 或者叫streams,或者叫ADS(w ...
随机推荐
- 左手IRR,右手NPV,掌握发家致富道路密码
智能手机的普及让世界成为了我们指尖下的方寸之地. 在各种信息爆炸出现的同时,五花八门的理财信息与我们的生活越贴越近.投资不再仅仅是企业行为,对于个人而言,也是很值得关注的内容. 但是落脚到很小的例子之 ...
- java课堂测试2第一阶段:方法运用
package test2; import java.util.*; public class Test2 { public static int generateRandom(int fanwei) ...
- C#开发BIMFACE系列47 IIS部署并加载离线数据包
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在前两篇博客<C#开发BIMFACE系列45 服务端API之创建离线数据包>与<C#开发BIMFACE系 ...
- 关于十二生肖的数学发现(C++)
把数字看成是年份,然后根据生肖赋值.这里把鼠年赋值为1,牛年赋值为2,虎年赋值为3,兔年赋值为4,龙年赋值为5,蛇年赋值为6,马年赋值为7,羊年赋值为8,猴年赋值为9,鸡年赋值为10,狗年赋值为11, ...
- 互联网公司作息表「GitHub 热点速览 v.21.42」
作者:HelloGitHub-小鱼干 检测一家公司是否值得一去,除了高薪之外,还有时薪的算法.即便是同样的时薪,在一家能随时摸鱼的公司,岂不是人生快事.WorkingTime 便是上周很火的互联网作息 ...
- Billu_b0x2内网渗透(多种提权方法)靶场-vulnhub
个人博客阅读体验更佳 本次来试玩一下vulnhub上的Billu_b0x2,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题.靶场推荐使用N ...
- 小白自制Linux开发板 八. Linux音频驱动配置
不知不觉小白自制开发板系列已经到第八篇了,本篇要配置的是音频驱动,也算是硬件部分的最后一片了,积攒的文章也差不多全放完了,后续更新可能会放缓,还请见谅. 对于F1C200s是自带了多媒体处理功能的,所 ...
- Mybatis 动态Sql练习
建表 CREATE TABLE `student` ( `s_id` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT ...
- Android构建工具--AAPT2源码解析(一)
一.什么是AAPT2 在Android开发过程中,我们通过Gradle命令,启动一个构建任务,最终会生成构建产物"APK"文件.常规APK的构建流程如下: (引用自Google官方 ...
- 四万字32图,Kafka知识体系保姆级教程宝典
本文目录: 一.消息队列 Apache Pulsar Pulsar 与 Kafka 对比 二.Kafka基础 三.Kafka架构及组件 四.Kafka集群操作 五.Kafka的JavaAPI操作 六. ...