「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. Linux Docker 部署 ASP.NET Core应用

    一.系统环境 1.腾讯云轻量应用服务器CentOS7.6 二.操作流程及途中遇到的问题 1.SSH方式远程Linux ssh <username>@<IP address or do ...

  2. [leetcode] 44. 通配符匹配(Java)(动态规划)

    44. 通配符匹配 动态规划 做动态规划很简单,三步走: 第一步,判断可否用动态规划做,即判断是否满足两个条件:①最优子结构,②重叠子问题.显然该题求s与p是否match,可由其字串层层分解上来. 我 ...

  3. docker部署安装流程第一版

    docker部署安装流程第一版 1.以Dockerfile的方式进行构建docker 以cloud 新联盟为例 dockerfile from hub.c.163.com/library/maven  ...

  4. Step By Step(Lua弱引用table)

    Step By Step(Lua弱引用table) Lua采用了基于垃圾收集的内存管理机制,因此对于程序员来说,在很多时候内存问题都将不再困扰他们.然而任何垃圾收集器都不是万能的,在有些特殊情况下,垃 ...

  5. 项目记事【Git】:git pull 出错 error: cannot lock ref 'refs/remotes/origin/feature/hy78861': is at d4244546c8cc3827491cc82878a23c708fd0401d but expected a6a00bf2e92620d0e06790122bab5aeee01079bf

    今天 pull 代码的时候碰到以下问题(隐去了一些公司敏感信息): XXX@CN-00012645 MINGW64 /c/Gerrard/Workspace/XXX (master) $ git pu ...

  6. 5G和AI机器人平台

    5G和AI机器人平台 Qualcomm Launches 5G and AI Robotics Platform 高通技术公司(Qualcomm Technologies)周三推出了一款高级5G和人工 ...

  7. 72 个网络应用安全实操要点,全方位保护 Web 应用的安全

    原文地址:Web Application Security Checklist 原文作者:Teo Selenius(已授权) 译者 & 校正:HelloGitHub-小熊熊 & 卤蛋 ...

  8. 聊一聊 Spring Boot 中 RESTful 接口设计规范

    在设计接口时,有很多因素要考虑,如接口的业务定位,接口的安全性,接口的可扩展性.接口的稳定性.接口的跨域性.接口的协议规则.接口的路径规则.接口单一原则.接口过滤和接口组合等诸多因素,本篇文章将简要分 ...

  9. Luat Inside | 多功能YAP物联网终端机,你不会还不知道吧?

    简洁高效是合宙产品的一个重要特点,合宙的工程师们用Demo取代繁杂的说明书,以便于开发者快速上手. 有没有可能把这个学习的过程变得更有趣,并且把技术入门难度进一步降低?作为一名Luat技术爱好者,我对 ...

  10. Mybatis学习01:利用mybatis查询数据库

    通过mybatis来操作mysql数据库的步骤大致可分为以下几步: 在这里,我们以对下面这个这个表格进行操作为例: 表名:ssm 1 配置依赖 在pom.xml中添加所需要的的依赖 <!-- m ...