CF1141C Polycarp Restores Permutation 题解

Content

给定一个长度为 \(n-1\) 的序列 \(q\),问你是否能找到一个 \(1\sim n\) 的排列 \(p\),使得 \(\forall i\in[1,n)\)\(q_i=p_{i+1}-p_i\)

数据范围:\(2\leqslant n\leqslant 2\times 10^5\)\(-n<q_i<n\)

Solution

首先我们不难知道,设 \(S_i=\sum\limits_{j=1}^i q_j\),那我们不难知道,\(S_i\) 越小,第 \(i+1\) 个数就越小。因此我们考虑前缀和处理下,找到能使得 \(S_i\) 最小的 \(i\),然后不难发现 \(p_{i+1}=1\),再从 \(p_{i+1}\) 开始暴力往前往后直接推出原来的数列,最后再判断 \(1\sim n\) 是否在这个数列中都恰好出现过一次即可。

Code

int n, cha[200007], a[200007], sum, ans, id1 = 1;
map<int, int> vis;

int main() {
    n = Rint;
	F(i, 1, n - 1) {
		cha[i] = Rint, sum += cha[i];
		if(sum < ans) ans = sum, id1 = i + 1;
	}
	a[id1] = 1;
	R(i, id1 - 1, 1) a[i] = a[i + 1] - cha[i];
	F(i, id1 + 1, n) a[i] = a[i - 1] + cha[i - 1];
	F(i, 1, n) {
		if(vis[a[i]]) return printf("-1"), 0;
		vis[a[i]] = 1;
	}
	F(i, 1, n) if(!vis[i]) return printf("-1"), 0;
	F(i, 1, n) write(a[i]), putchar(i == n ? '\n' : ' ');
    return 0;
}
posted @ 2021-12-16 11:30  Eason_AC  阅读(35)  评论(0)    收藏  举报