POJ 2528 Mayor's posters
2013-11-05 10:09
369 查看
本题的难点在于离散化,对于离散化由于做过这方面的题目做的并不是很多,其实离散化的目的就是使得给出数据便于处理的一种方法,从原始到目标数据的一一映射,相比于原始数据目标数据更容易处理,且目标数据仍然满足原始数据满足的一些条件,离散化的过程中往往用到排序,关键是怎样建立这种一一映射的关系,还得做几道相关的题目理解一下,本题的离散化也是非常的经典,具体看程序吧...
#include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int MAXN = 10010<<1; const int INF = 0x3f3f3f3f; struct Node { int num, id; Node() {} Node(int t_num, int t_id) : num(t_num), id(t_id) {} friend bool operator< (const Node &p1, const Node &p2) { return p1.num < p2.num; } }p[MAXN]; int color[MAXN<<2]; int used[MAXN]; int segment[MAXN][2]; int c, n; void PushDown(int rt, int len) { if(color[rt]) { color[rt<<1] = color[rt]; color[rt<<1|1] = color[rt]; color[rt] = 0; } return ; } void Bulid(int l, int r, int rt) { color[rt] = 0; if(l == r) return; int m = (l + r)>>1; Bulid(l, m, rt<<1); Bulid(m + 1, r, rt<<1|1); return ; } void Update(int L, int R, int col, int l, int r, int rt) { if(L == l && R == r) { color[rt] = col; return ; } PushDown(rt, r - l + 1); int m = (l + r)>>1; if(R <= m) Update(L, R, col, l, m, rt<<1); else if(L > m) Update(L, R, col, m + 1, r, rt<<1|1); else { Update(L, m, col, l, m, rt<<1); Update(m + 1, R, col, m + 1, r, rt<<1|1); } return ; } void Query(int L, int R, int l, int r, int rt) { if(L == l && R == r && color[rt]) { used[color[rt]]++; return ; } PushDown(rt, r - l + 1); int m = (l + r)>>1; if(R <= m) Query(L, R, l, m, rt<<1); else if(L > m) Query(L, R, m + 1, r, rt<<1|1); else { Query(L, m, l, m, rt<<1); Query(m + 1, R, m + 1, r, rt<<1|1); } return ; } int main() { //freopen("aa.in", "r", stdin); int cnt, ans; scanf("%d", &c); while(c--) { scanf("%d", &n); for(int i = 1; i <= n; ++i) { scanf("%d %d", &p[2*i-1].num, &p[2*i].num); p[2*i-1].id = -i; p[2*i].id = i; } sort(p + 1, p + 2 * n + 1); cnt = 0; p[0].num = -INF; for(int i = 1; i <= 2*n; ++i) { if(p[i].num != p[i-1].num) cnt++; if(p[i].id < 0) segment[-p[i].id][0] = cnt; else segment[p[i].id][1] = cnt; } Bulid(1, cnt, 1); for(int i = 1; i <= n; ++i) { Update(segment[i][0], segment[i][1], i, 1, cnt, 1); } memset(used, 0, sizeof(used)); Query(1, cnt, 1, cnt, 1); ans = 0; for(int i = 1; i <= n; ++i) { if(used[i] > 0) ans++; } printf("%d\n", ans); } return 0; }
相关文章推荐
- poj 2528 Mayor's posters(扫描线+堆维护||离散化+线段树)
- POJ 2528 Mayor's posters
- poj 2528 Mayor's posters
- poj 2528 Mayor's posters(线段树+离散)
- D - 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(离散化+区间set线段树)
- 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 (线段树+离散化+hash)
- poj 2528——Mayor's posters