牛客练习赛26-C 城市规划

地址: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;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值