D. Nastya Is Buying Lunch

链接

[https://codeforces.com/contest/1136/problem/D]

题意

有N个人,a[i]表示第i个人的编号,m个二元组。
当前一个在后一个的前面一个位置时二者可以交换。
问最后一个人最多可以往前移多少?

分析

很好的一个贪心
必须明确一个东西
如果一个人目前的位置在pos处,那么如果后面有n-pos个人可以和他交换,那么他就肯定能和最后一个人交换。
当然这里的n-pos是除开某些已经和最后一个人交换了的人的。
如果可以交换,那就最后一个人往前移。否则就把该位置的前面能交换的人数加1

代码

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
int a[N];
int cn[N];
vector<int> ve[N];
int n,m;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	//freopen("in.txt","r",stdin);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	cin>>a[i];
	for(int i=1;i<=m;i++)
	{
		int x,y;
		cin>>x>>y;
		ve[y].push_back(x);
	}
	for(int i=0;i<ve[a[n]].size();i++)
	cn[ve[a[n]][i]]++;
	int ans=0;
	for(int i=n-1;i>=1;i--)
	{
		if(n-ans-i==cn[a[i]]) ans++;
		else for(int j=0;j<ve[a[i]].size();j++)
		cn[ve[a[i]][j]]++;
	}
	cout<<ans<<endl;
	return 0;
}
posted @ 2019-03-22 14:32  ChunhaoMo  阅读(159)  评论(0编辑  收藏  举报