POJ 2528 Mayor's posters 线段树
2013-06-09 17:59
453 查看
/** * @file main.cpp * @brief 离散化+线段树 * 1.离散化,源数据的范围是1-10000000,直接使用线段树求解会超内存,也不优雅 * 数据个数只有10000,离散化后只有20000个点 * 2.线段树求解,我感觉的线段树的精髓在于插入/染色的时候把父节点的值传递给子节点这个操作,在代码中已经特别注释出来 * * @author yekeren * @version 1.0.0 * @date 2013-06-09 */ #include <stdio.h> #include <set> #include <map> #include <vector> #define LEFT(x) (((x) << 1) + 1) #define RIGHT(x) (((x) << 1) + 2) unsigned short k[100000] = { 0 }; std::set<unsigned short> counter; /** * @brief 线段树插入操作 * @param root * @param left * @param right * @param a * @param b * @param c */ void insert(int root, int left, int right, int a, int b, int c) { if (a <= left && b >= right) { k[root] = c; return; } if (k[root]) ///<精髓 { k[LEFT(root)] = k[root]; k[RIGHT(root)] = k[root]; k[root] = 0; } int mid = (left + right) >> 1; if (b <= mid) { insert(LEFT(root), left, mid, a, b, c); } else if (a > mid) { insert(RIGHT(root), mid + 1, right, a, b, c); } else { insert(LEFT(root), left, mid, a, mid, c); insert(RIGHT(root), mid + 1, right, mid + 1, b, c); } } /** * @brief 求最终覆盖结果 * @param root * @param left * @param right */ void sum(int root, int left, int right) { if (k[root]) { counter.insert(k[root]); return; } if (left == right) { return; } int mid = (left + right) >> 1; sum(LEFT(root), left, mid); sum(RIGHT(root), mid + 1, right); } int main(int argc, char *argv[]) { int c, n; scanf("%d", &c); while (c--) { scanf("%d", &n); int data[10010][2] = { 0 }; std::map<int, int> mapdict; ///<离散化 for (int i = 0; i < n; ++i) { scanf("%d%d", &data[i][0], &data[i][1]); mapdict.insert(std::pair<int, int>(data[i][0], 0)); mapdict.insert(std::pair<int, int>(data[i][1], 0)); } int m = 0; std::map<int, int>::iterator iter; for (iter = mapdict.begin(); iter != mapdict.end(); ++iter) { iter->second = ++m; } ///<线段树插入 for (int i = 0; i < n; ++i) { int a = mapdict[data[i][0]]; int b = mapdict[data[i][1]]; insert(0, 1, m, a, b, 1 + i); } ///<输出最终覆盖结果 counter.clear(); sum(0, 1, m); printf("%d\n", counter.size()); } return 0; }
相关文章推荐
- POJ-2528 Mayor's posters 线段树
- POJ 2528 Mayor's posters 线段树成段更新+离散化
- 线段树2-Mayor's posters-POJ 2528
- POJ 2528 Mayor's posters 离散化+线段树
- POJ-2528-Mayor's posters【线段树 & 离散化】
- POJ 2528 Mayor's posters 线段树和离散化
- (重温)poj 2528 Mayor's posters 线段树 染色+离散化
- poj 2528 Mayor's posters 【线段树 + 离散化】
- POJ 2528 Mayor's posters 线段树
- POJ 2528 Mayor's posters 线段树的区间覆盖 离散化
- POJ 2528 Mayor's posters 离散化和线段树题解
- Poj 2528 Mayor's posters 线段树 离散化 成段更新
- poj 2528 Mayor's posters【离散化+线段树】
- POJ --2528--Mayor's posters--离散线段树
- poj 2528 Mayor's posters 线段树
- Mayor's posters----POJ_2528----线段树之成段更新and离散化
- poj 2528 Mayor's posters 【线段树 + 离散化】
- poj 2528 Mayor's posters 线段树
- POJ 2528 Mayor's posters // 线段树 区间更新 离散化
- POJ 2528 Mayor's posters 离散化+线段树