Codeforces Round #741 (Div. 2), problem: (D1) Two Hundred Twenty One (easy version), 1700
Problem - D1 - Codeforces
题意:
给n个符号(+或-), +代表+1, -代表-1, 求最少删去几个点, 使得
题解(仅此个人理解):
1. 这题打眼一看, 肯定和奇偶有关系, 奇数为+, 偶数为-, 但是删去点这一操作是动态的, 删去某点后, 后面的点的正负随之颠倒, 即奇数位+变偶数位-, 偶数位-变奇数位+, 恰好可以利用该特质
也就是说可以这样理解: 找到一个位置,删去该点并使得后面的点正负颠倒, 最后满足条件.
2. 对于奇数个数, 必须变成偶数个个数才可能满足条件, 它一定存在个地方, 删去该点并且后面的点正负颠倒后满足条件, 结果为1
3. 对于偶数个数, 如果已经满足条件, 则输出0,
否,则先变成奇数个数再操作(和上面一样), 结果为2
AC代码
#include<iostream> #include<string> #include <cmath> #include <algorithm> using namespace std; const int N = 3e5+10; int num[N]; void solve() { int n, q; string s; cin >> n >> q >>s; for(int i = 0; i <= n; i ++) // num[i+1] = num[i] + ((i&1)?-1:1) * ((s[i]=='+')?1:-1); if(i%2==0&&s[i]=='+' || i%2==1&& s[i]=='-')num[i+1]=num[i]+1; else num[i+1] = num[i]-1; while(q --) { int l, r; cin >> l >> r; if((r-l+1)&1) { puts("1"); continue; } if((num[r]-num[l-1])==0)puts("0"); else puts("2"); } return; } int main() { int t; cin >> t; while(t --) solve(); return 0; }