题目链接
大致题意:
给你长度为n的数组,n为偶数且1<=a[i]<=k;给你一种操作可将a[i]替换成[1,k]任意一个数,要你求最小操作次数使得满足:对于所有的1<=i<=n/2 都有a[i]+a[n-i+1]为一相同值。
解题报告:
我们可以用差分数组维护x值的最小操作次数;
sum=p[i]+p[n-i+1] , mi=min(p[i],p[n-i+1]) , mx=max(p[i],p[n-i+1])
分情况讨论:
- x∈[ 2,mi ] 两个值均要减小 故操作数+=2
- x∈[ mi+1,mx+k ] 此时只需更改mi即可 故操作数+=1
- x∈[ mx+k+1,2*k ] 两个值均要更改 故操作数+=2
- x==sum;之前讨论已将将其算进去了,需将其减去 故操作数-=1
#define first f
#define second s
#define ll long long
#define mp make_pair
#define pb push_back
#define pf push_front
#define lb lower_bound
#define ub upper_bound
#define sl(p) strlen(p)
#define SZ(p) p.size()
#define pii pair<int,int>
#include <bits/stdc++.h>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
const int MOD=1e9+7;
const int maxn=2e5+5;
const int inf=0x3f3f3f3f;
int d[maxn<<1],p[maxn];
int main()
{
int T,n,k;
scanf("%d",&T);
while(T--){
mem(d,0);
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)scanf("%d",&p[i]);
for(int i=1;i<=n/2;i++){
int sum=p[i]+p[n-i+1];
int mi=min(p[i],p[n-i+1]),mx=max(p[i],p[n-i+1]);
d[2]+=2;
d[mi+1]--;
d[mx+k+1]++;
d[sum]--;
d[sum+1]++;
}
int ans=inf,num=0;
for(int i=2;i<=(k<<1);i++){
ans=min(ans,num+=d[i]);
}
printf("%d\n",ans);
}
return 0;
}