95pts如何卡过最后一个点……
查看原帖
95pts如何卡过最后一个点……
415473
☯☯枫☯☯楼主2021/4/1 16:14
#include<bits/stdc++.h>
#define reg register
#pragma G++ optimize(2)
#pragma G++ optimize(3)
#define F(i,a,b) for(reg int i=(a);i<=(b);i++)
inline int read();
using namespace std;
const int N=260,M=2e3+10;
int n,m,q,cnt,cnt2,Case;
bool pc[N][N];
int pc_t[N][N],rec[M][4],dis[M][M],cl[M][M];
int g[10][2] {0,1,0,-1,-1,0,1,0};//r,l,u,d
struct P {
	int x,y;
} a,b,c[M];
inline void add(int x,int y) {
	if(pc[x][y] or pc_t[x][y] or x<1 or y<1 or x>n or y>n)return;
	c[++cnt]= {x,y},pc_t[x][y]=cnt;
}
inline void sign_it() {
	int x,y;
	F(i,1,m)x=read(),y=read(),pc[x][y]=1;
	F(i,1,n) {
		F(j,1,n) {
			if(!pc[i][j])continue;
			add(i+1,j),add(i-1,j),add(i,j+1),add(i,j-1);
		}
	}
	F(i,1,n)add(1,i),add(i,1),add(n,i),add(i,n);
}
inline void pre(int l,int r) {
	F(i,l,r) {
		F(k,0,3) {
			int x=c[i].x,y=c[i].y;
			while(x>=1 and x<=n and y>=1 and y<=n) {
				x+=g[k][0],y+=g[k][1];
				if(pc[x][y]) {
					rec[i][k]=pc_t[x-g[k][0]][y-g[k][1]];
					break;
				}
			}
		}
	}
}
inline void init() {
	sign_it();
	pre(1,cnt);
	cnt2=cnt;
}
inline void bfs() {
	int &t1=pc_t[a.x][a.y],&t2=pc_t[b.x][b.y];
	if(t1==t2){
		puts("0");
		return;
	}
	queue<P>q;
	q.push({t1,t2});
	dis[t1][t2]=0;
	cl[t1][t2]=Case;
	while(!q.empty()) {
		P t=q.front();
		q.pop();
		F(k,0,3) {
			int &to1=rec[t.x][k],&to2=rec[t.y][k];
			if(cl[to1][to2]!=Case)dis[to1][to2]=-1;
			if(~dis[to1][to2])continue;
			dis[to1][to2]=dis[t.x][t.y]+1;
			if(to1==to2){
				printf("%d\n",dis[to1][to2]);
				return;
			}
			cl[to1][to2]=Case;
			q.push({to1,to2});
		}
	}
	puts("-1");
}
inline void solve() {
	cnt=cnt2;
	int k1=pc_t[a.x][a.y],k2=pc_t[b.x][b.y];
	add(a.x,a.y),add(b.x,b.y);
	pre(cnt2+1,cnt);
	bfs();
	pc_t[a.x][a.y]=k1,pc_t[b.x][b.y]=k2;
}
int main() {
//	freopen("data.in","r",stdin);
	n=read(),m=read(),q=read();
	F(i,1,n)pc[0][i]=pc[i][0]=pc[n+1][i]=pc[i][n+1]=1;
	init();
	F(i,1,q) {
		Case++;
		a.x=read(),a.y=read(),b.x=read(),b.y=read();
		solve();
	}
	return 0;
}
inline int read() {
	reg int x=0;
	reg char c=getchar();
	while(!isdigit(c))c=getchar();
	while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return x;
}
2021/4/1 16:14
加载中...