题目:
题意:
在坐标系上有
q
q
q个点,若我们在
i
i
i点设置保护装置,则所有满足
x
j
⩾
x
i
&
y
i
=
y
j
x_j\geqslant x_i\&y_i=y_j
xj⩾xi&yi=yj或
x
i
=
x
j
&
y
j
⩾
y
i
x_i=x_j\&y_j\geqslant y_i
xi=xj&yj⩾yi的点将会被保护到
问我们最少需要设置几个保护装置
分析:
因为保护装置的保护模式,所以我们发现,一个点有没有被保护只需要看该行或该列之前是否有被覆盖
那把所有点按坐标排好序,直接
O
(
n
)
O(n)
O(n)扫过去,如果都没有被覆盖,那这个点就必须设置保护点,贡献
+
1
+1
+1
代码:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define LL long long
#define MM 2147483647/3
using namespace std;
inline LL read()
{
LL s=0,f=1; char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}
while(c>='0'&&c<='9') {s=s*10+c-'0';c=getchar();}
return s*f;
}
struct in{
int x,y;
}a[100005];
bool cmp(in x,in y) {return x.x==y.x&&x.y<y.y||x.x<y.x;}
int tfx[100005],tfy[100005];
int main()
{
freopen("iakioi.in","r",stdin);
freopen("iakioi.out","w",stdout);
int t=read();
while(t--)
{
int n=read(),m=read(),q=read();
for(int i=1;i<=q;i++) a[i].x=read(),a[i].y=read();
sort(a+1,a+1+q,cmp);
int ans=0;
memset(tfx,0,sizeof(tfx));
memset(tfy,0,sizeof(tfy));
for(int i=1;i<=q;i++)
{
int x=a[i].x,y=a[i].y;
if(!tfx[x]&&!tfy[y])
{
ans++;
tfx[x]=1;tfy[y]=1;
}
}
printf("%d\n",ans);
}
return 0;
}