1、离散+暴力的方法是最容易想到的。
思路:点坐标10^7的范围,使得最容易的暴力无法实现。但坐标的个数最多有2*n个,(n=40000),这样看的话,点的分布就过于分散了,所有我们要找个方法来把点坐标集中起来。而离散化就是能很好的实现这个思路,离散化了以后,n是10^4的规模,那么我们再次使用暴力的话,就能擦边的过掉这道题了。
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define M 40005
int a[M][2], s[M+M], ss[M+M], f[10000007], flag[M];
int main()
{
int t, n, x, y;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
int c = 1;
for(int i = 1; i <= n; ++i)
{
scanf("%d %d",&x, &y);
a[i][0] = x;
a[i][1] = y;
s[c++] = x;
s[c++] = y;
}
sort(s+1,s+n+n+1);
c = 1;
s[n+n+1] = -1;
for(int i = 1; i <= n+n; ++i)
{
if(s[i]!=s[i+1])
{
ss[c] = s[i];
f[s[i]] = c;
++c;
}
}
memset(s,0,sizeof(s));
memset(flag,0,sizeof(flag));
for(int i = 1; i <= n; ++i)
for(int j = f[a[i][0]]; j <= f[a[i][1]]; j++)
s[j] = i;
int ans = 0;
for(int i = 1; i <= c; ++i)
{
if(s[i]!=0)
{
if(flag[s[i]]==0)
{
++ans;
flag[s[i]] = 1;
}
}
}
printf("%d\n",ans);
}
return 0;
}