比赛 NOIP2025模拟赛4 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 Daily Commute 最终得分 100
用户昵称 李奇文 运行时间 1.318 s
代码语言 C++ 内存使用 12.92 MiB
提交时间 2025-11-27 11:09:43
显示代码纯文本
#include<bits/stdc++.h>
#define mp make_pair
using namespace std;
const int N=2e5+5;
int n,w,d,dis[N],vis[N],a[N],ans[N];
vector<int> e[N];
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>>q;
struct node{
	int l,p,d;
	const bool operator>(const node& x) const{
    	return l>x.l;
  	}	
};
priority_queue<node,vector<node>,greater<node>>f;
void dij(){
	memset(dis,0x3f,sizeof(dis));
	dis[n]=0;
	q.push(mp(0,n));
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		if(!vis[u]){
			vis[u]=1;
			for(int i=0;i<e[u].size();i++){
				int v=e[u][i];
				if(dis[u]+1<dis[v]){
					dis[v]=dis[u]+1;
					q.push(mp(dis[v],v));
				}
			}
		}
	}
}
int main(){
	freopen("Commute.in","r",stdin);
	freopen("Commute.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>w>>d;
	for(int i(1);i<=w;++i){
		int a,b;
		cin>>a>>b;
		e[b].push_back(a);
	}
	dij();
	for(int i(1);i<=n;++i){
		cin>>a[i];
	}
	for(int i(1);i<=n;++i){
		f.push({i-1+dis[a[i]],a[i],0});
	}
	for(int i(1);i<=d;++i){
		int su,sy;
		cin>>su>>sy;
		f.push({sy+dis[a[su]]-1,a[su],++ans[a[su]]});
		f.push({su+dis[a[sy]]-1,a[sy],++ans[a[sy]]});
		while(f.top().d!=ans[f.top().p]) f.pop();
		cout<<f.top().l<<"\n";
		swap(a[sy],a[su]);
	}
	return 0;
}