CF1476 C. Longest Simple Cycle
原创
©著作权归作者所有:来自51CTO博客作者为最后的荣光的原创作品,请联系作者获取转载授权,否则将追究法律责任
CF1476 C. Longest Simple Cycle (模拟+思维)
题意:
给出你段线段,然后长度为,给出你每个点的前缀起点和终点,让你求最长环,斜边算1.
思路:
借助图形理解一下:
- 如果起点终点为一个点那么就必须需要重新开一个新的,
- 我们可以把这个当成终点,也可以继续扩充.就像上图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);
}