题目链接
题目是一道很好的题,他用很神奇的数据告诉了我们——少用map,会TLE的。。。所以,这道题怎样避免N*log(N)的map??我们可以换成lower_bound()来进行优化,但是在此之前可以用unique()进行去重操作(自己懒,所以用已有的STL文件)。
顺便说一句,这有一组数据(这组数据在常理上应该是正解,但是好像在本题中视作假的。。。)
1
3
1 10
1 3
6 10
正解应当是3,而很多人应该会得到2——离散化的问题,但是不管它,能过就是了。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 10005;
int N, bit[maxN<<1], cnt, diff, tree[maxN<<3];
bool cmp_bit(int e1, int e2) { return e1<e2; }
bool vis[maxN<<1];
int ans;
struct node
{
int l, r, id;
node(int a=0, int b=0, int c=0):l(a), r(b), id(c) {}
}a[maxN];
void init()
{
cnt=0;
ans=0;
memset(vis, false, sizeof(vis));
}
void buildTree(int rt, int l, int r)
{
tree[rt] = 0;
if(l == r) return;
int mid = (l + r)>>1;
buildTree(rt<<1, l, mid);
buildTree(rt<<1|1, mid+1, r);
}
void pushdown(int rt)
{
if(tree[rt])
{
tree[rt<<1] = tree[rt<<1|1] = tree[rt];
tree[rt] = 0;
}
}
void update(int rt, int l, int r, int ql, int qr, int val)
{
if(ql<=l && qr>=r)
{
tree[rt] = val;
return;
}
pushdown(rt);
int mid = (l + r)>>1;
if(ql<=mid) update(rt<<1, l, mid, ql, qr, val);
if(qr>mid) update(rt<<1|1, mid+1, r, ql, qr, val);
}
void query(int rt, int l, int r, int ql, int qr)
{
if(tree[rt])
{
if(!vis[tree[rt]]) ans++;
vis[tree[rt]] = true;
return;
}
if(l == r)
{
if(!vis[tree[rt]] && tree[rt]) ans++;
vis[tree[rt]] = true;
return;
}
int mid = (l + r)>>1;
query(rt<<1, l, mid, ql, mid);
query(rt<<1|1, mid+1, r, mid+1, qr);
}
int main()
{
int T; scanf("%d", &T);
while(T--)
{
scanf("%d", &N);
init();
for(int i=1; i<=N; i++)
{
scanf("%d%d", &a[i].l, &a[i].r);
a[i].id = i;
bit[++cnt] = a[i].l;
bit[++cnt] = a[i].r;
}
sort(bit+1, bit+1+cnt, cmp_bit);
diff = (int)(unique(bit+1, bit+cnt+1) - bit - 1);
buildTree(1, 1, diff);
for(int i=1; i<=N; i++)
{
update(1, 1, diff, (int)(lower_bound(bit+1, bit+1+diff, a[i].l) - bit), (int)(lower_bound(bit+1, bit+1+diff, a[i].r) - bit), i);
}
query(1, 1, diff, 1, diff);
printf("%d\n", ans);
}
return 0;
}