列表

详情


NC17967. 城市规划

描述

小a的国家里有n个城市,其中第i和第i - 1个城市之间有无向道路连接,特殊的,第1个城市仅与第2个城市相连
为了减轻道路维护负担,城市规划局局长MXT给出了m个要求,他想让小a断开一些道路,使得任意1 ≤ i ≤ m ,城市xi不能到达城市yi
同时最小化断开道路的数量。

输入描述

第一行两个整数n, m,分别表示城市的数量和请求的数量
接下来m行,每行两个整数x,y,表示需要使得x不能到达y

输出描述

输出一个整数,表示最小断开桥的数量

示例1

输入:

4 2
1 3
2 4

输出:

1

说明:

可以断开(2, 3)城市之间的道路

示例2

输入:

4 3
1 3
2 4
1 2

输出:

2

说明:

可以断开(1, 2) (2, 3)之间的道路

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 428ms, 内存消耗: 8544K, 提交时间: 2018-09-07 19:21:14

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,x,y,mx[1000010],tmp,ans;

#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;
int read() {
    int tmp=0, fh=1; char c=getchar();
    while (c<'0'||c>'9') {if (c=='-') fh=-1; c=getchar();}
    while (c>='0'&&c<='9') tmp=tmp*10+c-48, c=getchar();
    return tmp*fh;
}
int main() {
    n=read(); m=read();
    for (int i=1;i<=m;i++) {
        x=read(); y=read()-1; mx[y]=max(mx[y],x);
    }
    for (int i=1;i<n;i++) if (mx[i]) {
        if (mx[i]>tmp) {
            ans++; tmp=i;
        }
    }
    printf("%d\n",ans);
    return 0;
}

C++11(clang++ 3.9) 解法, 执行用时: 477ms, 内存消耗: 8416K, 提交时间: 2020-03-26 21:13:58

#include<cstdio>
#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;
 } 
#define io read()
int l[1000001];
int main()
{
	const int n=io,m=io;
	for(int i=1,x,y;i<=m;++i)
	x=io,y=io,
	l[y]<x&&(l[y]=x);
	int las=0,cnt=0;
	for(int i=1;i<=n;++i)
	if(las<l[i])
	++cnt,las=i-1;
	printf("%d",cnt);
}

上一题