| 比赛 |
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;
}