总之,存代码 = =
#include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; const int MAXN = 500000+10; const int MAXM = 500000+10; const int INF = 0x7ffffff; int seg[MAXN<<1]; void init(int l,int r,int x){ if(l == r){ seg[x] = INF; return; } int mid = (l+r)>>1; init(l,mid,x<<1); init(mid+1,r,x<<1|1); seg[x] = INF; } void upd(int l,int r,int x,int k,int v){ if(l == r){ if(l == k){ seg[x] = v; } return; } int mid = (l+r)>>1; if(k>= l && k <= mid){ upd(l,mid,x<<1,k,v); } if(k>mid && k<=r){ upd(mid+1,r,x<<1|1,k,v); } seg[x] = min(seg[x<<1],seg[x<<1|1]); } int quercy(int l,int r,int x,int L,int R){ if(l>=L && r<=R){ return seg[x]; } int mid = (l+r)>>1; int v = INF; if(mid >= L){ v = min(v,quercy(l,mid,x<<1,L,R)); } if(mid < R){ v = min(v,quercy(mid+1,r,x<<1|1,L,R)); } return v; } int n,m; int s[MAXM],t[MAXM]; int dp[MAXN]; void solve(){ init(1,n,1); fill(dp,dp+n+1,INF); dp[1] = 0; upd(1,n,1,1,0); for(int i=0; i<m; i++){ int v = min(dp[ t[i] ],quercy(1,n,1,s[i],t[i])+1); dp[t[i]] = v; upd(1,n,1,t[i],v); } printf("%d\n",dp[n]); } int main(){ // freopen("input.txt","r",stdin); while(~scanf("%d%d",&n,&m)){ for(int i = 0;i< m;i++){ scanf("%d%d",&s[i],&t[i]); } solve(); } return 0; }
时间: 2024-10-15 10:37:54