[CF1136D] Nastya Is Buying Lunch - 贪心
Posted mollnn
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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]];
}
以上是关于[CF1136D] Nastya Is Buying Lunch - 贪心的主要内容,如果未能解决你的问题,请参考以下文章
CF992E Nastya and King-Shamans 解题报告