| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
asddfasdfasd#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
#define int long long
const int MAX = 500050;
const int INF = 1e18;
int n,m;
int L[MAX],R[MAX];
int dp[50050];
const int stsize = 50050<<2;
int stmin[stsize];
int querymin(int v,int a,int b,int l,int r)
{
if(l <= a && r >= b) return stmin[v];
else if(!(l >= b || a >= r))
{
return min(querymin(2*v+1,a,(a+b)/2,l,r),querymin(2*v+2,(a+b)/2,b,l,r));
}
return INF;
}
void update(int v,int a,int b,int pos,int x)
{
if(b - a == 1) {
//cout<<'v'<<' '<<v<<' '<<a<<' '<<b<<endl;
stmin[v] = x; return ;
}
int mid = (a+b)/2;
if(pos >= mid) update(2*v+2,mid,b,pos,x);
else update(2*v+1,a,mid,pos,x);
stmin[v] = min(stmin[2*v+1],stmin[2*v+2]);
}
main()
{
fill(stmin,stmin+stsize,INF);
scanf("%lld%lld",&n,&m);
for(int i = 0;i < m;i++) scanf("%lld%lld",&L[i],&R[i]);
fill(dp,dp+50050,INF);dp[1] = 0;update(0,1,n+1,1,0);
for(int i = 0;i < m;i++)
{
dp[R[i]] = min(dp[R[i]],querymin(0,1,n+1,L[i],R[i]+1) + 1);
//cout<<R[i]<<dp[R[i]]<<endl;
update(0,1,n+1,R[i],dp[R[i]]);
}
cout<<dp[n]<<endl;
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator