比赛 NOIP2025模拟赛4 评测结果 AWWAWAAWAAWAWWAWWWAA
题目名称 Daily Commute 最终得分 50
用户昵称 徐诗畅 运行时间 2.390 s
代码语言 C++ 内存使用 7.67 MiB
提交时间 2025-11-27 11:06:50
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,w,d,head[N],cnt,a[N];
struct edge{int v,nex;}e[N];
void addedge(int u,int v){
	e[++cnt].v=v;
	e[cnt].nex=head[u];
	head[u]=cnt;
}
struct node{
	int u,d;
	bool operator<(const node&r) const{return d>r.d;}
};
struct str{
	int id,dis;
	bool operator<(const str&r)const{return dis<r.dis;}
};
int dis[N],vis[N],p[N];
int main(){
	freopen("Commute.in","r",stdin);
	freopen("Commute.out","w",stdout);
	scanf("%d%d%d",&n,&w,&d);
	for(int i = 1;i<=w;i++){
		int u,v; scanf("%d%d",&u,&v);
		addedge(v,u);
	}
	for(int i = 1;i<=n;i++){
		scanf("%d",&a[i]);
		p[a[i]]=i-1;
	}
	priority_queue<node> q;
	memset(dis,0x3f3f3f3f,sizeof(dis)); dis[n]=0;
	q.push(node{n,0});
	while(!q.empty()){
		int u = q.top().u; q.pop();
		if(vis[u]) continue; vis[u]=1;
		for(int i = head[u];i;i=e[i].nex){
			int v=e[i].v;
			if(dis[v]>dis[u]+1){
				dis[v]=dis[u]+1;
				q.push(node{v,dis[v]});
			}
		}
	}
//	for(int i = 1;i<=n;i++) cout<<" "<<i<<" "<<dis[i]<<endl;
	set<str> s;
	for(int i = 1;i<=n;i++)
	s.insert({i,p[i]+dis[i]});
	while(d--){
		int x,y; scanf("%d%d",&x,&y); int tx=x,ty=y;
		x=a[x]; y=a[y]; swap(a[tx],a[ty]);
		int px=p[x],py=p[y];
		s.erase(str{x,dis[x]+px}); 
		s.erase(str{y,dis[y]+py});
		swap(p[x],p[y]);
		s.insert(str{x,dis[x]+p[x]}); //cout<<x<<" "<<dis[x]+px;
		s.insert(str{y,dis[y]+p[y]});
		printf("%d\n",s.begin()->dis); //cout<<s.begin()->id<<endl; 
	}
	return 0;
}