100分解法

比较基础的一个差分题。可以选择离散化m个区间去差分,时间复杂度o(mlogm),空间复杂度o(m)。当然,由于本题n较小,也可以不进行差分,时间复杂度o(n),空间复杂度o(n)。
讲一下具体的思路。首先如果我们每棵树都没有浇水的话,m天后每棵树高度都为m。如果m是奇数的话,我们找到浇水次数为偶数的树的个数即可,反之找到浇水次数奇数的树个数即可,统计这一件事就需要用到差分。对于每个区间,我们可以在l[i]打上一个+1的标志,在r[i]打上一个-1的标志,然后用sum一边遍历数组一边记录数组的前缀和,在某一棵树的位置sum的值就是这棵树浇水的次数,统计一下其中奇数偶数的个数即可。下面给出不离散化的代码:

int a[20000005];
class Solution {
public:
    /**
     * 返回m天后高度为奇数的树的数量
     * @param n int整型 
     * @param m int整型 
     * @param l int整型vector 
     * @param r int整型vector 
     * @return int整型
     */
    int oddnumber(int n, int m, vector<int>& l, vector<int>& r) {
        // write code here
        for(int i=0;i<m;i++)a[l[i]]++,a[r[i]+1]--;
        int ans=0,sum=0;
        for(int i=1;i<=n;i++)
        {
            sum+=a[i];
            if(sum%2)ans++;
        }
        if(m%2)return n-ans;
        return ans;
    }
};