区间覆盖问题,首先要将宽度进行离散化,也就是就行合并去重二分查找左右边界。借鉴别人的方法。
/****************************************************/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <stack>
#include <map>
#include <queue>
#include <algorithm>
#include <ctime>
#define EPS 1E-8
#define MAXN 10010
#define INF (~0U >> 2)
#define MOD 1000000007
#define Lson l, mid, rt << 1
#define Rson mid + 1, r, rt << 1 | 1
using namespace std;
typedef long long LL;
/****************************************************/
int col[MAXN << 4], hash[MAXN], X[MAXN << 2], res;
struct P
{
int l, r;
}post[MAXN];
void push_down(int rt)
{
if (col[rt] != -1)
{
col[rt << 1] = col[rt << 1 | 1] = col[rt];
col[rt] = -1;
}
}
void update(int L, int R, int c, int l, int r, int rt)
{
if (L <= l && r <= R)
{
col[rt] = c;
return;
}
push_down(rt);
int mid = (l + r) >> 1;
if (L <= mid)
update(L, R, c, Lson);
if (R > mid)
update(L, R, c, Rson);
}
void query(int l, int r, int rt)
{
if (col[rt] != -1)
{
if (!hash[col[rt]])
res++;
hash[col[rt]] = 1;
return;
}
if (l == r)
return;
int mid = (l + r) >> 1;
query(Lson);
query(Rson);
}
int main()
{
int t;
scanf("%d", &t);
while (t--)
{
int n;
scanf("%d", &n);
int p = 0;
for (int i = 0; i < n; i++)
{
scanf("%d%d", &post[i].l, &post[i].r);
X[p++] = post[i].l;
X[p++] = post[i].r;
}
sort(X, X + p);
int pp = 1;
for (int i = 1; i < p; i++)
{
if (X[i] != X[i - 1])
X[pp++] = X[i];
}
for (int i = pp - 1; i > 0; i--)
{
if (X[i] != X[i - 1] + 1)
X[pp++] = X[i - 1] + 1;
}
sort(X, X + pp);
memset(col, -1, sizeof(col));
for (int i = 0; i < n; i++)
{
int l = (lower_bound(X, X + pp, post[i].l) - X);
int r = (lower_bound(X, X + pp, post[i].r) - X);
update(l, r, i, 0, pp - 1, 1);
}
res = 0;
memset(hash, 0, sizeof(hash));
query(0, pp - 1, 1);
printf("%d\n", res);
}
}