CF1136D Nastya Is Buying Lunch 贪心
Posted goto_1600
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1136D Nastya Is Buying Lunch 贪心相关的知识,希望对你有一定的参考价值。
link
题意:
给定n个人,m条边,对于一条u,v的边,如果u在v的位置的前面,那么可以交换u和v,最后问pos n 的这个人能往前换多少位置。
思路:
考虑从pos大的位置从前往后考虑,对于当前这个位置,如果不换肯定不是更优的,假设当前位置是x,对于x-1的数,在后面的序列,假设原来能访问后面的序列,但是不能访问x,那么不换就访问不了了。所以可以动态维护位置,维护位置的方式也很简单,对于他们的位置,交换一次更新一次。
代码:
// Problem: D. Nastya Is Buying Lunch
// Contest: Codeforces - Codeforces Round #546 (Div. 2)
// URL: https://codeforces.com/contest/1136/problem/D
// Memory Limit: 256 MB
// Time Limit: 2000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define x first
#define y second
typedef pair<int,int> pii;
const int N=500010;
int d[N];
vector<int>v[N];
int p[N];
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>p[i];
d[p[i]]=i;
}
for(int i=0;i<m;i++)
{
int x,y;
cin>>x>>y;
v[x].push_back(y);
}
for(int i=n-1;i>=1;i--)
{
sort(v[p[i]].begin(),v[p[i]].end(),[&](int a,int b)
{
return d[a]<d[b];
});
for(auto j:v[p[i]])
{
if(d[j]==d[p[i]]+1)
{
// cout<<p[i]<<" "<<j<<endl;
d[j]--;
d[p[i]]++;
}
}
}
cout<<n-d[p[n]]<<endl;
}
/**
* In every life we have some trouble
* When you worry you make it double
* Don't worry,be happy.
**/
以上是关于CF1136D Nastya Is Buying Lunch 贪心的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #546 (Div. 2)-D - Nastya Is Buying Lunch
Codeforces Round #546 (Div. 2) D. Nastya Is Buying Lunch