$CF1141C Polycarp Restores Permutation$
\(problem\)
这题的大致意思就是已知数值差值 求1-n的排列
如果能构成排列 则输出这个排列。如果不能则输出-1
排列的值都是 大于1 而小于n的 而且没有相同的数字。
这题最关键的是 怎么输出这个序列 有的是存在负数的。
那么 考虑一下排列都是从1到n的对不对。
取序列的最小值 然后用\(1 - Min\)即是整个序列应该加上的数值。
首先考虑判重。 用数组 或者用\(Map\) \(or\) \(Set\) 。
都是不错的方法。
#include <bits/stdc++.h>
using namespace std;
typedef long long LL ;
inline LL In() { LL res(0),f(1); register char c ;
while(isspace(c=getchar())) ; c == '-'? f = -1 , c = getchar() : f = 1 ;
while(res = (res << 1) + (res << 3) + (c & 15) , isdigit(c=getchar())) ; return res * f ;
}
int n ;
int p[200000+5] ;
int res[200000+5] ;
set<int> s;//判重
signed main(){
n = In() ;
for(register int i=1;i<=n-1;i++) p[i] = In() ;
res[1] = 0 ;
for(register int i=2;i<=n;i++) res[i] = res[i-1] + p[i-1] ;//计算前缀和
int Min = 0x7f7f7f7f;
for(register int i=1;i<=n;i++){
Min = min(res[i],Min);
if(s.count(res[i])==0) s.insert(res[i]) ;//插入数值
else {
cout << -1 << endl ;//如果存在重复的数值则不可能构成排列。
return 0 ;
}
}
//cout << Min << endl ;
int c = 1 - Min ;
bool f = false;
for(register int i=1;i<=n;i++) {
if(res[i] + c > n) {//如果大于n则不能构成 也是输出-1
cout << -1 << endl ;
return 0 ;
}
}
for(register int i=1;i<=n;i++) {
cout << res[i] + c << ' ' ;
}
return 0 ;
}
随机推荐
- 每日命令:(2)cd
Linux cd 命令可以说是Linux中最基本的命令语句,其他的命令语句要进行操作,都是建立在使用 cd 命令上的. 所以,学习Linux 常用命令,首先就要学好 cd 命令的使用方法技巧. 1. ...
- 类与类之间的关系UML模型图
关联.依赖.聚合.组合.泛化.实现 类之间可能存在以下几种关系:关联(association).依赖(dependency).聚合(Aggregation,也有的称聚集).组合(Composition ...
- flask——CSRFToken保护
根据 csrf_token 校验原理,具体操作步骤有以下几步: 1.后端生成 csrf_token 的值,在前端请求登录或者注册界面的时候将值传给前端,传给前端的方式可能有以下两种: 在模板中的 Fr ...
- mysql根据用户的邀请码查询该用户所有的上级
SELECT T1.lvl AS 'level', T2.id AS 'id', T2.zid AS 'zid', T2.self_invite AS 'selfInvite', T2.invite_ ...
- java 使用OpenOffice文件实现预览
1.安装OpenOffice软件 安装教程:https://jingyan.baidu.com/article/c275f6ba12c07ce33d756732.html 2.安装完成后,创建项目,p ...
- Java中list集合ArrayList 中contains包含的使用
Java中list集合ArrayList 中contains包含的使用 https://blog.csdn.net/qq_38556611/article/details/78774690
- [luoguP3052] [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper(DP)
传送门 输出被阉割了. 只输出最少分的组数即可. f 数组为结构体 f[S].cnt 表示集合 S 最少的分组数 f[S].v 表示集合 S 最少分组数下当前组所用的最少容量 f[S] = min(f ...
- FZU 2109 Mountain Number
http://acm.fzu.edu.cn/problem.php?pid=2109 题意:找出区间[l,r]内满足奇数位的数字大于相邻偶数位数字的个数. 典型的数位dp了,记录一下当前位是奇数位还是 ...
- 常州模拟赛d8t2 绘画
分析:考虑记录每个坐标上每个颜色出现了几次,并由此算出每个颜色在这个坐标上的贡献.答案肯定是原图的答案扣去矩形的答案,再加上那个矩形同种颜色的贡献,这里的答案指的是Σdis.我们先要记录每个颜色在各个 ...
- JS动态添加div,然后在div中添加元素
需求: 组织部中有个这样的需求,根据年份动态显示该年份下的定性指标! 我的做法: 先是放一个空的div,让后根据指标的数据,动态的往div中添加元素. 代码: 空的div,存放定性指标 <div ...