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

题目大意

通俗的理解就是:先输入线的数量,然后依次输入每根线的长度,然后再依次输入每根线上的点,第一轮输入的点将与它后面的线的最上面的点相连,第二轮输入的点会与它后面的线上最下面的点相连,求闭合圆的最长长度。
具体解析看代码。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll a[100010],b[100010],c[100010],sum[100010];//sum数组用来储存每一时刻的最长长度
int main()
{
    
    
	int t;
	scanf("%d",&t);
	while(t--)
	{
    
    
		int n;
		scanf("%d",&n);
		for(int i = 1;i <= n; i++)
		{
    
    
			scanf("%lld",&c[i]);
			c[i]--;
		}
		for(int i = 1;i <= n; i++)
		{
    
    
			scanf("%lld",&a[i]);
		}
		for(int i = 1;i <= n; i++)
		{
    
    
			scanf("%lld",&b[i]);
		}
		long long maxx = 0;//maxx用来记录遍历过程中环的最大值
		for(int i = 2;i <= n; i++)
		{
    
    
			if(b[i] == a[i])
			{
    
    
				sum[i] = c[i]+2;//当bi与ai重合时,其必为圆的出发点。
			}
			else if(b[i]!=a[i]&&i>2)//当bi与ai不重合时,此时要判断它应该作为新的起点还是圆环的中间部分
			{
    
    
				if(abs(a[i] - b[i]) > sum[i - 1] - abs(a[i] - b[i]))//若当前线上ai与bi的距离大于上一圆环的长度,则重新计算圆环
				{
    
    
					sum[i] = abs(a[i] - b[i]) + 2 + c[i];
				}
				else
				{
    
    
					sum[i] = sum[i-1] - abs(b[i] - a[i]) + 2 + c[i];//反之将其作为上一圆环的一部分
				}
			}
			else if(b[i]!=a[i]&&i==2)//这里是特判i=2时的情况,此时必为起点
			{
    
    
				sum[i]=abs(b[i]-a[i])+c[i]+2;
			}
			maxx=max(maxx,sum[i]);//每次记录长度的最大值
		}
		printf("%lld\n",maxx);
		for(int i=1;i<=n;i++)
		{
    
    
			a[i]=b[i]=c[i]=sum[i]=0;//清空各数组
		}
	}
}

猜你喜欢

转载自blog.csdn.net/p15008340649/article/details/113664684