zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    el-checkbox
    文件上传优化
    二叉树的建立
    二叉树的遍历算法
    两个二进制数多少个位(bit)不同
    二维矩阵置零
    search-a-2d-matrix(二维矩阵查找)
    Ubuntu16.04安装配置Eclipse 以及opencv的使用
    树莓派 自身摄像头的opencv调用
    树莓派3上安装Qt5
  • 原文地址:https://www.cnblogs.com/la-la-wanf/p/15388752.html
Copyright © 2011-2022 走看看