[Codeforces Round #713 (Div. 3)] Permutation by Sum(求和技巧,set容器使用)题解

导读:本篇文章讲解 [Codeforces Round #713 (Div. 3)] Permutation by Sum(求和技巧,set容器使用)题解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

E. Permutation by Sum

time limit per test

2 seconds

memory limit per test

256 megabytes

问题描述

A permutation is a sequence of n integers from 1 to n, in which all the numbers occur exactly once. For example, [1], [3,5,2,1,4], [1,3,2] are permutations, and [2,3,2], [4,3,1], [0] are not. Polycarp was given four integers n , l, r (1≤l≤r≤n) and s (1≤s≤n(n+1)2) and asked to find a permutation p of numbers from 1 to n that satisfies the following condition:

  • s=pl+pl+1+…+pr

For example, for n=5, l=3, r=5, and s=8, the following permutations are suitable (not all options are listed):

  • p=[3,4,5,2,1]
  • p=[5,2,4,3,1]
  • p=[5,2,1,3,4]

But, for example, there is no permutation suitable for the condition above for n=4, l=1, r=1, and s=5. Help Polycarp, for the given n, l, r, and s, find a permutation of numbers from 1 to n that fits the condition above. If there are several suitable permutations, print any of them.

Input

The first line contains a single integer t(1≤t≤500). Then t test cases follow. Each test case consist of one line with four integers n(1≤n≤500), l (1≤l≤n), r (l≤r≤n), s (1≤s≤n(n+1)2). It is guaranteed that the sum of n for all input data sets does not exceed 500.

Output

For each test case, output on a separate line:

  • n integers — a permutation of length n that fits the condition above if such a permutation exists;
  • -1, otherwise.

If there are several suitable permutations, print any of them.

Example

Input

5
5 2 3 5
5 3 4 1
3 1 2 4
2 2 2 2
2 1 1 3

Output

1 2 3 4 5 
-1
1 3 2 
1 2 
-1

题意

输入n,l,r,s。

n代表有一组从1~n的数组(下标从1开始)。

要求:找到一种数组的排列,其中,数组中下标从l到r的所有数之和为s。

如果能找到,输出该排列;不然输出-1。

思路

找到一组总和为s的序列。

利用set记录序列,和k变量配合使得输出不重不漏。

重点

找序列和输出数组都很细节。

但找序列很关键。

            vector<int> a;
            //细节一:逆向预处理基础序列
            for(int i=len;i>=1;i--)
                a.push_back(i),s-=i;
            //细节二:n-i决定了第i个数的最大值
            for(int i=0;i<len;i++)
            {
                if(n-i-a[i]<s)
                {
                    s-=n-i-a[i];
                    a[i]=n-i;
                }
                else
                {
                    a[i]+=s;
                    s=0;
                    break;
                }
            }

输出时,k变量很细节。

AC代码

#include<set>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int n,l,r,s;
        cin>>n>>l>>r>>s;
        int len=r-l+1;
        int minn=0,maxn=0;
        for(int i=1;i<=len;i++)
        minn+=i;
        for(int i=n;i>n-len;i--)
        maxn+=i;

        //判断s是否能处理?
        //不能的话,直接输出-1;
        if(s>=minn&&s<=maxn)
        {
            //求得总和等于s的序列
            vector<int> a;
            for(int i=len;i>=1;i--)
                a.push_back(i),s-=i;
            for(int i=0;i<len;i++)
            {
                if(n-i-a[i]<s)
                {
                    s-=n-i-a[i];
                    a[i]=n-i;
                }
                else
                {
                    a[i]+=s;
                    s=0;
                    break;
                }
            }


            //输出序列。
            set<int> se;
            for(int i=0;i<len;i++)
                se.insert(a[i]);
            int k=1;
            for(int i=1;i<l;)
            {
                if(se.find(k)==se.end())
                {
                    cout<<k<<" ";i++;
                }
                k++;
            }
            for(int i=l;i<=r;i++)
            {
                cout<<a[i-l]<<" ";
            }     
            for(int i=r+1;i<=n;)
            {
                if(se.find(k)==se.end())
                {
                    cout<<k<<" ";i++;
                }
                k++;
            }


        }
        else
        {
            cout<<-1;
        }
        cout<<endl;
    }
    return 0;
}

 

 

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/103319.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!