【题解】
题意:给定一个长度为n的序列和m条关系u-v,表示u在v前面并且u可与v交换使得v往前移动一个位置。输出最后一个位置可以往前移动的最大距离ans。
思路:从最后一个位置开始,记录每个位置可被后边的调换位置的关系个数,如果关系个数num[i]加上原位置与最后一个位置已到达的位置n-ans相等,说明可调换,计数;否则使这个位置可调换的位置的关系个数++。
【代码】
#include<bits/stdc++.h>
using namespace std;
const int maxn=3e5+10;
vector <int> vec[maxn];
int num[maxn],a[maxn];
int main()
{
int n,m; scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
while(m--){
int u,v; scanf("%d%d",&u,&v);
vec[v].push_back(u);
}
int ans=0;
for(int i=0;i<vec[a[n]].size();i++)
num[vec[a[n]][i]]++;
for(int i=n-1;i>0;i--){
if(i+num[a[i]]==n-ans)
ans++;
else{
for(int j=0;j<vec[a[i]].size();j++)
num[vec[a[i]][j]]++;
}
}
printf("%d\n",ans);
return 0;
}