题意:
有两个1-n的排列,现在要让你重排这两个排列,使得
题解:
第一个顺序排列,第二个也先顺序排列,然后值从大到小,位置从小到大依次交换,如果超过k了就找到可以的位置,结束。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+5;
ll a[N];
int main()
{
ll n,sta,k;
scanf("%lld%lld",&n,&sta);
k=sta;
ll sum=(1ll+n)*n/2;
if(sum>k)
return 0*printf("-1\n");
k-=sum;
for(int i=1;i<=n;i++)a[i]=i;
ll now=n;
for(ll i=1;i<=n/2;i++){
if(now-i>k){
swap(a[now],a[now-k]);
k=0;
break;
}
swap(a[now],a[i]);
k-=now-i;
now--;
}
printf("%lld\n",sta-k);
for(int i=1;i<=n;i++)printf("%d%c",i," \n"[i==n]);
for(int i=1;i<=n;i++)printf("%lld%c",a[i]," \n"[i==n]);
return 0;
}