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;
}

 

posted @ 2021-10-10 10:25  la-la-wanf  阅读(27)  评论(0编辑  收藏  举报