【Educational Codeforces Round 103 (Rated for Div. 2) C】Longest Simple Cycle
题目链接
翻译
每一列的头尾会和前一列的第 \(a_i\) 和第 \(a_j\) 个节点相连,第 \(i\) 列有 \(c_i\) 个节点。
问你能形成的一个最长的环是多少。
题解
设 \(pre_i\) 表示从第 \(i\) 列的 两端 开始,往前延伸,形成的最长的环。
则 \(pre_i\) 有两种更新方式,第一种在第 \(i-1\) 列往两边开花,第二种,在第 \(i-1\) 列闭合。
第一种情况注意第一列不能继续开花的情况就好。
最后用 \(c[i]+pre_i\) 更新答案即可。
以及, 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;
}