*[topcoder]LittleElephant AndIntervalsDiv 1
1327 ワード
http://community.topcoder.com/stat?c=problem_statement&pm=12822&rd=15707
初めてC++で提出しました.大変でした.まず、後ろから前に掃くことができると思います.最後のカバーの色だけ有効です.それから線分で作りたいです.mapで線分を記録します.そして勉強になりました.boundは要素が挿入されている位置を探して、**it==この要素を返します.endかもしれません.cp博士は普通パワーを得て境界を処理します.同時に+-を使います.ここはmapを使うのがよくないです.前の問題はmergeを使わないからです.ここでmergeを作るなら、大きな線分が連続してmergeの多い線分になるかもしれません.そして、問題解を見て、線分は全く使わないことに気づきました.小さいボールは一つのA[i]で表して、シンプルな線分で染色すればいいです.最後に1 LL<countでpowを作ります.
初めてC++で提出しました.大変でした.まず、後ろから前に掃くことができると思います.最後のカバーの色だけ有効です.それから線分で作りたいです.mapで線分を記録します.そして勉強になりました.boundは要素が挿入されている位置を探して、**it==この要素を返します.endかもしれません.cp博士は普通パワーを得て境界を処理します.同時に+-を使います.ここはmapを使うのがよくないです.前の問題はmergeを使わないからです.ここでmergeを作るなら、大きな線分が連続してmergeの多い線分になるかもしれません.そして、問題解を見て、線分は全く使わないことに気づきました.小さいボールは一つのA[i]で表して、シンプルな線分で染色すればいいです.最後に1 LL<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題もやりがいがあります.