[CF1092D1] Great Vova Wall - 栈,贪心
Description
给定一个序列 \(a=\{a_1,a_2,\dots,a_n\}\),有以下两种操作:若 \(a_i=a_{i+1}\),则可将 \(a_i\) 与 \(a_{i+1}\) 同时加 \(1\);将 \(a_i\) 加 \(2\)。求问是否可经过多此操作后使得所有 \(a_i\) 相等。
Solution
相当于按奇偶性做匹配,不难想到用栈维护,碰到奇偶性相同的就消去,如果最后栈内剩余元素数量不超过 1 则 YES
#include <bits/stdc++.h>
using namespace std;
#define int long long
signed main()
{
ios::sync_with_stdio(false);
int n;
cin >> n;
vector<int> a(n + 2);
for (int i = 1; i <= n; i++)
cin >> a[i];
vector<int> s(n + 2);
int top = 0;
for (int i = 1; i <= n; i++)
{
s[++top] = a[i] & 1;
if (top > 1 && s[top] == s[top - 1])
top -= 2;
}
cout << (top <= 1 ? "YES" : "NO") << endl;
}