标签:des style blog http os io 数据 for
Description
Input
Output
Sample Input
1 5 1 4 2 6 8 10 3 4 7 10
Sample Output
4
题意:铺壁纸,求最后能让人看到的有几个
思路:数据很大,如果单纯以距离作为下表的话会超内存,思路:我们将我们需要的点离散化,但是普通的离散化又会出现错误:比如区间[1, 10], [1, 4] , [5 ,10] 以及例子:[1, 10], [1 ,4] , [6, 10],假如我们已经离散化了,那我们插入的区间就是: [1, 3], [1, 2], [2 ,3 ]这种插法对第一个例子是适用的,但是对第二个就不行了,解决的方法是:如果两个数的位置大于1 的话,我们就多加一个点来区别这两个点不是连在一起的
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #define lson(x) ((x) << 1) #define rson(x) ((x) << 1 | 1) using namespace std; const int maxn = 100005; bool hash[maxn]; int li[maxn], ri[maxn], ans; int x[maxn<<2]; struct seg { int w; int flag; }; struct segment_tree { seg node[maxn<<2]; void build(int l, int r, int pos) { if (l == r) { node[pos].w = -1; return; } int m = l + r >> 1; build(l, m, lson(pos)); build(m+1, r, rson(pos)); } void push(int pos) { if (node[pos].w != -1) { node[lson(pos)].w = node[rson(pos)].w = node[pos].w; node[pos].w = -1; } } void modify(int l, int r, int pos, int x, int y, int z) { if (x <= l && y >= r) { node[pos].w = z; return; } push(pos); int m = l + r >> 1; if (x <= m) modify(l, m, lson(pos), x, y, z); if (y > m) modify(m+1, r, rson(pos), x, y, z); } void query(int l, int r, int pos) { if (node[pos].w != -1) { if (hash[node[pos].w] == false) ans++; hash[node[pos].w] = true; return; } if (l == r) return; int m = l + r >> 1; query(l, m, lson(pos)); query(m+1, r, rson(pos)); } } tree; int Bin(int key, int n, int arr[]) { int l = 0, r = n-1; while (l <= r) { int m = l + r >> 1; if (arr[m] == key) return m; if (arr[m] < key) l = m + 1; else r = m-1; } return -1; } int main() { int t, n; scanf("%d", &t); while (t--) { scanf("%d", &n); int cnt = 0; for (int i = 0; i < n; i++) { scanf("%d%d", &li[i], &ri[i]); x[cnt++] = li[i]; x[cnt++] = ri[i]; } sort(x, x+cnt); int m = 1; for (int i = 1; i < cnt; i++) if (x[i] != x[i-1]) x[m++] = x[i]; for (int i = m-1; i > 0; i--) if (x[i] != x[i-1] + 1) x[m++] = x[i-1] + 1; sort(x, x+m); tree.build(1, m, 1); for (int i = 0; i < n; i++) { int l = Bin(li[i], m, x) + 1; int r = Bin(ri[i], m, x) + 1; tree.modify(1, m, 1, l, r, i); } ans = 0; memset(hash, false, sizeof(hash)); tree.query(1, m, 1); printf("%d\n", ans); } return 0; }
POJ - 2528 Mayor's posters (线段树+离散化),布布扣,bubuko.com
POJ - 2528 Mayor's posters (线段树+离散化)
标签:des style blog http os io 数据 for
原文地址:http://blog.csdn.net/u011345136/article/details/38357677