实在是不想看这个粪山代码了,好难调啊/kk
思路感觉大家都知道所以我就不说了,所以有没有人能看看粪山代码/kk
//C
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+5;
int T,n,f[3][N],head[N],cnt=0,dp[N],maxn[N][3],maxi[N][3];
int change(int x,int y){
if(x==1) return y;
else return n+(n-y+1);
}
int main(){
scanf("%d",&T);
while(T--){
int ans=2e9;
scanf("%d",&n);
for(register int i=1;i<=n;i++) scanf("%d",&f[1][i]);
for(register int i=1;i<=n;i++) scanf("%d",&f[2][i]);
for(register int i=1;i<=n+1;i++) maxn[i][1]=maxn[i][2]=maxi[i][1]=maxi[i][2]=dp[i]=0;
dp[1]=f[2][1]+1;
for(register int i=n;i>=1;i--){
maxn[i][1]=maxn[i+1][1];
maxi[i][1]=maxi[i+1][1];
maxn[i][2]=maxn[i+1][2];
maxi[i][2]=maxi[i+1][2];
if(f[1][i]>=maxn[i][1]){
maxn[i][1]=f[1][i];
maxi[i][1]=change(1,i);
}
if(f[2][i]>=maxn[i][2]){
maxn[i][2]=f[2][i];
maxi[i][2]=change(2,i);
}
}
if(maxn[1][1]>=maxn[1][2]) ans=min(ans,maxn[1][1]+1+abs(maxi[1][1]-change(2,1)));
else ans=min(ans,maxn[1][2]+1+abs(maxi[1][2]-change(2,1)));
for(register int i=2;i<=n;i++){
if(i%2==0){
if(f[1][i]>f[2][i]) dp[i]=dp[i-1]+max(f[1][i]-dp[i-1]+1,1)+1;
else dp[i]=dp[i-1]+max(f[1][i]-dp[i-1]+1,1)+max(max(f[1][i],dp[i-1])-dp[i-1]+1,1);
int p=max(maxn[i][1],maxn[i][2]),q;
if(maxn[i][2]>=maxn[i][1]) q=maxi[i][2];
else q=maxi[i][1];
if(p>dp[i-1]) ans=min(ans,p+1+abs(q-change(1,i)));
else ans=min(ans,dp[i-1]+abs(change(2,i)-change(1,i))+1);
}else{
if(f[2][i]>f[1][i]) dp[i]=dp[i-1]+max(f[2][i]-dp[i-1]+1,1)+1;
else dp[i]=dp[i-1]+max(f[2][i]-dp[i-1]+1,1)+max(max(f[2][i],dp[i-1])-dp[i-1]+1,1);
int p=max(maxn[i][1],maxn[i][2]),q;
if(maxn[i][1]>=maxn[i][2]) q=maxi[i][1];
else q=maxi[i][2];
if(p>dp[i-1]) ans=min(ans,p+1+abs(q-change(2,i)));
else ans=min(ans,dp[i-1]+abs(change(1,i)-change(2,i))+1);
}
}
printf("%d\n",min(ans,dp[n]));
}
}