题意:
你要构造一个大小为n的排列,每次选择两个点i,j满足要求:a[j]=i,然后交换这两个位置,同时你得到
(
j
−
i
)
2
(j-i)^2
(j−i)2的值。问你能得到的最大值是多少,输出排列和交换顺序。
题解:
一开始以为是每个都和n交换一遍,wa了之后模4的样例的时候发现前半部分和n交换,后半部分和1交换才是最大的。直接模拟一遍这个过程然后倒序输出即可。
#include<bits/stdc++.h>
using namespace std;
#define pa pair<int,int>
#define ll long long
const int N=1e5+5;
stack<pa>st;
int a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)a[i]=i;
ll ans=0;
for(int i=1;i<=n/2;i++)
swap(a[i],a[n]),st.push({i,n}),ans+=1ll*(n-i)*(n-i);
for(int i=n/2+1;i<n;i++)
swap(a[1],a[i]),st.push({i,1}),ans+=1ll*(i-1)*(i-1);
printf("%lld\n",ans);
for(int i=1;i<=n;i++)
printf("%d%c",a[i]," \n"[i==n]);
printf("%d\n",(int)st.size());
while(!st.empty())
printf("%d %d\n",st.top().first,st.top().second),st.pop();
}
return 0;
}