Problem - C - Codeforces
题意:
思路:
应该反思一下这么典的思路为什么会想不到
枚举区间,一个很经典的套路是,枚举 l,对 r 计数
对于一个l,r取这么多限制中离 l 最近的那个
Code:
#include <bits/stdc++.h>#define int long longusing i64 = long long;constexpr int N = 3e5 + 10;
constexpr int M = 3e5 + 10;
constexpr int P = 2e6;
constexpr i64 Inf = 1e18;
constexpr int mod = 1e9 + 7;
constexpr double eps = 1e-6;int n, m;
int a[N], pos[N], r[N];void solve() {std::cin >> n >> m;for (int i = 1; i <= n; i ++) {std::cin >> a[i];pos[a[i]] = i;r[i] = n;}for (int i = 1; i <= m; i ++) {int x, y;std::cin >> x >> y;if (pos[x] > pos[y]) std::swap(x, y);r[pos[x]] = std::min(pos[y] - 1, r[pos[x]]);}for (int i = n - 1; i >= 1; i --) {r[i] = std::min(r[i], r[i + 1]);}int ans = 0;for (int i = 1; i <= n; i ++) ans += r[i] - i + 1;std::cout << ans << "\n";
}
signed main() {std::ios::sync_with_stdio(false);std::cin.tie(nullptr);int t = 1;while (t--) {solve();}return 0;
}