题目大意
通俗的理解就是:先输入线的数量,然后依次输入每根线的长度,然后再依次输入每根线上的点,第一轮输入的点将与它后面的线的最上面的点相连,第二轮输入的点会与它后面的线上最下面的点相连,求闭合圆的最长长度。
具体解析看代码。
#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;//清空各数组
}
}
}