zoukankan      html  css  js  c++  java
  • 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;
            }
    }
    
  • 相关阅读:
    (转)ASP连接sql server实例解析
    (转)ASP与sql存储过程
    将博客搬至CSDN
    详细解析Java中抽象类和接口的区别
    蔬菜销售策划
    医学学习
    mlecms v2.2版权
    网页打印设置
    silverlight RadGridView总结系列(转载)
    silverlight RadGridView总结二(转载)
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754789.html
Copyright © 2011-2022 走看看