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

Codeforces-Round#546(Div.2)-D-Nastya Is Buying Lunch

CF1340F Nastya and CBS

CF1340B Nastya and Scoreboard

CF1340B Nastya and Scoreboard