CF1476 C. Longest Simple Cycle (模拟+思维)

题意:

给出你CF1476 C. Longest Simple Cycle_i++段线段,然后长度为CF1476 C. Longest Simple Cycle_i++_02,给出你每个点的前缀起点和终点,让你求最长环,斜边算1.

思路:

借助图形理解一下:

CF1476 C. Longest Simple Cycle_i++_03

  • 如果起点终点为一个点那么就必须需要重新开一个新的,
  • 我们可以把这个当成终点,也可以继续扩充.就像上图2和3.
void solve()
{
cin >> n ;
for(int i = 1; i <= n; i++)
{
scanf("%lld", &a[i]);
a[i]--;
}
for(int i = 1; i <= n; i++)
{
scanf("%lld", &b[i]);
}
for(int i = 1; i <= n; i++)
{
scanf("%lld", &c[i]);
}
ans = 0;
ll now = 0;
for(int i = n; i >= 2; i--)
{
if(!now) now = a[i]; /// 后面那个选的点,这个就得选这条边
if(c[i] == b[i])/// 前为一点
{
ans = max(ans, now + 2);/// +2 两个斜边
now = 0;
}
else
{
now += 2;
ans = max(ans, now + abs(b[i] - c[i]));/// 记录一下成环.
now += a[i - 1] - abs(b[i] - c[i]);/// 绕开
if(a[i - 1] > now) now = a[i - 1] ;///另开一个
}
}
printf("%lld\n", ans);
}