链接:https://codeforces.com/contest/1244/problem/G
Demonstrative competitions will be held in the run-up to the 20NN20NN Berlatov Olympic Games. Today is the day for the running competition!
Berlatov team consists of 2n2n runners which are placed on two running tracks; nn runners are placed on each track. The runners are numbered from 11 to nn on each track. The runner with number ii runs through the entire track in ii seconds.
The competition is held as follows: first runners on both tracks start running at the same time; when the slower of them arrives at the end of the track, second runners on both tracks start running, and everyone waits until the slower of them finishes running, and so on, until all nnpairs run through the track.
The organizers want the run to be as long as possible, but if it lasts for more than kk seconds, the crowd will get bored. As the coach of the team, you may choose any order in which the runners are arranged on each track (but you can't change the number of runners on each track or swap runners between different tracks).
You have to choose the order of runners on each track so that the duration of the competition is as long as possible, but does not exceed kkseconds.
Formally, you want to find two permutations pp and qq (both consisting of nn elements) such that sum=∑i=1nmax(pi,qi)sum=∑i=1nmax(pi,qi) is maximum possible, but does not exceed kk. If there is no such pair, report about it.
Input
The first line contains two integers nn and kk (1≤n≤106,1≤k≤n21≤n≤106,1≤k≤n2) — the number of runners on each track and the maximum possible duration of the competition, respectively.
Output
If it is impossible to reorder the runners so that the duration of the competition does not exceed kk seconds, print −1−1.
Otherwise, print three lines. The first line should contain one integer sumsum — the maximum possible duration of the competition not exceeding kk. The second line should contain a permutation of nn integers p1,p2,…,pnp1,p2,…,pn (1≤pi≤n1≤pi≤n, all pipi should be pairwise distinct) — the numbers of runners on the first track in the order they participate in the competition. The third line should contain a permutation of nnintegers q1,q2,…,qnq1,q2,…,qn (1≤qi≤n1≤qi≤n, all qiqi should be pairwise distinct) — the numbers of runners on the second track in the order they participate in the competition. The value of sum=∑i=1nmax(pi,qi)sum=∑i=1nmax(pi,qi) should be maximum possible, but should not exceed kk. If there are multiple answers, print any of them.
Examples
input
Copy
5 20
output
Copy
20
1 2 3 4 5
5 2 4 3 1
input
Copy
3 9
output
Copy
8
1 2 3
3 2 1
input
Copy
10 54
output
Copy
-1
Note
In the first example the order of runners on the first track should be [5,3,2,1,4][5,3,2,1,4], and the order of runners on the second track should be [1,4,2,5,3][1,4,2,5,3]. Then the duration of the competition is max(5,1)+max(3,4)+max(2,2)+max(1,5)+max(4,3)=5+4+2+5+4=20max(5,1)+max(3,4)+max(2,2)+max(1,5)+max(4,3)=5+4+2+5+4=20, so it is equal to the maximum allowed duration.
In the first example the order of runners on the first track should be [2,3,1][2,3,1], and the order of runners on the second track should be [2,1,3][2,1,3]. Then the duration of the competition is 88, and it is the maximum possible duration for n=3n=3.
题解
这是一道构造题,求最大状态和最小状态,超出最大状态输出最大状态小于最小状态输出-1,在中间将一定有解,找出那个解就行了
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,m,ans,s,k,a[1000001],b[1000001],f[1000001];
int main()
{
cin>>n>>m;
if(n*(n+1)/2>m)
cout<<-1;
else
{
s=0;
for(long long i=1;i<=n;i++)
{
s+=max(i,n-i+1);
}
if(s<m)
{
cout<<s<<endl;
for(int i=1;i<=n;i++)
cout<<i<<" ";
cout<<endl;
for(int i=n;i>=1;i--)
cout<<i<<" ";
cout<<endl;
}
else
{
cout<<m<<endl;
long long x=m-n*(n+1)/2;
for(int i=1;i<=n;i++)
{
a[i]=i;
b[i]=i;
f[i]=0;
}
long long l=1,r=n;
for(int i=1;i<=n&&x>0;i++)
{
if(x>=a[r]-a[i]&&f[i]==0)
{
x-=a[r]-a[i];
f[i]=1;
swap(a[r],a[i]);
r--;
}
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
cout<<endl;
for(int i=1;i<=n;i++)
cout<<b[i]<<" ";
cout<<endl;
}
}
}