【Educational Codeforces Round 103 (Rated for Div. 2) C】Longest Simple Cycle

题目链接

链接

翻译

每一列的头尾会和前一列的第 ai 和第 aj 个节点相连,第 i 列有 ci 个节点。

问你能形成的一个最长的环是多少。

题解

prei 表示从第 i 列的 两端 开始,往前延伸,形成的最长的环。

prei 有两种更新方式,第一种在第 i1 列往两边开花,第二种,在第 i1 列闭合。

第一种情况注意第一列不能继续开花的情况就好。

最后用 c[i]+prei 更新答案即可。

以及, LL

代码

#include <bits/stdc++.h>
#define LL long long
using namespace std;

const int N = 1e5;

int T,n;
LL c[N + 10], a[N + 10], b[N + 10],pre[N + 10];

int main() {
	#ifdef LOCAL_DEFINE
		freopen("in.txt", "r", stdin);
	#endif // LOCAL_DEFINE
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> T;
	
	while(T--){
		cin >> n;
		for (int i = 1; i <= n; i++) {
			cin >> c[i];
		}
		for (int i = 1; i <= n; i++) {
			cin >> a[i];
		}
		for (int i = 1; i <= n; i++) {
			cin >> b[i];
		}
		pre[1] = 0;
		for (int i = 2; i <= n; i++) {
			if (a[i] != b[i]) {
				if (i > 2) {
					if (a[i] < b[i]) {
						pre[i] = pre[i - 1] + 2 + a[i] - 1 + c[i - 1] - b[i];
					}
					else {
						pre[i] = pre[i - 1] + 2 + b[i] - 1 + c[i - 1] - a[i];
					}
				}
				else {
					pre[i] = 0;
				}
				
			}
			else pre[i] = 2;
			pre[i] = max(pre[i], 2 + abs(b[i] - a[i]));
		}
		LL ans = pre[2] + c[2]-1;
		for (int i = 3; i <= n; i++) {
			ans = max(ans, pre[i] + c[i]-1);
		}
		cout << ans << endl;
	}
	return 0;
}
posted @   AWCXV  阅读(56)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2019-03-08 【Codeforces 986B】Petr and Permutations
2019-03-08 【Codeforces 246D】Colorful Graph
点击右上角即可分享
微信分享提示