比赛 NOIP2025模拟赛4 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 Daily Commute 最终得分 100
用户昵称 梦那边的美好TT 运行时间 3.441 s
代码语言 C++ 内存使用 6.42 MiB
提交时间 2025-11-27 10:59:25
显示代码纯文本
#include<bits/stdc++.h>
#define N 200001
#define pr pair<int,int> 
using namespace std;
int n,w,d,s[N],a[N],h[N],e[N],nxt[N],dis[N],u,v;
priority_queue<pr,vector<pr>,greater<pr>> pq;
deque<int> dq;
int main(){
	freopen("Commute.in","r",stdin);
	freopen("Commute.out","w",stdout);
	cin>>n>>w>>d;
	for(int i=1;i<=w;i++){
		cin>>u>>v;
		u--;
		v--;
		e[i]=u;
		nxt[i]=h[v];
		h[v]=i;
	}
	for(int i=0;i<n;i++){
		cin>>s[i];
		a[--s[i]]=i;
		dis[i]=1e9;
	}
	dq.emplace_back(n-1);
	dis[n-1]=0;
	while(!dq.empty()){
		int i=dq.front();
		dq.pop_front();
		for(int j=h[i];j;j=nxt[j]){
			if(dis[e[j]]==1e9){
				dis[e[j]]=dis[i]+1;
				dq.emplace_back(e[j]);
			}
		}
	}
	for(int i=0;i<n;i++) pq.emplace(dis[i]+a[i],i);
	while(d--){
		cin>>u>>v;
		u--;
		v--;
		swap(s[u],s[v]);
		u=s[u];
		v=s[v];
		swap(a[u],a[v]);
		pq.emplace(dis[u]+a[u],u);
		pq.emplace(dis[v]+a[v],v);
		while(pq.top().first^dis[pq.top().second]+a[pq.top().second]) pq.pop();
		cout<<pq.top().first<<endl;
	}
	return 0;
}