*[topcoder]LittleElephantAndIntervalsDiv1

http://community.topcoder.com/stat?c=problem_statement&pm=12822&rd=15707

第一次用C++提交,艰辛。
首先想到可以从尾往前扫,只有最后覆盖的颜色才有效;
然后是想到用线段来做,用map记录线段;
然后学到了lower_bound是找到元素插入的位置,返回的*it>=该元素,也可能是end。cp博士一般得到lower后处理边界,同时用+-来做。
但这里用map不好,因为先前一道题是不用merge。这里如果要merge,可能一个很大的线段要连续merge很多小线段。
然后看了题解发现根本不用线段,每个小球就用一个A[i]表示,然后用朴素的线段表示染色就行了。
最后用1LL<<count来做pow。

#include <set>

#include <vector>

using namespace std;

class LittleElephantAndIntervalsDiv1

{

public:

    long long getNumber(int M, vector <int> L, vector <int> R);

};



long long LittleElephantAndIntervalsDiv1::getNumber(int M, vector <int> L, vector <int> R)

{

    vector<int> color(M+1, -1);

    for (int i = 0; i < L.size(); i++)

    {

        for (int j = L[i]; j <= R[i]; j++)

        {

            color[j] = i;

        }

    }

    set<int> result;

    for (int i = 1; i <= M; i++)

    {

        if (color[i] != -1)

        {

            result.insert(color[i]);

        }

    }

    return 1LL << result.size();

}

原来DIV 1的250题也是挺值得做的。

你可能感兴趣的:(topcoder)