当前位置:首页 > 编程笔记 > 正文
已解决

A. Directional Increase -前缀和与差分理解 + 思维

来自网友在路上 158858提问 提问时间:2023-10-31 21:16:09阅读次数: 58

最佳答案 问答题库588位专家为你答疑解惑

题面

分析

观察指针移动的性质,可以发现每一段都是从起点走到终点,在原路返回,这样每一段也就表示,在起点处加一,在终点处减一,形成了很明显的差分结构,思考能否构造出a数组的关键就是他的前缀和数组b的b[n]必须等于0,并且每一个 b i b_i bi都不能小于0,因为起点大于0,终点小于0,所有数都应该是大于等于0的,在某一个下标一旦前缀和数组元素等于0,代表开始原路返回,这是走过最长的一段,那么后面所有的前缀和元素都必须是0.

代码

#include <bits/stdc++.h>using namespace std;
using ll = long long;void solve() {int n;cin >> n;vector<ll> a(n + 1);for(int i = 1; i <= n; i ++) {cin >> a[i];a[i] += a[i - 1];}if(a[n] != 0) {cout << "No\n";return ;}int flag = 0;for(int i = 1; i <= n; i ++) {if(a[i] < 0) {flag = 1;break;}}int cnt = 0;for(int i = 1; i <= n; i ++) {if(a[i] == 0) cnt = 1;else {if(cnt == 1) {flag = 1;break;}}}if(flag == 1) cout << "No\n";else cout << "Yes\n";
}int main() {ios::sync_with_stdio(false);cin.tie(nullptr);int T;cin >> T;while(T --) {solve();}
}
查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"A. Directional Increase -前缀和与差分理解 + 思维":http://eshow365.cn/6-29014-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!