Codeforces Round #636 (Div. 3).D题
#include <bits/stdc++.h>
#define INT 0x7fffffff
#define cind(x) scanf("%d",&x)
#define cinc(x) scanf("%c",&x);while(ch==' '||ch=='\n')scanf("%c",&x);
#define kt int t;scanf("%d",&t);while(t--)
#define mem0(x) memset(x,0,sizeof(x));
#define ll long long int
#define mem(x,y) memset(x,y,sizeof(x));
#define scanf scanf_s
const int maxn = 4e5 + 10;
int a[1000005];
using namespace std;
int s, n, m;
#define ls id<<1
#define rs id<<1|1
struct tree
{
int l, r, sum;
int tag;
}t[maxn * 4];
void pushdown(int id)
{
t[ls].sum += (t[ls].r - t[ls].r + 1) * t[id].tag;
t[rs].sum += (t[rs].r - t[rs].r + 1) * t[id].tag;
t[ls].tag += t[id].tag;
t[rs].tag += t[id].tag;
t[id].tag = 0;
}
void build(int id, int l, int r)
{
t[id].l = l, t[id].r = r, t[id].tag = 0;
if (l == r)
{
t[id].sum = 0;
return;
}
int mid = (l + r) / 2;
build(ls, l, mid);
build(rs, mid + 1, r);
t[id].sum = t[ls].sum + t[rs].sum;
}
void change(int id, int l, int r, int p)
{
if (l <= t[id].l && r >= t[id].r)
{
t[id].sum += (t[id].r - t[id].l + 1) * p;
t[id].tag += p;
return;
}
if (t[id].tag) pushdown(id);
int mid = (t[id].l + t[id].r) / 2;
if (l <= mid) change(ls, l, r, p);
if (r > mid) change(rs, l, r, p);
t[id].sum = t[ls].sum + t[rs].sum;
}
int query(int id, int l, int r)
{
int res = 0;
if (l <= t[id].l && r >= t[id].r)
return t[id].sum;
if (t[id].tag) pushdown(id);
int mid = (t[id].l + t[id].r) / 2;
if (l <= mid) res += query(ls, l, r);
if (r > mid) res += query(rs, l, r);
return res;
}
int main()
{
int i, j,k;
int t;
cin >> t;
while (t--)
{
cin >> n >> k;
for (i = 1; i <= n; i++)
{
cin >> a[i];
}
build(1, 1, 2*k);
map<int, int>mp;
for (i = 1; i <= n/2; i++)
{
int st = min(a[i], a[n + 1 - i]) + 1;
int ed = max(a[i], a[n + 1 - i]) + k;
change(1, st, ed, 1);
mp[a[i] + a[n + 1 - i]]++;
}
int ans = 0;
for (i = 1; i <= k * 2; i++)
{
ans = max(ans, query(1, i, i) + mp[i]);
}
cout << n - ans << endl;
}
}