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;
}
上一篇:Elasticsearch基础概念


下一篇:luogu2577 午餐