[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 ...
随机推荐
- sqlite3 c++使用以及提高速率(一万条每秒左右)
参考来源: sqlite3的C语言使用(三):https://www.leavesongs.com/C/sqlite3_3.html sqlite插入和查询效率提高方法及测试结果: http://bl ...
- 2021record
2021-10-14 P2577 [ZJOI2004]午餐 2021-10-13 CF815C Karen and Supermarket(小小紫题,可笑可笑) P6748 『MdOI R3』Fall ...
- 一时兴起,用python抓了一下美女图片。实现简单。附上实现代码,可以交流。
"""1.定义目标网址 网址2.数据定位 照片3.数据匹配 标签4.数据下载 下载"""import requestsfrom lxml i ...
- CORS+XSS的漏洞利用payload
之前有人问我有没有CORS+XSS的利用姿势,翻了一下国内貌似都没有利用姿势于是就写了这篇文章!!! 首先找到一个反射xss,然后使用xss加载javascript代码达到跨域劫持目的payload如 ...
- 【java】【作业】定义课程信息;继承和组合练习
问题: 定义课程信息类,包含课程编号.课程名称及学生成绩.编程实现对软件工程专业的某班级的所有课程成绩统计,包括平均成绩.最高成绩.最低成绩,并打印成绩等级分布律. 分析 初分析: 父类(课程信息类) ...
- python查询对像所有方法
鉴于学习时好多参数对像都不知道是什么玩意有什么方法,搜了半天一个 """arg为一个对像,下面是打印所有对像方法"""for i, func ...
- k8s replicaset controller 分析(3)-expectations 机制分析
replicaset controller分析 replicaset controller简介 replicaset controller是kube-controller-manager组件中众多控制 ...
- MacOS安装使用Kettle
一.环境说明 操作系统版本:macOS Big Sur 11.6.1 机型:Intel版本 JDK版本:Amazon Corretto-openjdk8 Kettle版本:Kettle8.9 二.问题 ...
- USB线上/串口/I2C引脚串联电阻的作用
对引脚的保护. 第一是阻抗匹配.因为信号源的阻抗很低,跟信号线之间阻抗不匹配,串上一个电阻后,可改善匹配情况,以减少反射,避免振荡等. 第二是可以减少信号边沿的陡峭程度,从而减少高频噪声以及过冲等.因 ...
- 字符串与模式匹配算法(四):BM算法
一.BM算法介绍 BM算法(Boyer-Moore算法)是罗伯特·波义尔(Robert Boyer)和杰·摩尔(J·Moore)在1977年共同提出的.与KMP算法不同的是,BM算法是模式串P由左向右 ...