题目链接:
http://poj.org/problem?id=2528
题意:
n 个人依次贴海报,给出每张海报所贴的范围 li ,ri 求出最后还能看见多少张海报。
题解:
线段树,因为后来的海报总会覆盖之前张贴的海报,那么我们把操作从后往前枚举,用线段树 tr [ i ] . val 表示标号为 i 的节点所代表的区间中已经有多少个位置被覆盖。
然后就是简单的区间查询和区间修改。
然后看它的数据范围 10000000 直接线段树妥妥的MLE,需要用离散化,而且这个离散化还要注意一个细节,简单的排序后编号是不可以的,举一个例子:
3
1 10
1 4
6 10
直接排序后标号为
vis[1]=1;vis[4]=2;vis[6]=3;vis[10]=4;
然后照这样的做法,先覆盖 3~4 在覆盖 1~2 ,然后覆盖 1~4 ,答案是 2 ,然而正确答案是 3 ,中间的位置5被神奇的跳过了,新的离散方法就是,离散时若发现 a[i] - a[i-1] > 1 那么 vis [ a[i] ] = vis [ a[i-1] ] + 2 ,这样的话就相当于给中间那些数留出来了一个空位,防止上面的情况发生,具体细节看代码。
代码:
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<map>
#define lson (id*2)
#define rson (id*2+1)
using namespace std;
int ans;
struct node{