Codeforces 1136D Nastya Is Buying Lunch (贪心)

题意:

给一个序列和一组交换序列(a,b),当且仅当a在b的前面(不允许有间隔),这两个数才能交换,问最后一个数最多能移动多少个位置。

 

分析: 这题是思路是十分的巧妙呀 , 用一个数组num[x]  表示在x的后面有什么是可以于他交换的数 , 注意核心来了: 如果这个数目等于x的位置到目标位置id , 则目标可以向前进行移动 ,秒呀

#include<bits/stdc++.h>
using namespace std ;
int a[300001];
vector<int>G[300001];
int num[300001];
int  main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1 ; i<=n ; i++)
    scanf("%d",&a[i]);

    for(int i=1 ; i<=m ; i++)
    {
        int u,v;
        scanf("%d%d",&u,&v);
        G[v].push_back(u);
    }

    for(int i=0 ; i<G[a[n]].size() ; i++)
    num[G[a[n]][i]]++;
    int ans=0;
    int id=n;
    for(int i=n-1 ; i>=1 ; i--)
    {
        if(num[a[i]]==id-i) {ans++; id--;}
        else
        {
            for(int j=0 ; j<G[a[i]].size() ; j++)
            num[G[a[i]][j]]++;
        }
    }
    printf("%d\n",ans);
    return 0;
}
View Code

 

posted @ 2019-03-18 20:28  shuai_hui  阅读(184)  评论(0编辑  收藏  举报