cf 1512 E. Permutation by Sum

题意:

我们定义排列的概念为:从1到n的整数组成的序列,每个数字只出现一次
现在给你n,l,r,s,让你构造一个长度为n的排列,使得其中的第l到第r项和为s
输出任意答案

题解:

又是构造题,构造题考察经验思维
我们想想区间[l,r]的和为s
区间长度为len = r - l+1
区间长度为len的能组成的最小和min就是1+…+len
最大和就是n+n-1…n-lenn+1
如果s不在这个范围内,说明s无法构造,输出-1
如果s可以构造说明最小和+?就是s
这个?怎么求
ave = (s-min)/len:区间内每个数比最小值平均大Ave
那么我们这个区间至少应该是i+ave(1<=i<=len)
这样构造的区间一定小于等于s(我们去差为cha),且区间为从小到大顺序排列
如果小于s(cha>0),我们就让最后一位+1,cha–,如果cha还大于0,我们就让倒数第二位+1,cha–,从后往前一次增加
为什么这样?
为什么要+1呢?因为每位这个区间是最接近s的连续区间,所以从这个开始枚举所需要的可能性最少
为什么要倒着循环+1呢?因为这个循环肯定是不可能全部进行完的(因为我们已经求的原本的区间是最接近s的),所以在某个时刻cha会等于0,循环中断,如果我们正着循环,在第i个数加完后中断,第i个数就等于第i+1个数(因为原本序列是顺序排列的,而i加了1,第i+1位没变),会出现重复数,但是如果倒着循环就不会存在,因为后一位始终大于前一位
详细看代码

代码:

#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <stack>
#include <queue>
#include <cmath>
#include <map>
#include <set>
#define G 10.0
#define LNF 1e18
#define eps 1e-6
#define ll long long
#define INF 0x7FFFFFFF
#define PI acos(-1.0)
#define pb(x) push_back(x)
#define SP system("pause")
#define mm(a, b) memset(a, b, sizeof(a))
#define fir(i, a, n) for (ll i = a; i <= n; i++)
#define rif(i, a, n) for (ll i = a; i >= n; i--)
#define each_cass(cass) for (cin >> cass; cass; cass--)using namespace std;
void solve()
{ll n, l, r, s;cin >> n >> l >> r >> s;ll Min = (1 + r - l + 1) * (r - l + 1) / 2;ll Max = (n + n - r + l) * (r - l + 1) / 2;if (s > Max || s < Min){cout << "-1" << endl;return;}int cha = s - Min;vector<int> zhong;vector<int> qian;vector<int> hou;int pingduo = cha / (r - l + 1);//代表[1~(r-l+r)]每个数至少要加的数int len = r - l + 1;for (int i = 1; i <= len; i++)zhong.push_back(i+pingduo),cha-=pingduo;if (cha)//如果cha不为0,就最大的几个数+1直到cha=0{for (int i = zhong.size() - 1; cha && i >= 0; i--){zhong[i]++;cha--;}}int vis[10000] = {0};//记录,防止重复for (int i = 0; i < zhong.size(); i++)vis[zhong[i]] = 1;for (int i = 1; i <= n; i++){if (qian.size() == l - 1)//前面的数是(l-1)个break;if (!vis[i])qian.push_back(i), vis[i] = 1;}for (int i = 1; i <= n; i++){if (hou.size() == n - r)//后面的数是(n-r)个break;if (!vis[i])hou.push_back(i), vis[i] = 1;}//输出for (int i = 0; i < qian.size(); i++)cout << qian[i] << " ";for (int i = 0; i < zhong.size(); i++)cout << zhong[i] << " ";for (int i = 0; i < hou.size(); i++)cout << hou[i] << " ";cout << endl;
}
int main()
{int cass;each_cass(cass){solve();}return 0;
}

cf 1512 E. Permutation by Sum相关推荐

  1. CF#303A Lucky Permutation Triple 数论

    题意:要求给出一个数N的余数系的三个排列A, B, C,其中使得对于任意的 i 满足(A[i] + B[i]) % N = C[i]. 例如N=5的时候有一下排列: A: 1 4 3 2 0 B: 1 ...

  2. CF Round #713 (Div. 3)

    目录 A. Spy Detected! B. Almost Rectangle C.A-B Palindrome D.Corrupted Array E.Permutation by Sum F.Ed ...

  3. Codeforces Round#713 A-E题解

    Codeforces Round 713 经典暴力模拟掉分场 本场链接: https://codeforces.com/contest/1512 个人博客の极致色彩简洁版题解: http://www. ...

  4. Codeforces Round #640 (Div. 4)(ABCDEG题解)

    文章目录 A. Sum of Round Numbers B - Same Parity Summands C - K-th Not Divisible by n D - Alice, Bob and ...

  5. Codeforces Round #713 (Div. 3)

    C. A-B Palindrome time limit per test2 seconds memory limit per test256 megabytes inputstandard inpu ...

  6. 傅里叶变换 直观_A / B测试的直观模拟

    傅里叶变换 直观 Many of us have heard, read, or even performed an A/B Test before, which means we have cond ...

  7. 【算法】【网络流24题】巨坑待填(成功TJ,有时间再填)

    ------------------------------------------------------------------------------------ 17/24 --------- ...

  8. 仿真文件的写法(以四位全加器为例)

    --2020/5/1更:新的补充文章,可以相互印证十进制转5421BCD(测试文件及modelsim.do文件的模板)--补充篇 刚刚开始接触FPGA,网上很多Verilog的源代码,但是有关仿真文件 ...

  9. 【洛谷 P6151 [集训队作业2019] 青春猪头少年不会梦到兔女郎学姐】【容斥原理+生成函数】

    题意 定义一个序列的权值为:把序列首尾相接成一个环,环上每段数字长度的乘积.有nnn种数字,求所有满足第iii种数字恰好出现aia_iai​次的排列的权值之和. n,∑ai≤2∗105n,\sum a ...

最新文章

  1. 继承的综合运用《Point类派生出Circle类而且进行各种操作》
  2. Javascript中call的使用
  3. “入乡随俗,服务为主” 发明者量化兼容麦语言啦!
  4. 《白日梦想家》观后感
  5. 利用用户级线程提高多线程应用的性能
  6. Python自动化之socket初识
  7. androidstudio调用系统相机为什么resultcode一直返回0_机器视觉系统原理及学习策略...
  8. 小米路由pro php,小米路由器开启frp
  9. linux串口蜂鸣器报警电路,蜂鸣器报警电路图(简单介绍两种!)
  10. 极品PS动作繁星散射GIF动画
  11. Activity七大生命周期详解
  12. 打印如下的图形:平行四边形
  13. 难得的巧记十二个月的单词
  14. JAYのpython学习笔记——数据结构之列表
  15. 关于程序员日常接单之淘宝运营
  16. 加密算法之SHA(SHA1、SHA256)
  17. try的动词用法_有关try的常用短语和用法
  18. 通过 IDEA 检查代码 Inspect Code,查找无用的方法、类等问题
  19. 重置找不到计算机,重置Win10电脑时提示找不到恢复环境的解决教程
  20. 阅读 Android源码的一些姿势

热门文章

  1. 看到这一幕,我甚至都想戒烟了。。 | 今日最佳
  2. 近期GitHub上最热门的开源项目(附链接)
  3. 修改mongodb最大查询数_WebFlux系列(十二)MongoDB应用,新增、修改、查询、删除
  4. python distplot 图_Python可视化23 |seaborn.distplot公司单变量分布图(直方图|核密度图),23seaborndistplot...
  5. dataframe 修改某列_python dataframe操作大全数据预处理过程(dataframe、md5)
  6. html设置样式不继承_web前端入门到实战:css的核心原理分为优先级原则与继承原则两大部分...
  7. robcad和catia是什么关系_proe/CATIA/UG/SolidWorks软件区别与联系
  8. python 中文编码差异_Python 编码为什么那么蛋疼?
  9. typora公式zuo对齐_Markdown编辑神器-Typora
  10. 机器学习——决策树学习