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