标签: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