专栏文章

题解:P13752 【MX-X17-T1】Walk,Walk,Walk

P13752题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioa3rhq
此快照首次捕获于
2025/12/02 15:50
3 个月前
此快照最后确认于
2025/12/02 15:50
3 个月前
查看原文
本蒟蒻的第一篇题解
题目传送门

题意

对于n条线和2个点,求从第一个点到第二个点的路程中,最少穿过n条线中多少条线。

思路

我们仔细看题不难发现,如果这两个点在某一条直线两侧,从一个点到另一个点的路程一定穿过这条直线。
也就是说如果一条直线的x/y坐标在两点的x/y坐标范围之内,两点的路径就 一定穿过这条直线
所以我们只需要遍历两点的x/y坐标范围并记录在此范围内的直线的数量,即可AC

code

CPP
#include<bits/stdc++.h>
using namespace std;
long long n,t,k,sx,sy,tx,ty,xl[100001],yl[100001],ans,xsiz=0,ysiz=0;
bool cmp(long long x,long long y){
	return x>y;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>t>>k;//输入
		if(t==1){
			xl[++xsiz]=k;记录平行于x,y轴的直线
		}else{
			yl[++ysiz]=k;
		}
	}
	sort(yl+1,yl+ysiz+1,cmp);
	sort(xl+1,xl+xsiz+1,cmp);//这两行其实没用
	cin>>sx>>sy>>tx>>ty;
	for(int i=1;i<=ysiz;i++){
		if(yl[i]>=sy&&yl[i]<=ty||yl[i]>=ty&&yl[i]<=sy){
			ans++;
		}
	for(int i=1;i<=xsiz;i++){
		if(xl[i]>=sx&&xl[i]<=tx||xl[i]>=tx&&xl[i]<=sx){
			ans++;
		}//如果直线在两点之间,ans就++
	}
	}cout<<ans;
	return 0;
}
```

评论

0 条评论,欢迎与作者交流。

正在加载评论...