[CF1136D] Nastya Is Buying Lunch

Description

给定一个长度为 $ n $ 的 $ 1-n $ 的全排列,第 $ i $ 个数表示站在第 $ i $ 位的学生的编号
给定 $ m $ 对 $ (u,v) $,如果编号 $ u $ 的学生在编号 $ v $ 的学生前面一位,则可以将他们的位置互换,问最后一个学生能向前移动多少位

Solution

从右往左扫描所有位置,将每个位置上的人尽可能地向右换即可

#include <bits/stdc++.h>
using namespace std;

#define int long long
const int N = 1000005;

int n,m,p[N],d[N];
vector <int> g[N];

bool cmp(int u,int v) {
    return d[u]<d[v];
}

signed main() {
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>p[i], d[p[i]]=i;
    for(int i=1;i<=m;i++) {
        int x,y;
        cin>>x>>y;
        g[x].push_back(y);
    }
    for(int i=n-1;i>=1;--i) {
        int u=p[i];
        sort(g[u].begin(),g[u].end(),cmp);
        for(auto q:g[u]) {
            if(d[u]+1==d[q]) ++d[u],--d[q];
        }
    }
    cout<<n-d[p[n]];
}
原文地址:https://www.cnblogs.com/mollnn/p/12829592.html