CF1136D Nastya Is Buying Lunch
题意&思路:
有n个人排队,编号为a[i]的排在第i为,Nastya排在最后一位。给你一些可以交换的编号(x,y),当且仅当x排在y前面并且相邻的时候才可以交换位置。问Nastya最多向前移动多少位。
真的好菜,刚开始还看错题了,以为不相邻也能交换,纠结了很长时间。之后知道是贪心,却只有一点模糊的思路,又纠结了几个小时。然后看了大佬的思路才写完。
这个很巧妙的办法就是如果一个人x距离Nastya为l,并且他可以和后面交换l次,那Nastya一定可以到他的位置上。
代码:
#include<bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
const int N=5e5+10;
const int mod=1e7+9;
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
int a[N],vis[N]={0};
vector<int> b[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,m,i,j;
cin>>n>>m;
for(i=1;i<=n;i++)
cin>>a[i];
for(i=1;i<=m;i++)
{
int u,v;
cin>>u>>v;
b[u].push_back(v);
}
vis[a[n]]=1;
int ans=0;
for(i=n-1;i>=1;i--)
{
int tot=0;
for(j=0;j<b[a[i]].size();j++)
if(vis[b[a[i]][j]])
tot++;
if(tot+i+ans==n)
ans++;
else
vis[a[i]]=1;
}
cout<<ans<<endl;
return 0;
}