CodeForces - 652C Foe Pairs

思路:记录下来每一个数在序列里的位置,然后记录每一个位置向右最远能到达哪个位置

#include 
#include 

using namespace std;

typedef long long ll;
const int maxn = 3 * 1e5 + 10;
int a[maxn],pos[maxn],mx[maxn];

int main(void){
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i = 1; i <= n; i++){
		scanf("%d",&a[i]);
		pos[a[i]] = i;
		mx[i] = n;
	}
	for(int i = 1; i <= m; i++){
		int x,y;
		scanf("%d%d",&x,&y);
		int l = min(pos[x],pos[y]);
		int r = max(pos[x],pos[y]);
		mx[l] = min(mx[l],r - 1);
	}
	
	for(int i = n - 1; i >= 1; i--){
		mx[i] = min(mx[i],mx[i + 1]);
	}
	//printf("asd\n");
	ll ans = 0;
	for(int i = 1; i <= n; i++){
		ans += mx[i] - i + 1;
	}
	printf("%I64d\n",ans);
	return 0;
}

你可能感兴趣的:(ACM-基础算法+思维,ACM-动态规划)