楼主: 
oin1104 (是oin的说)   
2024-11-17 12:34:32大概两千名
不上不下
姆咪
第一题
给一个阵列
从0的地方开始往左或右走
碰到1 就把那个地方-1
然后回头走
看不能能把1走完
思路
反正看两边墙壁有没有一样多就可以知道了
如果其中一边多一个
那就是只能先往那边走
```cpp
class Solution {
public:
    int countValidSelections(vector<int>& nums)
    {
        int cnt = 0;
        for(int i : nums)cnt += i;
        int  n = nums.size();
        int res = 0;
        vector<int> paper(n,0);
        paper[0] = nums[0];
        for(int i = 1 ;i < n ; i ++)
        {
            paper[i] = nums[i] + paper[i-1];
            // cout << paper[i] << " ";
        }
        for(int i = 0 ; i < n ; i ++)
        {
            if(nums[i] == 0)
            {
                int k = paper[i]*2;
                if( paper[i]*2 == paper[n-1])
                {
                    res += 2;
                }
                else if( abs(paper[i]*2 - paper[n-1]) <= 1 )
                {
                    res++;
                }
            }
        }
        return res;
    }
};
```
第二题
给个阵列nums 跟一些queries
queries[i]里面代表可以操作的区间
在那些区间里面 可以把nums-1
看能不能把nums全部都变成0
思路
用前缀和纪录区间的值
然后检查
这是O n
```cpp
class Solution {
public:
    bool isZeroArray(vector<int>& nums, vector<vector<int>>& queries)
    {
        int qn = queries.size();
        int n = nums.size();
        vector<int> pre(n,0);
        for(int i = 0 ; i < qn ; i ++)
        {
            pre[queries[i][0]]