NC106366(Minimizing maximizer )
思路
#include <algorithm> #include <bitset> #include <cctype> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <list> #include <map> #include <queue> #include <set> #include <stack> #include <string> #include <typeinfo> #include <vector> #define ls o << 1 #define rs o << 1 | 1 using namespace std; const int maxn = 5e5 + 10; const int inf = 5e5 + 10; int s[maxn], t[maxn]; int n, m; int cost[maxn << 2]; int dp[maxn];//dp[j] 表示从1号位转移到j号位的最小代价 void up(int o){ cost[o] = min(cost[ls], cost[rs]); } void build(int o, int l, int r){ if(l == r){ if(l == 1) dp[1] = cost[o] = 0; else dp[l] = cost[o] = inf; return ; } int mid = (l + r) / 2; build(ls, l, mid); build(rs, mid + 1, r); up(o); } void query(int o, int l, int r, int x, int y, int &ans){ if(l >= x && y >= r){ ans = min(ans, cost[o]); return ; } int mid = (l + r) / 2; if(mid >= x) query(ls, l, mid, x, y, ans); if(y > mid) query(rs, mid + 1, r, x, y, ans); } void update(int o, int l, int r, int k, int val){ if(l == r){ cost[o] = val; return ; } int mid = (l + r) / 2; if(mid >= k) update(ls, l, mid, k, val); else update(rs, mid + 1, r, k, val); up(o); } int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= m; i++){ scanf("%d%d", &s[i], &t[i]); } build(1, 1, n); for(int i = 1; i <= m; i++){ int j = t[i]; int val = inf; query(1, 1, n, s[i], t[i], val); if(val + 1 < dp[j]){ dp[j] = val + 1; update(1, 1, n, j, dp[j]); } } printf("%d\n", dp[n]); return 0; }