G. Running in Pairs

194 篇文章 1 订阅
5 篇文章 0 订阅

链接: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;
		}
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值