比赛 NOIP2025模拟赛4 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 Daily Commute 最终得分 100
用户昵称 郑霁桓 运行时间 4.434 s
代码语言 C++ 内存使用 12.13 MiB
提交时间 2025-11-27 10:20:36
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,w,d,xx,yy,tp,a[200005],p[200005],b[200005],vs[200005];
vector<int>v[200005];
const int I=1e8;
priority_queue<pair<int,int> >q;
set<pair<int,int> >st;
int main(){
	freopen("Commute.in","r",stdin);
	freopen("Commute.out","w",stdout);
	ios::sync_with_stdio(false);
	cin>>n>>w>>d;
	for(int i=1;i<=w;i++){
		cin>>xx>>yy;
		v[yy].push_back(xx); 
	}
	for(int i=1;i<n;i++) p[i]=I;
	q.push({0,n});
	while(!q.empty()){
		tp=q.top().second;
		q.pop();
		if(vs[tp]) continue;
		vs[tp]=1;
		for(int i=0;i<v[tp].size();i++){
			if(p[v[tp][i]]>p[tp]+1){
				p[v[tp][i]]=p[tp]+1;
				if(!vs[v[tp][i]]) q.push({-p[v[tp][i]],v[tp][i]});
			}
		}
	}
	for(int i=1;i<=n;i++) cin>>a[i],b[a[i]]=i-1;
	for(int i=1;i<=n;i++){
		st.insert({b[i]+p[i],i});
	}
	for(int i=1;i<=d;i++){
		cin>>xx>>yy;
        int px=xx,py=yy;
		xx=a[xx],yy=a[yy];
		st.erase({b[xx]+p[xx],xx});
		st.erase({b[yy]+p[yy],yy});
        swap(a[px],a[py]);
        swap(b[xx],b[yy]);
		st.insert({b[xx]+p[xx],xx});
		st.insert({b[yy]+p[yy],yy});
		cout<<((*st.begin()).first)<<"\n";
	}
    return 0;
}