Codeforces Round #546 (Div. 2) D

  题意就是给1到n的一个排列,然后m对关系u,v。如果u在v的前面的话,u可以和v交换位置,问最后一个元素最多可以往前移多少位子?

  可以从最后一个元素前面一个位置一直扫到1位置,能交换则交换。要注意可能存在u-v,v-u  这样两对关系,如果我们已经使用了u-v关系了的话,  v-u关系就应该删除掉,不然就会成环,然后t。复杂度是o(n*log(m)),通过这题学到了算map[i]的复杂度,因为map的通过红黑树实现的,所以调用map[i]的值,就是在树里找i,最多找log(n)次(n是map容器里的元素个数),所以调用map[i]的复杂度是log(n)

#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+5;
map<int,bool>mp[maxn];
int a[maxn];
inline int read()

{

    int x=0,f=1; char ch=getchar();

    while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();}

    while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}

    return x*f;

}

int main()
{
    int n,m;
    n=read();m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    for(int i=1;i<=m;i++){int u,v;u=read();v=read();mp[u][v]=1;}
    int j=n-1,num=a[n];
    while(j>=1)
    {
        if(mp[a[j]][a[j+1]])
        {
            mp[a[j+1]][a[j]]=false;
            swap(a[j],a[j+1]);
            if(a[j]==num)
                j--;
            else
                j++;
        }
        else
            j--;
    }
    for(int i=1;i<=n;i++)
        if(a[i]==num)
        {
            printf("%d
",n-i);
            return 0;
        }
}
原文地址:https://www.cnblogs.com/eason9906/p/11754790.html