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题也是挺值得做的。