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;
}

浙公网安备 33010602011771号