Codeforces Round 939 D. Nene and the Mex Operator 【构造、思维、状压】

news2024/11/20 2:35:46

D. Nene and the Mex Operator

D

题意

给定一个长度为 n n n 的正整数数组 a a a,定义操作:

  • 选定一个区间 [ l , r ] [l, r] [l,r],将区间内的数字替换成: m e x ( a l , a l + 1 , . . . , a r ) mex(a_l,a_{l+1},...,a_r) mex(al,al+1,...,ar)

要求在不超过 5 ⋅ 1 0 5 5\cdot 10^5 5105 次操作下, 最大化数组的和

思路

首先需要注意到一个很关键的点:对于一个长度为 l e n len len 的区间 [ l , r ] [l,r] [l,r],不管怎样对这个区间操作,最终这个区间的每个数最大就是 l e n len len,排除掉 a i a_i ai 本身就比 l e n len len 大的情况
这是因为如果要产生 m e x = l e n mex = len mex=len,那么就需要 0 , 1 , . . . , l e n − 1 0,1,...,len - 1 0,1,...,len1 l e n len len 个数,再大的 m e x mex mex 值区间长度就不够放了

因此我们可以大胆猜测(对构造题很重要):一个长度为 l e n len len 的区间可以构造出 l e n len len a i = l e n a_i = len ai=len,也就是最后一次操作是 [ l , r ] [l,r] [l,r],且 m e x = l e n mex = len mex=len

如何操作?我们将区间移动到前缀 [ 1 , l e n ] [1,len] [1,len],就是对应代码 s o l v e ( k , p ) solve(k, p) solve(k,p) 函数, k = l e n k = len k=len p = l p = l p=l,表示将前 k k k 个数变为全 k k k 需要的操作

注意在每次进入 s o l v e solve solve 之前,我们需要保证区间全零
具体原理就是: a k = 0 a_k = 0 ak=0 不动,先递归求解 s o l v e ( k − 1 ) solve(k - 1) solve(k1),现在 [ 1 , k − 1 ] [1, k - 1] [1,k1] 全为 k − 1 k - 1 k1
然后我们将 [ 1 , k − 2 ] [1, k - 2] [1,k2] 设置为全零,再递归求解 s o l v e ( k − 2 ) solve(k -2) solve(k2),保持 a k − 1 = k − 1 a_{k - 1} = k - 1 ak1=k1 不变
一直循环下去,直到前缀为: 1 , 2 , 3 , . . . . , k − 1 , 0 1,2,3,...., k - 1,0 1,2,3,....,k1,0,这时 m e x mex mex 就等于 k k k

这样子递归操作的次数大约为 O ( 2 n ) O(2 ^ n) O(2n)
这是因为: s o l v e ( k ) solve(k) solve(k) 要调用一次 s o l v e ( k − 1 ) solve(k - 1) solve(k1),而后调用 s o l v e ( k − 2 ) → s o l v e ( 1 ) solve(k - 2) \rarr solve(1) solve(k2)solve(1)
s o l v e ( k − 1 ) solve(k -1) solve(k1) 也会调用 s o l v e ( k − 2 ) → s o l v e ( 1 ) solve(k - 2) \rarr solve(1) solve(k2)solve(1),因此 s o l v e ( k ) solve(k) solve(k) 大于是 s o l v e ( k − 1 ) solve(k - 1) solve(k1) 调用次数的 2 2 2 倍,也就是说,这是一个公比大约为 2 2 2 的等比数列

得出这个结论和构造方式后,我们就可以采用状压二进制枚举操作的区间,其余保留原值即可

// Problem: D. Nene and the Mex Operator
// Contest: Codeforces - Codeforces Round 939 (Div. 2)
// URL: https://codeforces.com/contest/1956/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n' 
#define ull unsigned long long

const int INF=0x3f3f3f3f;
const long long INFLL=0x3f3f3f3f3f3f3f3fLL;

typedef long long ll;

std::vector<std::pair<int, int>> opt;

void solve(int k, int p){
	if(k == 1){
		opt.push_back({p, p});
		return;
	}
	solve(k - 1, p);
	for(int i = k - 2; i > 0; --i){
		opt.push_back({p, p + i - 1}); //turn [1, i] to 0
		solve(i, p);
	}
	opt.push_back({p, p + k - 1});
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int n;
    std::cin >> n;
    std::vector<int> a(n);
    fore(i, 0, n)	std::cin >> a[i];
    int ans = 0;
    int sta = 0;
    fore(S, 0, 1 << n){
    	std::vector<bool> v(n);
    	fore(j, 0, n)	v[j] = (S >> j & 1);
    	int sum = 0;
    	int len = 0;
    	fore(i, 0, n){
    		if(!v[i]){
    			sum += len * len;
    			len = 0;
    			sum += a[i];
    		}
    		else ++len;
    	}
    	sum += len * len;
    	if(sum > ans){
    		ans = sum;
    		sta = S;
    	}
    }
    std::vector<std::pair<int, int>> vec;
	int i = 0;
	int l = -1;
	while(i < n){
		if(!(sta >> i & 1)){
			if(l != -1)	vec.push_back({l + 1, i});
			l = -1;
		}
		else if(l == -1) l = i;
		++i;
	}
	if(l != -1)	vec.push_back({l + 1, n});
	
	for(auto [l, r] : vec){
		fore(p, l, r + 1)
			if(a[p - 1])
				opt.push_back({p, p}); //turn a[p] to 0
		solve(r - l + 1, l);
	}
	
    std::cout << ans << ' ' << opt.size() << endl;
    for(auto [l, r] : opt)	std::cout << l << ' ' << r << endl;
	return 0; 
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1624355.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

探索适合你的6个兼职副业之路

在当下这个多元化的社会&#xff0c;寻找一份适合自己的兼职副业已成为许多人的追求。市场上的选择繁多&#xff0c;从线上调查到电子商务&#xff0c;每一种副业都有其独特的魅力和挑战。下面&#xff0c;我将为大家介绍六种热门的兼职副业选择&#xff0c;希望能够帮助你找到…

深度学习检测算法YOLOv5的实战应用

在当前的检测项目中&#xff0c;需要一个高效且准确的算法来处理大量的图像数据。经过一番研究和比较&#xff0c;初步选择了YOLOv5作为算法工具。YOLOv5是一个基于深度学习的检测算法&#xff0c;以其快速和准确而闻名。它不仅能够快速处理图像数据&#xff0c;还能提供较高的…

Springboot+Vue项目-基于Java+MySQL的网上点餐系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

【Python数据库】Redis

文章目录 [toc]数据插入数据查询数据更新数据删除查询存在的所有key 个人主页&#xff1a;丷从心 系列专栏&#xff1a;Python数据库 学习指南&#xff1a;Python学习指南 数据插入 from redis import Redisdef insert_data():redis_cli Redis(hostlocalhost, port6379, db…

软件工程中的耦合和内聚

耦合 在软件工程中&#xff0c;耦合是一个重要的概念&#xff0c;用于描述模块或组件之间的相互依赖程度。 从非直接耦合到内容耦合的耦合性依次升高&#xff0c;所以非直接耦合是我们最想见到的结果&#xff0c;内容耦合是我们最不想见到的结果。 非直接耦合数据耦合标记耦…

车企的数智化“内功”,大模型帮修炼

文&#xff5c;白 鸽 编&#xff5c;王一粟 时隔4年回归的北京车展&#xff0c;遇上了中国智能汽车的热潮。 开年价格战的持续洗礼&#xff0c;不仅让一众中国车企都慌得一批&#xff0c;也让全球巨头特斯拉也面临一季度销量大跌局面。 与此同时&#xff0c;智能汽车还在…

阿斯达年代记下载注册+短信验证教程分享

阿斯达年代记&#xff1a;三强争霸》预计将于4月24日盛大发布&#xff0c;标志着一款新颖的MMORPG游戏面世&#xff0c;它跨越安卓、苹果和PC三大平台&#xff0c;实现数据互通&#xff0c;满足多元化玩家群体的需求。无论是追求移动便捷的手游爱好者&#xff0c;还是偏爱高性能…

Redis系列5:深入分析Cluster 集群模式

1 背景 前面我们学习了Redis高可用的两种架构模式&#xff1a;主从模式、哨兵模式。 解决了我们在Redis实例发生故障时&#xff0c;具备主从自动切换、故障转移的能力&#xff0c;终保证服务的高可用。 但是这些其实远远不够&#xff0c;随着我们业务规模的不断扩展&#xff0…

Golang GMP解读

概念梳理 1. 1 线程 通常语义中的线程&#xff0c;指的是内核级线程&#xff0c;核心点如下&#xff1a; 是操作系统最小调度单元&#xff1b;创建、销毁、调度交由内核完成&#xff0c;cpu 需完成用户态与内核态间的切换&#xff1b;可充分利用多核&#xff0c;实现并行. …

指标+AI:迈向智能化,让指标应用更高效

近日&#xff0c;以“DataAI&#xff0c;构建新质生产力”为主题的袋鼠云春季发布会圆满落幕&#xff0c;大会带来了一系列“AI”的数字化产品与最新行业沉淀&#xff0c;旨在将数据与AI紧密结合&#xff0c;打破传统的生产力边界&#xff0c;赋能企业实现更高质量、更高效率的…

Java集合框架-Collection-List-vector(遗留类)

目录 一、vector层次结构图二、概述三、底层数据结构四、常用方法五、和ArrayList的对比 一、vector层次结构图 二、概述 Vector类是单列集合List接口的一个实现类。与ArrayList类似&#xff0c;Vector也实现了一个可以动态修改的数组&#xff0c;两者最本质的区别在于——Vec…

hertzbeat 源码阅读记录

关于自定义标签的说明 EmailValid.java HostValid PhoneNumValid 枚举值说明&#xff1a;

TCP协议数据传输过程及报文分析

目录 TCP数据的传输过程 建立连接&#xff08;三次握手&#xff09; 第一次握手 第二次握手 第三次握手 总结 数据传输 断开连接&#xff08;四次挥手&#xff09; 第一次挥手 第二次挥手 第三次挥手 第四次挥手 总结 最后 TCP数据的传输过程 TCP&#xff08;Tra…

在python中,对encodeURIComponent的使用避坑指南

随笔记录 某站点对请求参数加密的时候对键值对都进行了encodeURIComponent。那encodeURIComponent的作用是什么呢&#xff1f;如何在python中进行使用呢&#xff1f;使用过程中如何结合实际情况解决问题呢&#xff1f;以下是避坑指南&#xff0c;会让你少走很多弯路。 作用 en…

NVIDIA CUDA Toolkit

NVIDIA CUDA Toolkit CUDA Toolkit 12.4 Update 1 Downloads | NVIDIA Developer CUDA Toolkit是用于CUDA开发的软件包&#xff0c;主要包括CUDA编译器、运行时库、GPU驱动程序和开发工具等。它允许开发者使用通用编程语言&#xff08;如C、C&#xff09;来利用NVIDIA GPU进行…

mac终端出现bogon原因与解决办法

问题描述 不知道啥原因mac终端的用户名就变成了 xxxbogon &#xff0c;可能是强制关闭终端导致的吧。 问题原因 终端在初始化时&#xff0c;需要确定主机的名字&#xff0c;此时终端会向 DNS 服务器反向查询本机 IP 地址&#xff0c;然后把得到的名字作为自己的主机名。如果…

使用 Rust 后,我​​使用 Python 的方式发生了变化

使用 Rust 后&#xff0c;我​​使用 Python 的方式发生了变化 Using type hints where possible, and sticking to the classic “make illegal state unrepresentable” principle. 尽可能使用类型提示&#xff0c;并坚持经典的“使非法状态不可表示”原则。 近年来&#xff…

LeetCode78:子集

题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的 子集 &#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 代码 class Solution { public:vector<vector<int>> res;vector<…

xgp怎么取消续费 手把手介绍微软商店xgp关闭自动续费教程

Xbox是美国微软公司创建的电子游戏品牌&#xff0c;随2001年11月第一代Xbox游戏机发布而首次推出。其产品和服务包括家用游戏机、游戏制作与发行、线上游戏服务和内容订阅服务。Xbox已发售的家用游戏机有Xbox、Xbox360、Xbox One、Xbox One S、Xbox One X、Xbox Series X、Xbox…