首页 > 其他分享 >E. Permutation by Sum

E. Permutation by Sum

时间:2022-10-25 12:23:38浏览次数:81  
标签:cout int Sum Permutation IOS cin ans 区间

传送门

题意:
给出n, l, r, s, 要求构造一个序列,要求满足l, r区间的和是s, 存在就是输出序列,否则就-1


思路:
首先判断是否-1,很简单,就是一个区间里面的最大值和最小值,s必须在这其中,然后就是如果在这其中如何去构造,刚开始想的是没什么思路,但后面看了别人的,才悟了,就是可以先填最小的,然后不够从后往前加,因为最后肯定能够保证填满足条件,因为每次加的是1


总结:
构造一段区间,区间里面的数都不相等,然后和为s, 先排最小的,然后不断的从后往前添加,保证不重复了就

点击查看代码
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);
#define endl '\n'
using namespace std;
 
typedef long long ll;
 
int T, n, l, r, s;
 
int main()
{
    IOS; cin.tie(0), cout.tie(0);
    cin >> T;
    while (T--)
    {
        cin >> n >> l >> r >> s;
        int mn = (1 + r - l + 1) * (r - l + 1) / 2;
        int mx = (n - (r - l + 1) + 1 + n) * (r - l + 1) / 2;
        if (mn > s || s > mx)
        {
            cout << "-1" << endl;
            continue;
        }
        int left = s - mn, count = left / (r - l + 1), cha = left - count * (r - l + 1);
        vector<int> ans, other;
        for (int i = 1; i <= r - l + 1; ++i)
            ans.push_back(i + count);
        for (int i = ans.size() - 1; i >= ans.size() - 1 - cha + 1; --i)
            ++ans[i];
        set<int> st;    
        for (int i = 0; i < ans.size(); ++i)
            st.insert(ans[i]);
        for (int i = 1; i <= n; ++i)
            if (!st.count(i))
                other.push_back(i);
        int pos = 0;        
        for (int i = 1; i < l; ++i)
            cout << other[pos++] << " ";
        for (int i = 0; i < ans.size(); ++i)
            cout << ans[i] << " ";            
        for (int i = r + 1; i <= n; ++i)
            cout << other[pos++] << " ";    
        cout << endl;        
    }
    return 0;
}
/*
1
3 1 2 4
*/

标签:cout,int,Sum,Permutation,IOS,cin,ans,区间
From: https://www.cnblogs.com/jumo-xiao/p/16824440.html

相关文章

  • Sum of Matchings (图论,求所有区间贡献问题,)
    题意: 思路:是图论,看给出的信息能不能构成一些特殊的图本题就是不相交的环,每次拆分可以变成不相交的环+链环的匹配就是点数/2,链也是点数/2(向下取整) ......
  • HDU 3349 Consumer
    ​​题目链接​​题目背景有依赖的背包,下面用我常用的变量和说法。题目大意有个主件和块钱,每个主件都有费用和对应的个附件,附件也有费用与价值,购买主件后才能购买附件,问怎......
  • LOJ #6220. sum
    题目链接:​​传送门​​官方题解:有一个结论:必有连续的一串数和为n的倍数证明:先求个前缀和若这个前缀和中有的倍数,则这个前缀即为答案若这个前缀和中没有的倍数,即模余~......
  • C2. Make Nonzero Sum (hard version)
    C2.MakeNonzeroSum(hardversion)timelimitpertest2secondsmemorylimitpertest256megabytesinputstandardinputoutputstandardoutputThisi......
  • CF 286A(Lucky Permutation-数列找规律)
    A.LuckyPermutationtimelimitpertestmemorylimitpertestinputoutputp......
  • C1. Make Nonzero Sum (easy version)
    C1.MakeNonzeroSum(easyversion)Thisistheeasyversionoftheproblem.Thedifferenceisthatinthisversionthearraycannotcontainzeros.Youcanma......
  • 4.5 Kafka Consumer API之多线程并发处理
    1.Consumer一对一消费Partition(1).简介这种类型是经典模式,每一个线程单独创建一个KafkaConsumer消费一个partition,用于保证线程安全。(2).代码示例publicclassKafkaCon......
  • Kafka Consumer指定时间戳位置消费消息
    KafkaConsumer指定时间戳位置消费消息若用户不想从最旧的或最早的offset位置开始消费,想指定某个时间戳位置开始消费,是否可行呢?答案:可行的用户给定时间戳,kafkaserve......
  • POJ 1825/2279(Young/Mr. Young's Picture Permutations-杨氏矩阵和钩子公式)
    给出一个n行的矩阵,每一行有a[i]个数,总共有sum个数,要求每一个位置的数必须比上面的数和左面的数大,求总方案数.杨氏矩阵又叫杨氏图表,它是这样一个矩阵,满足条件:(1)如果格子......
  • CF 1677D(Tokitsukaze and Permutations-冒泡排序)
    已知长度为n的排列,经过k次冒泡(每次把最大的数交换到最后)后,得到的新序列为.现在已知的某些地方的值,不知道的记,求合法原排列数。考虑和排列达成双射关系。且1次冒泡会导致......