| 比赛 |
NOIP2025模拟赛4 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
Daily Commute |
最终得分 |
100 |
| 用户昵称 |
梦那边的没好TM |
运行时间 |
2.788 s |
| 代码语言 |
C++ |
内存使用 |
14.90 MiB |
| 提交时间 |
2025-11-27 11:50:33 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define cpy(a,b) copy(begin(a),end(a),begin(b))
#define ld long double
#define dot(x) fixed<<setprecision(x)
#define foru(a,b,c) for(ll a=b;a<=c;a++)
#define pll pair<ll,ll>
ll n,w,d,dis[200005],s[200005],b[200005];
bool vis[200005];
vector<vector<ll>>a(200005);
priority_queue<pll,vector<pll>,greater<pll>>q;
struct edge{
ll l,p,d;
bool operator >(const edge &t)const{
return l>t.l;
}
};
priority_queue<edge,vector<edge>,greater<edge>>r;
int main(){
freopen("Commute.in" ,"r",stdin );
freopen("Commute.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>n>>w>>d;
foru(i,1,w){
ll u,v;
cin>>u>>v;
a[v].push_back(u);
}
foru(i,1,n){
dis[i]=1e9;
}
dis[n]=0;
q.push({0,n});
while(!q.empty()){
ll u=q.top().second;
q.pop();
if(vis[u])continue;
vis[u]=1;
for(auto v:a[u]){
if(dis[v]>dis[u]+1){
dis[v]=dis[u]+1;
q.push({dis[v],v});
}
}
}
foru(i,1,n){
cin>>s[i];
r.push({i+dis[s[i]]-1,s[i],0});
}
for(ll i=1;i<=d;i++){
ll u,v;
cin>>u>>v;
r.push({v+dis[s[u]]-1, s[u], ++b[s[u]]});
r.push({u+dis[s[v]]-1, s[v], ++b[s[v]]});
while(!r.empty()&&r.top().d!=b[r.top().p]){
r.pop();
}
cout<<r.top().l<<endl;
swap(s[u],s[v]);
}
return 0;
}