Codeforces Round #546 (Div. 2) D 贪心 + 思维

Posted virtu0s0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #546 (Div. 2) D 贪心 + 思维相关的知识,希望对你有一定的参考价值。

https://codeforces.com/contest/1136/problem/D
贪心 + 思维

题意

你面前有一个队列,加上你有n个人(n<=3e5),有m(m<=个交换法则,假如u在v相邻前面,那么u和v可以交换位置,问你是队列最后一个人的时候你最前可以换到前面哪里

题解

  • 因为相邻才能换,所以最后一个换到前面一定是一步一步向前走,所以不存在还要向后走的情况
  • 设最后一个为u,假设前面有一个能和u换位置的集合,那么需要将这些点尽量往后移动去接u
  • 假设前面有一个不能和u换位置的集合S,那么u和S的顺序永远不会换过来
  • 从后向前遍历,对于每个点假设后面紧接着S+u,假如这个点能和S+u换位置,那么u可以向前移动一格,ans++
  • 假如不行,则将这个加入S
#include<bits/stdc++.h>

using namespace std;
int n,m,a[300005],u,v,i,ok,ans;
vector<int>A;set<pair<int,int> >vi;
int main(){
    cin>>n>>m;
    for(i=1;i<=n;i++)cin>>a[i];
    for(i=0;i<m;i++){
        cin>>u>>v;
        vi.insert(make_pair(u,v));
    }
    A.push_back(a[n]);
    for(i=n-1;i>=1;i--){
        ok=1;
        for(auto x:A){
            if(!vi.count(make_pair(a[i],x))){ok=0;break;}
        }
        if(ok)ans++;
        else A.push_back(a[i]);
    }
    cout<<ans;
}

以上是关于Codeforces Round #546 (Div. 2) D 贪心 + 思维的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #546 (Div. 2) D 贪心 + 思维

Codeforces Round #546 (Div. 2)-D - Nastya Is Buying Lunch

Codeforces Round #546 (Div. 2) D. Nastya Is Buying Lunch

Codeforces-Round#546(Div.2)-D-Nastya Is Buying Lunch

Nastya Hasn't Written a Legend(Codeforces Round #546 (Div. 2)E+线段树)

Codeforces Round #436 E. Fire(背包dp+输出路径)