「CF643G」 Choosing Ads
「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的更多相关文章
- 「AGC025D」 Choosing Points
		
「AGC025D」 Choosing Points 神仙构造题. 首先你会尝试暴力做,先随便选一个点,然后把当前能选得全选上,然后你发现这样样例都过不了. 然后我们可以这样考虑:你把距离为 \(\sq ...
 - 题解-CF643G Choosing Ads
		
CF643G Choosing Ads \(n\) 和 \(m\) 和 \(p\) 和序列 \(a_i(1\le i\le n)\).\(m\) 种如下操作: 1 l r id 令 \(i\in[l, ...
 - 「译」JUnit 5 系列:条件测试
		
原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...
 - 「译」JUnit 5 系列:扩展模型(Extension Model)
		
原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...
 - JavaScript OOP 之「创建对象」
		
工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...
 - 「C++」理解智能指针
		
维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...
 - 「JavaScript」四种跨域方式详解
		
超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...
 - 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management
		
写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...
 - 「2014-3-18」multi-pattern string match using aho-corasick
		
我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...
 
随机推荐
- githubssh配置
 - Docker学习(9) Docker守护进程的配置和操作
 - Count(1),Count(*),Count(column)区别
			
count是一种最简单的聚合函数,一般也是我们第一个开始学习的聚合函数,那么他们之间究竟由什么区别呢? 有的人说count(1)和count(*)他们之间有区别,而有的人说他们之间没有区别那么他们之间 ...
 - TSR交通标志检测与识别
			
TSR交通标志检测与识别 说明: 传统图像处理算法的TSR集成在在ARM+DSP上运行,深度学习开发的TSR集成到FPGA上运行. 输入输出接口 Input: (1)图像视频分辨率(整型int) (2 ...
 - AlexeyAB DarkNet YOLOv3框架解析与应用实践(五)
			
AlexeyAB DarkNet YOLOv3框架解析与应用实践(五) RNNs in Darknet 递归神经网络是表示随时间变化的数据的强大模型.为了更好地介绍RNNs,我强烈推荐Andrej K ...
 - Linux 2 的 Windows 子系统上发布 CUDA
			
Linux 2 的 Windows 子系统上发布 CUDA 为响应大众需求,微软 宣布 在 2020 年 5 月的 建造 大会上推出了 建造 ( WSL 2 ) – GPU 加速功能.这一特性为许多计 ...
 - httprunner的简介、httprunner做接口测试入门知识,使用httprunner模拟get请求及post请求
			
一.httprunner的简介 HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架,只需编写维护一份 YAML/JSON 脚本,即可实现自动化测试.性能测试.线上监控.持续集成等多种 ...
 - Redis系列(二):常用操作
			
一.数据类型 如果学过数据结构就会知道,操作往往是在特定的数据结构上的,不同的数据结构就会有不同的操作,Redis支持以下的数据类型: 字符串(Strings),列表(Lists),集合(Sets), ...
 - 深入理解java虚拟机笔记Chapter2
			
java虚拟机运行时数据区 首先获取一个直观的认识: 程序计数器 线程私有.各条线程之间计数器互不影响,独立存储. 当前线程所执行的字节码行号指示器.字节码解释器工作时通过改变这个计数器值选取下一条需 ...
 - CentOS 30分钟部署 .net core 在线客服系统
			
前段时间我发表了一系列文章,开始介绍基于 .net core 的在线客服系统开发过程.期间有一些朋友希望能够给出 Linux 环境的安装部署指导,本文基于 CentOS 8.3 来安装部署.在本文中我 ...