5590. 沿栅栏散步

题目链接:https://www.acwing.com/problem/content/description/5593/

题意:

在一个直正多边形中,快速求出其上一点到另一点的距离

思路:

另g[i][j] 为 i,j 这个点到达初始点的距离

那么其上两点的内距离(不经过初始点的距离)dist= g2-g1 (点2在点1之后)

外距离为周长sum-dist

关键在于是求距离/长度而非位移之类的

#include<bits/stdc++.h>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define pb push_back
#define endl "\n"
#define fi first
#define se second
//#pragma GCC optimize(3)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 lll;
typedef pair<int,int> pii;
const int inf=0x3f3f3f3f;
const ll llmax=LLONG_MAX;
const int maxn=1e5+5;
const int mod=1e9+7;
int g[1005][1005];
int sum=0;
int idx,idy;
void solve(){
	int n,p;cin>>n>>p;
	int stx,sty;cin>>stx>>sty;
	idx=stx,idy=sty;
	g[stx][sty]=0;
	for(int i=2;i<=p;i++){
		
		int x,y;cin>>x>>y;
		while(idx<x){
			g[idx][idy]=sum;
			sum++;
			idx++;
		}
		while(idy<y){
			g[idx][idy]=sum;
			sum++;
			idy++;
		}
		while(idx>x){
			g[idx][idy]=sum;
			sum++;
			idx--;
		}
		while(idy>y){
			g[idx][idy]=sum;
			sum++;
			idy--;
		}
		g[idx][idy]=sum;
	}
		int temx=idx,temy=idy,temsum=sum;		
		while(idx<stx){
			g[idx][idy]=sum;
			sum++;
			idx++;
		}
		while(idy<sty){
			g[idx][idy]=sum;
			sum++;
			idy++;
		}
		while(idx>stx){
			g[idx][idy]=sum;
			sum++;
			idx--;
		}
		while(idy>sty){
			g[idx][idy]=sum;
			sum++;
			idy--;
		}
		g[stx][sty]=0;
		g[temx][temy]=temsum;
//	cout<<"sum "<<sum<<endl;
	for(int i=1;i<=n;i++){
		int x1,y1,x2,y2;cin>>x1>>y1>>x2>>y2;
		int dist=abs(g[x1][y1]-g[x2][y2]);
//		cout<<"g[x1][y1] "<<g[x1][y1]<<endl;
//		cout<<"g[x2][y2] "<<g[x2][y2]<<endl;
		cout<<min(dist,sum-dist)<<endl;
	}
}

signed main()
{
	ios::sync_with_stdio(false),cin.tie(0);
	int T=1;
	
	while(T--){
	solve();
	}
	
	return 0;
}


posted @ 2025-03-11 21:28  Marinaco  阅读(12)  评论(0)    收藏  举报
//雪花飘落效果