Codeforces Round 162 (Div 2)(A - E)

2023-09-18 18:47:08

Codeforces Round 162 (Div. 2)(A - E)

Dashboard - Codeforces Round 162 (Div. 2) - Codeforces

A. Colorful Stones (Simplified Edition)(模拟)

模拟一下即可

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;

string s1 , s2;

signed main(){

	cin >> s1 >> s2;
	s1 = '?' + s1;
	s2 = '?' + s2;
	int pos = 1;
	int n = s2.size();
	for(int i = 0 ; i < n ; i ++) {
		if(s2[i] == s1[pos]) pos += 1;
	}
	cout << pos << "\n";
	return 0;
}

B. Roadside Trees (Simplified Edition)(模拟 + 贪心)

手模一下 , 可以发现 , 贪心的从左往右处理就是最优的 , 如果先处理右边的一定还要回来处理左边的 , 往返时会产生花费的。

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;

int h[N] , n;

signed main(){

	cin >> n;
	for(int i = 1 ; i <= n ; i ++) cin >> h[i];
	int now = 0 , res = 0;
	for(int i = 1 ; i <= n ; i ++) {
		if(i == 1) {
			res += abs(now - h[i]) + 1;
			now = h[i];
		} else {
			res += abs(now - h[i]) + 2;
			now = h[i];
		}
	} 
	cout << res << "\n";

	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

C. Escape from Stones(链表)

模拟一下操作不难发现就是需要模拟链表操作 , 数组模拟链表即可。

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;

const int start = 1e6 + 1 , ed = 1e6 + 2;
int pre[N] , nex[N] , now = 1 , n;
string s;

signed main(){

	pre[1] = start;
	nex[start] = 1;
	nex[1] = ed;
	pre[ed] = 1;

	cin >> s;
	n = s.size();
	s = "??" + s;
	for(int i = 2 ; i <= n ; i ++) {
		if(s[i] == 'l') {
			pre[i] = pre[now];
			nex[pre[now]] = i;
			pre[now] = i;
			nex[i] = now;
		} else {
			nex[i] = nex[now];
			pre[nex[now]] = i;
			nex[now] = i;
			pre[i] = now;
		}
		now = i;
	}
	
	for(int i = nex[start] ; i != ed ; i = nex[i]) {
		cout << i << "\n";
	}
	

	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

D. Good Sequences(dp + 数论)

考虑 dp , 设计状态

d p [ i ]  为选择以 i 结尾的最大序列长度 dp[i] ~为选择以 i 结尾的最大序列长度 dp[i] 为选择以i结尾的最大序列长度

不难想出一个 O(n^2logn)的一个状态转移 , 考虑优化 , 当前位置可以从前面的数转移过来当前仅当前面的数和当前位置的数有公因子 , 考虑维护每个一个因子对应的最大贡献值 , 然后每个数从因子转移即可 , 复杂度O(nsqrt(n)) , 维护质因子可以做到O(nlogn)

复杂度 ( O ( n n ) ) 复杂度(O(n\sqrt n)) 复杂度(O(nn ))

#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;

int n , a[N] , dp[N] , pre[N];

signed main(){

	IOS
	cin >> n;
	for(int i = 1 ; i <= n ; i ++) cin >> a[i] , dp[i] = 1;
	for(int i = 1 ; i <= n ; i ++) {
		for(int j = 1 ; j * j <= a[i] ; j ++){
			if(a[i] % j == 0) {
				if(j > 1) dp[i] = max(dp[i] , pre[j] + 1);
				dp[i] = max(dp[i] , pre[a[i] / j] + 1);
			}
		}
		
		for(int j = 1 ; j * j <= a[i] ; j ++) {
			if(a[i] % j == 0) {
				pre[j] = max(pre[j] , dp[i]);
				pre[a[i] / j] = max(pre[a[i] / j] , dp[i]);
			}
		}
	}
	
	int res = 0;
	
	for(int i = 1 ; i <= n ; i ++) {
		res = max(res , dp[i]);
	}
	cout << res << "\n";
	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);

E. Choosing Balls(dp 优化)

考虑 dp , 设计状态

d p [ i ]  为第 i 种颜色结尾序列的最大贡献 dp[i] ~为第i种颜色结尾序列的最大贡献 dp[i] 为第i种颜色结尾序列的最大贡献

考虑如何转移

对于第一种操作 即 : v[i] * a

当且仅当当前颜色非第一次出现时才可转移

对于第二种操作 即 : v[i] * b

任何时候都可以进行第二种操作 即:

dp[c[i]] = dp[c[i]] + v[i] * a;

dp[c[i]] = max(dp[j ≠ c[i]]) + v[i] * b

对于第二个转移来说显然是O(n^2)的 , 考虑维护最大值和次大值来O(1) 的转移。

时间复杂度 O ( n q ) 时间复杂度O(nq) 时间复杂度O(nq)

一些易错点:

1. 首先对于 dp 数组的初始化 , 一定要初始化成 -inf , 因为一个序列前后是有影响的 ,贡献最大的那个数列的前缀有可能贡献是负数 , 我们也要进行统计 , 所以要初始化成负无穷。

2. 对于最大次大值的维护 ,因为最大值可能多次出现 , 所以尽量多用编号去维护 , 而非值去维护 , 注意最大次大值可能相。

2. 对于最大次大值得维护 , 要注意最大次大值颜色应该不同 , 不能维护两个颜色相同得最大次大值 ,这样是错误的。


#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;

int n , q , vis[N] , dp[N] , c[N] , v[N];
int a , b;

signed main(){

	IOS
	
	cin >> n >> q;
	
	for(int i = 1 ; i <= n ; i ++) cin >> v[i];
	for(int i = 1 ; i <= n ; i ++) cin >> c[i];
	for(int i = 1 ; i <= q ; i ++) {
		cin >> a >> b;
		for(int j = 1 ; j <= n ; j ++) dp[j] = -1e18 , vis[j] = 0;
		int id1 = 0 , id2 = 0 , ans = 0;
		for(int j = 1 ; j <= n ; j ++) {
			int now = dp[c[j]];	
			//操作二
			if(dp[c[j]] == dp[id1]) {
				now = max(now , dp[id2] + b * v[j]);
			} else {
				now = max(now , dp[id1] + b * v[j]);
			}
			//操作一
			if(!vis[c[j]]) {
				vis[c[j]] = 1;
			} else {
				now = max(now , dp[c[j]] + a * v[j]);
			}
			dp[c[j]] = now;
			
			//用编号维护最大次大值
			if(id1 != c[j]){
				if(dp[c[j]] > dp[id1]) id2 = id1 , id1 = c[j];
			    else if(dp[c[j]] > dp[id2]) id2 = c[j];
			}
			ans = max(ans , dp[c[j]]);
		}
		cout << ans << "\n";
	}
	
	return 0;
}

更多推荐

CSS基础 2

目录Emmet语法快速生成HTML结构语法快速生成CSS样式VSCode代码格式化复合选择器后代选择器子元素选择器选择器的练习并集选择器伪类选择器链接伪类如何使用注意事项:focus伪类选择器复合选择器总结CSS元素显示模式元素显示模式块级元素行内元素行内块元素元素显示模式总结元素显示模式的切换行内元素切换为块级元素块

猫头虎博主的AI魔法课:一起探索CSDN AI工具集的奥秘!

🌷🍁博主猫头虎带您GotoNewWorld.✨🍁🦄博客首页——猫头虎的博客🎐🐳《面试题大全专栏》文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺🌊《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐🌊《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大

Python实现逐步回归

逐步回归(StepwiseRegression)是一种逐步选择变量的回归方法,用于确定最佳的预测模型。它通过逐步添加和删除变量来优化模型的预测能力。本文重点讲解什么是逐步回归,以及用Python如何实现逐步回归。文章目录一、什么是逐步回归?二、实现逐步回归的函数参数详解三、Python实现逐步回归1读取数据2双向筛选逐

如何在SOLIDWORKS PDM中快速导出BOM表

在SOLIDWORKSPDM中,选择装配体后,下方就可以直接看到该装配体的材料明细表,并直接导出CSV文件,在材料明细表里我们可以去定义我们要输出哪些属性信息,但是不能定义BOM表格的表头样式,所以导出材料明细表之后还要再编辑表头信息,才能够做出符合公司规范的BOM表。今天我们介绍一款工具-SOLIDWORKSBOM插

大采购B-PaaS平台,助力企业打造供应链商业网络生态圈

近日,由葡萄城举办的大型线上直播活动“Wyn商业智能V7.0发布会暨嵌入式BI研讨会”重磅召开。北京筑龙大采购标品产研群总经理谢芳受邀参会,并作题为“大采购B-PaaS平台之采购指标体系构建”的主题分享,为线上伙伴分享北京筑龙在打造B-PaaS平台的过程当中,如何借助Wyn产品来构建采购指标体系,提升大采购产品的数字化

Vue3:组件的生命周期函数

这一篇博客是结合官网完档和书籍后整理的,会很简单,可能对很对朋友都没有任何的帮助,这只是我对自己的学习vue这个技术栈的笔记。onMounted注册一个会调用函数,在组件挂载完成后执行。那么vue组件在什么情况下,算是已经挂载了呢?所有同步的子组件都已经被挂载;自身的DOM树已经创建完成并且插入父容器中。这个时候,组件

Python 数据可视化:Seaborn 库的使用

✅作者简介:人工智能专业本科在读,喜欢计算机与编程,写博客记录自己的学习历程。🍎个人主页:小嗷犬的个人主页🍊个人网站:小嗷犬的技术小站🥭个人信条:为天地立心,为生民立命,为往圣继绝学,为万世开太平。本文目录Seaborn简介Seaborn安装Seaborn使用Seaborn样例数据集Seaborn样式设置Seab

遥感数据与作物模型同化技术应用

基于过程的作物生长模拟模型DSSAT是现代农业系统研究的有力工具,可以定量描述作物生长发育和产量形成过程及其与气候因子、土壤环境、品种类型和技术措施之间的关系,为不同条件下作物生长发育及产量预测、栽培管理、环境评价以及未来气候变化评估等提供了定量化工具。但是,当作物生长模型从单点研究发展到区域尺度应用时,由于空间尺度增

C++核心编程——P36-友元

友元客厅就是Public,你的卧室就是Private客厅所有人都可以进去,但是你的卧室只有和你亲密的人可以进。在程序中,有些私有属性也想让类外特殊的一些函数或者类进行访问,就需要用到友元技术。友元的目的就是让一个函数或者类访问另一个类中的私有元素。友元的关键字——friend友元的三种实现全局函数做友元类做友元成员函数

进入docker容器内部使用命令行工具

进入Docker容器内部后,你可以使用以下命令行工具和方式来进行交互和操作容器内部的环境:bash/shell:大多数基于Linux的Docker容器提供了bash或shell作为默认的命令行工具。可以使用以下命令进入容器的shell环境:dockerexec-it<container_name_or_id>bash或

Mybatis&MybatisPlus 操作 jsonb 格式数据

最近有用到postgresql,里面的一个特色数据类型便是jsonb,和json差不多,但是查询比较快,关于概念,这里就提一句,不赘述。我们先来看下用mybatisplus,首先是查询数据。依赖:<dependency><groupId>com.baomidou</groupId><artifactId>mybatis

热文推荐