UVALive 5873 - Tree Inspections 【模拟】

题目大意:给你一堆树的坐标,然后给你一些横着的路和竖着的路,一棵树如果横着或者竖着可以在没有其他树阻挡的情况下看到一条路,这棵树就是“好的”,问最后“好的”树能否不小于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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值