标签:2528 mayors posters poj 线段树 离散化
| Time Limit: 1000MS | Memory Limit: 65536K | |
| Total Submissions: 47228 | Accepted: 13719 |
Description
Input
Output

Sample Input
1 5 1 4 2 6 8 10 3 4 7 10
Sample Output
4
在一面长墙上贴海报,后面贴的覆盖前面的,求多次贴海报后最终能看到的海报张数
由于墙很长(10000000),直接线段树会MLE,因此对数据离散化以降低内存消耗,数据处理时从后往前处理(即从后往前贴海报)能降低编写代码的难度
#include <cstdio>
#include <algorithm>
#include <vector>
#include <set>
using namespace std;
const int MAX = 10005;
int n, m, a, b;
int arra[MAX], arrb[MAX];
struct seg{
int l, r;
bool v;
}tree[MAX*10];
vector<int> vec;
void build(int root, int l, int r)
{
tree[root].l = l;
tree[root].r = r;
tree[root].v = false;
if (l == r){
return;
}
int mid = (l + r) / 2;
build(root * 2, l, mid);
build(root * 2 + 1, mid + 1, r);
}
bool add(int root, int l, int r)
{
if (tree[root].v){
return false;
}
if (tree[root].l == l && tree[root].r == r){
tree[root].v = true;
return true;
}
else{
bool re;
int mid = (tree[root].l + tree[root].r) / 2;
if (r <= mid){
re = add(root * 2, l, r);
}
else if (l > mid){
re = add(root * 2 + 1, l, r);
}
else{
bool r1 = add(root * 2, l, mid);
bool r2 = add(root * 2 + 1, mid + 1, r);
re = r1 || r2;
}
if (tree[root * 2].v && tree[root * 2 + 1].v){
tree[root].v = true;
}
return re;
}
}
int search(int a)
{
int l = 1, r = vec.size() - 1;
int mid = (l + r) / 2;
while (vec[mid] != a){
if (vec[mid] > a){
r = mid - 1;
}
else{
l = mid + 1;
}
mid = (l + r) / 2;
}
return mid;
}
int main()
{
scanf("%d", &n);
while (n--)
{
vec.clear();
scanf("%d", &m);
int ans = 0;
for (int i = 1; i <= m; ++i)
{
scanf("%d%d", &arra[i], &arrb[i]);
vec.push_back(arra[i]);
vec.push_back(arrb[i]);
}
sort(vec.begin(), vec.end());
vector<int>::iterator last = unique(vec.begin() + 1, vec.end());
vec.resize(last - vec.begin());
build(1, 0, vec.size() - 1);
for (int i = m; i >= 1; --i)
{
if (add(1, search(arra[i]), search(arrb[i]))){
++ans;
}
}
printf("%d\n", ans);
}
return 0;
}【POJ】 2528 - Mayor's posters 【线段树+离散化】
标签:2528 mayors posters poj 线段树 离散化
原文地址:http://blog.csdn.net/xianyun2009/article/details/45293865