社区讨论

全WA求助

P3350[ZJOI2016] 旅行者参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lo7zbtx1
此快照首次捕获于
2023/10/27 10:13
2 年前
此快照最后确认于
2025/01/10 22:21
去年
查看原帖
输出的答案大了,不知道哪里没有考虑到...
CPP
#include<bits/stdc++.h>
#define y1 fdsgdfgdfsg
#define N 100005
using namespace std;
int n,m,k,x,ans[N],x1,y1,x2,y2,dis[N],tot;
bool vis[N];
struct edge{
	int to,w;
	bool operator<(const edge &a)const{
		return w>a.w;
	}
};
vector<edge>ve[N];
struct node{
	int x1,y1,x2,y2,p;
}q[N],tmp[N];
int get(int p1,int p2){
	return (p1-1)*m+p2;
}
bool chk(int l1,int r1,int l2,int r2,int x,int y){
	return (x>=l1&&x<=r1&&y>=l2&&y<=r2);
}
void dij(int p,int l1,int r1,int l2,int r2){
	for(int i=l1;i<=r1;i++)
		for(int j=l2;j<=r2;j++)
			dis[get(i,j)]=2e9,vis[get(i,j)]=0;
	dis[p]=0;
	priority_queue<edge>q;
	q.push((edge){
		p,0
	});
	while(!q.empty()){
		int now=q.top().to;
		q.pop();
		if(vis[now])continue;
		vis[now]=1;
		for(int i=0;i<ve[now].size();i++){
			int y=ve[now][i].to;
			if(!chk(l1,r1,l2,r2,(y-1)/m+1,(y-1)%m+1))continue;
			if(dis[y]>dis[now]+ve[now][i].w){
				dis[y]=dis[now]+ve[now][i].w;
				q.push((edge){
					y,dis[y]
				});
			}
		}
	}
}
void solve(int l1,int r1,int l2,int r2,int l,int r){
	if(l>r||l1>r1||l2>r2)return;
	if(r2-l2>r1-l1){
		int mid=(l2+r2)>>1;
		for(int i=l1;i<=r1;i++){
			dij(get(i,mid),l1,r1,l2,r2);
			for(int k=l;k<=r;k++)ans[q[k].p]=min(ans[q[k].p],dis[get(q[k].x1,q[k].y1)]+dis[get(q[k].x2,q[k].y2)]);
		}
		tot=l-1;
		for(int i=l;i<=r;i++)
			if(chk(l1,r1,l2,mid-1,q[i].x1,q[i].y1)&&chk(l1,r1,l2,mid-1,q[i].x2,q[i].y2))tmp[++tot]=q[i];
		int pos=tot;
		for(int i=l;i<=r;i++)
			if(chk(l1,r1,mid+1,r2,q[i].x1,q[i].y1)&&chk(l1,r1,mid+1,r2,q[i].x2,q[i].y2))tmp[++tot]=q[i];
		for(int i=l;i<=tot;i++)q[i]=tmp[i];
		solve(l1,r1,l2,mid-1,l,pos);
		solve(l1,r1,mid+1,r2,pos+1,tot);
	}
	else{
		int mid=(l1+r1)>>1;
		for(int i=l2;i<=r2;i++){
			dij(get(mid,i),l1,r1,l2,r2);
			for(int k=l;k<=r;k++)ans[q[k].p]=min(ans[q[k].p],dis[get(q[k].x1,q[k].y1)]+dis[get(q[k].x2,q[k].y2)]);
		}
		tot=l-1;
		for(int i=l;i<=r;i++)
			if(chk(l1,mid-1,l2,r2,q[i].x1,q[i].y1)&&chk(l1,mid-1,l2,r2,q[i].x2,q[i].y2))tmp[++tot]=q[i];
		int pos=tot;
		for(int i=l;i<=r;i++)
			if(chk(mid+1,r1,l2,r2,q[i].x1,q[i].y1)&&chk(mid+1,r1,l2,r2,q[i].x2,q[i].y2))tmp[++tot]=q[i];
		for(int i=l;i<=tot;i++)q[i]=tmp[i];
		solve(l1,mid-1,l2,r2,l,pos);
		solve(mid+1,r1,l2,r2,pos+1,tot);
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<m;j++){
			cin>>x;
			ve[get(i,j)].push_back((edge){
				get(i,j+1),x
			});
			ve[get(i,j+1)].push_back((edge){
				get(i,j),x
			});
		}
	}
	for(int i=1;i<n;i++){
		for(int j=1;j<=m;j++){
			cin>>x;
			ve[get(i,j)].push_back((edge){
				get(i+1,j),x
			});
			ve[get(i+1,j)].push_back((edge){
				get(i,j),x
			});
		}
	}
	cin>>k;
	for(int i=1;i<=k;i++){
		cin>>q[i].x1>>q[i].y1>>q[i].x2>>q[i].y2;
		q[i].p=i,ans[i]=2e9;
	}
	solve(1,n,1,m,1,k);
	for(int i=1;i<=k;i++)cout<<ans[i]<<endl;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...