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

Posted justdoa

tags:

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

这个题官方tag是贪心,其实我觉得有点牵强,还是算思维题吧,但是自己的菜是没得说的QAQ

做的时候能想到从后向前看,如果n-1能交换就交换,不能就看n-2,依次往前。

其实再深究就会发现,如果pi和pn的距离等于pi到pn之间(包括pn)与pi可交换的个数,那么pn一定可以前进。

例如:

5 2

3 1 5 4 2

5 2

5 4

这组中5的位置和2差距是2,且可与2,4两个交换,那么就可以使pn前进。

然后有一个地方需要考虑下,这个题会输入2 5这种交换,也就是说不能在输入的时候直接处理出来pi后面的可交换的个数

那么如果确定了pi没有成为那个被换到pn后面的数(比如例子中的4),那么4前面的pi在计算可交换个数时要考虑4。

#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#include <queue>
#include <set>
#include <map>
#include <stack>
#include <iomanip>
#include <string>

using namespace std;

const int maxn=300000+5;
int n,m,u,v;
vector<int> edge[maxn];
int arr[maxn],num[maxn];

int main(){
    scanf("%d%d",&n,&m);
    memset(num,0,sizeof(num));
    for(int i=1;i<=n;i++) scanf("%d",&arr[i]);
    for(int i=1;i<=m;i++){
        scanf("%d%d",&u,&v);
        edge[v].push_back(u);
    }
    for(int i=0;i<edge[arr[n]].size();i++)
        num[edge[arr[n]][i]]++;
    int pos=n;
    for(int i=n-1;i>=1;i--){
        if(pos-i==num[arr[i]]) pos--;
        else
            for(int j=0;j<edge[arr[i]].size();j++)
                num[edge[arr[i]][j]]++;
    }
    printf("%d
",n-pos);
    return 0;
}

  

以上是关于Codeforces-Round#546(Div.2)-D-Nastya Is Buying Lunch的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces-Round#569 Div.2

Codeforces-Round-#461-Div. 2-C

Codeforces-Round#547(Div.3)-C-Polycarp Restores Permutation

Codeforces Round #546 (Div. 2)

Codeforces Round #546 (Div. 2) C. Nastya Is Transposing Matrices

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