POJ 2528 Mayor's posters
来源:互联网 发布:淘宝开店简介 编辑:程序博客网 时间:2024/06/15 10:05
本题的难点在于离散化,对于离散化由于做过这方面的题目做的并不是很多,其实离散化的目的就是使得给出数据便于处理的一种方法,从原始到目标数据的一一映射,相比于原始数据目标数据更容易处理,且目标数据仍然满足原始数据满足的一些条件,离散化的过程中往往用到排序,关键是怎样建立这种一一映射的关系,还得做几道相关的题目理解一下,本题的离散化也是非常的经典,具体看程序吧...
#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
- 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
- Poj 2528 Mayor's posters
- Poj 2528 Mayor's posters
- C++对C语言的非面向对象特性扩充(2)
- MFC的多线程
- struts2+jquery+json实现异步加载数据
- 外企邮件中常用英语
- Hibernate基础之load()与get()
- POJ 2528 Mayor's posters
- C++对C语言的非面向对象特性扩充(3)
- 员工对谷歌有哪些不满
- ubuntu/linux系统如何设置IP地址,网关,DNS
- C++之类与对象(1)
- 2013-11-5 Linux 命令(cd ls )
- 安装mysql Install/Remove of the Service Denied!错误的解决办法
- FORM开发
- 利用JAVA操作Redis