「CF643G」 Choosing Ads

传送门

如果你知道摩尔投票法可以扩展事实上是个一眼题,又好写又好调。

首先摩尔投票法是用来求众数定义为超过所有数个数一半的数的一个算法。

大致算法流程:

  • 将第一个数其设为我们预选的众数,并给其一个权值 \(w=1\)
  • 接下来,每当我们遍历一个数,若其与预选的众数相同,便使其权值加一,否则使其减一。
  • 若预选的众数权值变为 \(0\),则将使其变为 \(0\) 的这个数设为预选的众数。

最后留下的数就是答案。

然后这东西显然可以通过线段树进行合并。

然后这个东西你发现,如果我们不止预选一个数,而是预选 \(k\) 个数,我们就可以求出出现概率超过 \(\frac {1}{k+1}\) 的众数。

然后这个题就没了。

/*---Author:HenryHuang---*/
/*---Never Settle---*/
#include<bits/stdc++.h>
using namespace std;
const int maxn=1.5e5+5;
vector<pair<int,int> > tree[maxn<<2];
int tag[maxn<<2];
int n,m,p;
int a[maxn];
vector<pair<int,int> > merge(vector<pair<int,int> > a,vector<pair<int,int> > b){
for(auto [x,y]:b){
int flag=0;
for(auto &[xx,yy]:a){
if(xx==x){
yy+=y,flag=1;
break;
}
}
if(flag) continue;
a.emplace_back(x,y);
if((int)a.size()<=p) continue;
int mn=n;
for(auto [xx,yy]:a) mn=min(mn,yy);
vector<pair<int,int> > tmp;
for(auto [xx,yy]:a)
if(yy-mn) tmp.emplace_back(xx,yy-mn);
a=tmp;
}
return a;
}
void reset(int t,int len,int num){
tree[t].clear();
tree[t].emplace_back(num,len);
}
void down(int t,int ls,int rs){
if(tag[t]){
tag[t<<1]=tag[t],tag[t<<1|1]=tag[t];
reset(t<<1,ls,tag[t]),reset(t<<1|1,rs,tag[t]);
tag[t]=0;
}
}
void build(int l,int r,int t){
if(l==r){
tree[t].emplace_back(a[l],1);
return ;
}
int mid=(l+r)>>1;
build(l,mid,t<<1);
build(mid+1,r,t<<1|1);
tree[t]=merge(tree[t<<1],tree[t<<1|1]);
}
void modify(int ll,int rr,int l,int r,int num,int t){
if(ll<=l&&r<=rr){
reset(t,r-l+1,num),tag[t]=num;
return ;
}
int mid=(l+r)>>1;
down(t,mid-l+1,r-mid);
if(ll<=mid) modify(ll,rr,l,mid,num,t<<1);
if(rr>mid) modify(ll,rr,mid+1,r,num,t<<1|1);
tree[t]=merge(tree[t<<1],tree[t<<1|1]);
}
vector<pair<int,int> > query(int ll,int rr,int l,int r,int t){
if(ll<=l&&r<=rr) return tree[t];
int mid=(l+r)>>1;
down(t,mid-l+1,r-mid);
vector<pair<int,int> > tmp;
if(ll<=mid) tmp=merge(tmp,query(ll,rr,l,mid,t<<1));
if(rr>mid) tmp=merge(tmp,query(ll,rr,mid+1,r,t<<1|1));
return tmp;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m>>p;p=100/p;
for(int i=1;i<=n;++i) cin>>a[i];
build(1,n,1);
for(int i=1;i<=m;++i){
int opt,l,r,v;cin>>opt>>l>>r;
if(opt==1){
cin>>v;
modify(l,r,1,n,v,1);
}
else{
auto ans=query(l,r,1,n,1);
cout<<ans.size()<<' ';
for(auto [x,y]:ans) cout<<x<<' ';
cout<<'\n';
}
}
return 0;
}

「CF643G」 Choosing Ads的更多相关文章

  1. 「AGC025D」 Choosing Points

    「AGC025D」 Choosing Points 神仙构造题. 首先你会尝试暴力做,先随便选一个点,然后把当前能选得全选上,然后你发现这样样例都过不了. 然后我们可以这样考虑:你把距离为 \(\sq ...

  2. 题解-CF643G Choosing Ads

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

  3. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  4. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  5. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  6. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  7. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  8. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  9. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

随机推荐

  1. Django(47)drf请求生命周期分析

    前言   一般我们写完序列化以后,我们就会开始写视图了,drf中我们一般使用CBV的方式,也就是类视图的方式,最基础的我们会使用from rest_framework.views import API ...

  2. Camera Lens Coating

    Camera Lens Coating Coating Progress 转换镜头,根据要求进行OEM和设计. 光学元件:望远镜.显微镜.相机和数码相机镜头.放大镜头和远摄镜头.定心镜头.投影镜头.投 ...

  3. CUDA上的量化深度学习模型的自动化优化

    CUDA上的量化深度学习模型的自动化优化 深度学习已成功应用于各种任务.在诸如自动驾驶汽车推理之类的实时场景中,模型的推理速度至关重要.网络量化是加速深度学习模型的有效方法.在量化模型中,数据和模型参 ...

  4. 中继TensorRT集成

    中继TensorRT集成 介绍 NVIDIA TensorRT是用于优化深度学习推理的库.这种集成将使尽可能多的算子从Relay转移到TensorRT,从而无需调整调度,即可在NVIDIA GPU上提 ...

  5. 用户自定义协议client/server代码示例

    用户自定义协议client/server代码示例 代码参考链接:https://github.com/sogou/workflow message.h message.cc server.cc cli ...

  6. VB 老旧版本维护系列---尴尬的webapi访问返回json对象

    尴尬的webapi访问返回json对象 首先Imports Newtonsoft.Json Imports MSXML2(Interop.MSXML2.dll) Dim URLEncode As Sy ...

  7. Linkerd 2.10(Step by Step)—1. 将您的服务添加到 Linkerd

    为了让您的服务利用 Linkerd,它们还需要通过将 Linkerd 的数据平面代理(data plane proxy)注入到它们服务的 pod 中,从而进行网格化. Linkerd 2.10 中文手 ...

  8. 小Z的袜子(hose) &&作业 (莫队)

    莫队:一种非常优雅的暴力,时间复杂度一般情况下是n*根号n,还是很优秀的. 今天水了三道莫队题,对普通莫队有了些了解 1.莫队l和r为指针,维护当前区间的某些信息,一般可以是当前区间不同权值的个数,( ...

  9. git命令使用(必备系列)

    git是一个分布式版本控制系统,得益于高效.协作和快速的项目代码管理特性几乎每一个软件开发团队都在深度使用.本篇是对git命令的介绍,涵盖了不低于95%的日常操作命令,对你有用话可以收藏一下哦. 一. ...

  10. 透彻理解液晶显示模组LCD1602指令集与驱动编程(1)

    LCD1602可以说是大多数单片机工程师了解液晶显示的入门级模组,其显示原理与其它很多显示模组也是相似的,今天我们就来详细讨论一下它的指令集.所谓模组的指令集,本质上是该模组使用的控制芯片的指令集,本 ...