题意:
给一个序列和一组交换序列(a,b),当且仅当a在b的前面(不允许有间隔),这两个数才能交换,问最后一个数最多能移动多少个位置。
分析: 这题是思路是十分的巧妙呀 , 用一个数组num[x] 表示在x的后面有什么是可以于他交换的数 , 注意核心来了: 如果这个数目等于x的位置到目标位置id , 则目标可以向前进行移动 ,秒呀
#include<bits/stdc++.h> using namespace std ; int a[300001]; vector<int>G[300001]; int num[300001]; int main() { int n,m; scanf("%d%d",&n,&m); for(int i=1 ; i<=n ; i++) scanf("%d",&a[i]); for(int i=1 ; i<=m ; i++) { int u,v; scanf("%d%d",&u,&v); G[v].push_back(u); } for(int i=0 ; i<G[a[n]].size() ; i++) num[G[a[n]][i]]++; int ans=0; int id=n; for(int i=n-1 ; i>=1 ; i--) { if(num[a[i]]==id-i) {ans++; id--;} else { for(int j=0 ; j<G[a[i]].size() ; j++) num[G[a[i]][j]]++; } } printf("%d ",ans); return 0; }