「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. 『动善时』JMeter基础 — 38、JMeter中实现跨线程组关联

    目录 1.JMeter中实现跨线程组关联说明 (1)JMeter中实现跨线程组关联步骤 (2)测试计划内包含的元件 2.用户登陆请求的相关操作 (1)进行登陆操作获取Cookie信息 (2)把Cook ...

  2. NNVM Compiler,AI框架的开放式编译器

    NNVM Compiler,AI框架的开放式编译器 深度学习已变得无处不在且不可或缺.在多种平台(例如手机,GPU,IoT设备和专用加速器)上部署深度学习工作负载的需求不断增长.宣布了TVM堆栈,以弥 ...

  3. 将HLSL射线追踪到Vulkan

    将HLSL射线追踪到Vulkan Bringing HLSL Ray Tracing to Vulkan Vulkan标志 DirectX光线跟踪(DXR)允许您使用光线跟踪而不是传统的光栅化方法渲染 ...

  4. TVM vs TensorRT比较

    TVM vs TensorRT比较 如果理解正确的话,TensorRT和TVM会加快预测速度. TensorRT优化预测GPU和TVM优化预测几乎所有平台支持GPU,ARM,Mobile... 两者在 ...

  5. 理解 this

    this this 取什么值是在函数执行的时候确认的,不是在函数定义的时候确认的 this 的不同应用场景,this 的指向 函数在调用时,js 会默认给 this 绑定一个值,this 的值与绑定方 ...

  6. httprunnermanager安装和配置

    服务端安装mysql数据库(建议5.7以上的,mysql安装教程),设置utf-8编码,创建对应的数据库,设置好相应的用户名,密码,然后启动mysql 下载httprunnermanager 安装ht ...

  7. 解决servlet响应乱码问题

    当我们使用servlet响应中文时,浏览器接收的内容就会乱码显示出来,原因是响应数据时使用的是utt-8编码,而浏览器解析响应用的的编码却不是utf-8,这样就会造成乱码. 解决办法: respons ...

  8. 如果在num1的任何位置有一个数字的连续三倍,并且在num2中有一个数字的连续两倍,则返回1。 如果不是这样,则返回0

    ''' 它接受数字num1和num2,如果在num1的任何位置有一个数字的连续三倍,并且在num2中有一个数字的连续两倍,则返回1. 如果不是这样,则返回0 例子 triple_double(4519 ...

  9. 【NX二次开发】Block UI 通过浏览选择文件

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  10. Typora 配置码云图床

    目录 在码云创建一个项目作为自己床图 设置私人令牌 下载安装 PigGo Typora中设置图片上传选项 在码云创建一个项目作为自己床图 创建的项目必须为公开项目,创建的过程不细说了. 设置私人令牌 ...