题目大意:给你一堆树的坐标,然后给你一些横着的路和竖着的路,一棵树如果横着或者竖着可以在没有其他树阻挡的情况下看到一条路,这棵树就是“好的”,问最后“好的”树能否不小于60%。
把点和边一起排序,正向扫一遍,逆向扫一遍扫到点就看看对应位置有没有过树,没有就把当前点标记为“好的”,扫到边就把所有位置的树清空,这个可以用map实现,比较方便。横竖分别做一遍,最后算答案即可。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
struct shu1{
int x,y,hao;
bool friend operator<(shu1 a,shu1 b){
return a.x!=b.x?a.x<b.x:a.y<b.y;
}
}a[210000];
struct shu2{
int x,y,hao;
bool friend operator<(shu2 a,shu2 b){
return a.y!=b.y?a.y<b.y:a.x<b.x;
}
}b[210000];
int f,t,p;
map<int,int> mm;
int h[110000],v[110000];
int ans[110000];
int main(){
scanf("%d",&f);
while(f--){
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
scanf("%d%d",&t,&p);
for(int i=1;i<=t;i++){
scanf("%d%d",&a[i].x,&a[i].y);
a[i].hao=i;
}
h[0]=v[0]=0;
for(int i=1;i<=p;i++){
char c;
int q;
scanf(" %c %d",&c,&q);
if(c=='H'){
h[0]++;
h[h[0]]=q;
}else{
v[0]++;
v[v[0]]=q;
}
}
for(int i=1;i<=t;i++){
b[i].x=a[i].x;
b[i].y=a[i].y;
b[i].hao=a[i].hao;
}
memset(ans,0,sizeof(ans));
mm.clear();
for(int i=1;i<=v[0];i++)mm[v[i]+2000000]=1;
for(int i=1;i<=t;i++){
if(mm[a[i].x+2000000]){
ans[a[i].hao]=1;
a[i].y=-1100000;
// printf("1hao=%d\n",a[i].hao);
}
}
mm.clear();
for(int i=1;i<=h[0];i++)mm[h[i]+2000000]=1;
for(int i=1;i<=t;i++){
if(mm[b[i].y+2000000]){
ans[b[i].hao]=1;
b[i].x=-1100000;
// printf("2hao=%d\n",a[i].hao);
}
}
for(int i=1;i<=v[0];i++){
a[t+i].x=v[i];
a[t+i].y=-1100000;
}
for(int i=1;i<=h[0];i++){
b[t+i].x=-1100000;
b[t+i].y=h[i];
}
sort(a+1,a+t+v[0]+1);
sort(b+1,b+t+h[0]+1);
// for(int i=1;i<=t+v[0];i++)printf("a[%d] x=%d y=%d hao=%d\n",i,a[i].x,a[i].y,a[i].hao);
// for(int i=1;i<=t+h[0];i++)printf("b[%d] x=%d y=%d hao=%d\n",i,b[i].x,b[i].y,b[i].hao);
mm.clear();
int vv=0;
for(int i=1;i<=t+v[0];i++){
if(a[i].y==-1100000){
vv=1;
mm.clear();
}else{
if(vv){
if(!mm[a[i].y+2000000]){
mm[a[i].y+2000000]=1;
ans[a[i].hao]=1;
// printf("a1 i=%d hao=%d\n",i,a[i].hao);
}
}
}
}
mm.clear();
vv=0;
for(int i=t+v[0];i>=1;i--){
if(a[i].y==-1100000){
vv=1;
mm.clear();
}else{
if(vv){
if(!mm[a[i].y+2000000]){
mm[a[i].y+2000000]=1;
ans[a[i].hao]=1;
// printf("a2 i=%d hao=%d\n",i,a[i].hao);
}
}
}
}
mm.clear();
vv=0;
for(int i=1;i<=t+h[0];i++){
if(b[i].x==-1100000){
vv=1;
mm.clear();
}else{
if(vv){
if(!mm[b[i].x+2000000]){
mm[b[i].x+2000000]=1;
ans[b[i].hao]=1;
// printf("b1 i=%d hao=%d\n",i,a[i].hao);
}
}
}
}
mm.clear();
vv=0;
for(int i=t+h[0];i>=1;i--){
if(b[i].x==-1100000){
vv=1;
mm.clear();
}else{
if(vv){
if(!mm[b[i].x+2000000]){
mm[b[i].x+2000000]=1;
ans[b[i].hao]=1;
// printf("b2 i=%d hao=%d\n",i,a[i].hao);
}
}
}
}
int ji=0;
for(int i=1;i<=t;i++){
if(ans[i])ji++;
}
if(ji*10>=t*6){
printf("PASSED\n");
}else{
printf("FAILED\n");
}
// printf("ji=%d\n",ji);
}
return 0;
}