http://codeforces.com/contest/1343/problem/D
给出一个n,k,n为偶数,再给出长度为n的数组a[i],1≤a[i]≤k.
你可以将a[i]替换成[1,k]的任何数使得所有的 ai+an−i+1 (1 ≤ i ≤ n/2 )等于同一个数,求最少的替换个数。
思路如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; const int MAXN=5e5+5; const int mod=1e9+7; typedef long long ll; const int inf=0x3f3f3f3f; const long long INF=0x3f3f3f3f3f3f3f3f; int a[MAXN],cnt[MAXN]; int main() { int t; scanf("%d",&t); while(t--) { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1,j=n;i<=n/2;i++,j--) { cnt[1]+=2; cnt[a[i]+a[j]]--; cnt[a[i]+a[j]+1]++; cnt[min(a[i],a[j])+1]--; cnt[max(a[i],a[j])+k+1]++; } int ans=n; for(int i=2;i<=k*2;i++) { cnt[i]+=cnt[i-1]; ans=min(ans,cnt[i]); } printf("%d\n",ans); for(int i=1;i<=k*2+1;i++)cnt[i]=0; } return 0; }