地址:https://www.nowcoder.com/acm/contest/180/C
思路:这题要用O(n)的复杂度+读入优化才不会超时。
对于线段[L,R],将右端点标记,同时保存以点R为右端点的线段的最大左端点值Max[R]
由小到大遍历所有城市,同时用 l 表示已断开的城市的最大值,在遇到城市i被标记时,判断Max[R]与l的大小,
若Max[R]大于l,则说明还有路径没有断开,则++ans,l=i;否则说明所有的路径都已经断开了
Code :
#include<iostream>
using namespace std;
#define getchar() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1<<22, stdin), p1 == p2) ? EOF : *p1++)
char buf[(1 << 22)], *p1 = buf, *p2 = buf;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
const int MAX_N=1000005;
int n,m;
int Max[MAX_N],b[MAX_N];
int main()
{
n=read(); m=read();
int ans=0,u,v;
for(int i=0;i<m;++i)
{
u=read(); v=read();
b[v]=1;
Max[v]=max(Max[v],u);
}
int l=0;
for(int i=1;i<=n;++i)
if(b[i]&&Max[i]>=l){
l=i; ++ans;
}
printf("%d\n",ans);
return 0;
}