NC16541 [NOIP2013]车站分级
题目
题目描述
一条单向的铁路线上,依次有编号为1, 2, …, n 的n 个火车站。每个火车站都有一个级别,最低为1 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站x,则始发站、终点站之间所有级别大于等于火车站x 的都必须停靠。(注意:起始站和终点站自然也算作事先已知需要停靠的站点)
例如,下表是5 趟车次的运行情况。其中,前4 趟车次均满足要求,而第5 趟车次由于停靠了3 号火车站(2 级)却未停靠途经的6 号火车站(亦为2 级)而不满足要求。
| 车站编号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 车次/车站级别 | 3 | 1 | 2 | 1 | 3 | 2 | 1 | 1 | 3 | ||||||||
| 1 | 始 | → | → | → | 停 | → | → | → | 停 | → | 终 | ||||||
| 2 | 始 | → | → | → | 停 | → | 终 | ||||||||||
| 3 | 始 | → | → | → | → | → | → | → | 停 | → | → | → | → | → | → | → | 终 |
| 4 | 始 | → | 停 | → | 停 | → | 停 | → | 停 | → | 终 | ||||||
| 5 | 始 | → | → | → | 停 | → | → | → | → | → | → | → | 终 |
输入描述
第一行包含2个正整数n,m,用一个空格隔开。
第 i + 1 行(1 ≤ i ≤ m)中,首先是一个正整数 si(2 ≤ si ≤ n),表示第 i 趟车次有 si 个停靠站;接下来有si 个正整数,表示所有停靠站的编号,从小到大排列。
每两个数之间用一个空格隔开。输入保证所有的车次都满足要求。
输出描述
输出只有一行,包含一个正整数,即n个火车站最少划分的级别数。
示例1
输入
9 2
4 1 3 5 6
3 3 5 6
输出
2
示例2
输入
9 3
4 1 3 5 6
3 3 5 6
3 1 5 9
输出
3
备注
对于20%的数据,1 ≤n,m ≤10;
对于50%的数据,1 ≤n,m≤100;
对于100%的数据,1 ≤n,m ≤ 1000。
题解
知识点:图论建模,拓扑排序。
容易知道一条线路范围内的所有车站的级别关系,停靠站级别一定大于不停靠站。因此可以用一个虚拟点来模拟每条线路得到站点的大小关系,级别大的建一条边指向这个点,级别小的从这个点出发建一条边指向自己。用这个图拓扑排序,求排序的最大深度,即站点需要分为几个级别。需要注意的是,每层中间夹着虚拟点,如果深度从 \(0\) 开始计算,那么最后实际深度应该是 \(\lfloor \frac{dep}{2} \rfloor + 1\) 。
时间复杂度 \(O(n+m+\sum s_i)\)
空间复杂度 \(O(n+m+\sum s_i)\)
代码
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N = 1007 << 1, M = 1007 * 1007;
int n, m;
struct edge {
int v, nxt;
}e[M];
int h[N], idx;
void add(int u, int v) {
e[++idx] = { v,h[u] };
h[u] = idx;
}
int deg[N], dep[N];
queue<int> q;
void toposort() {
for (int i = 1;i <= n + m;i++) if (!deg[i]) q.push(i), dep[i] = 0;
while (!q.empty()) {
int u = q.front();
q.pop();
for (int i = h[u];i;i = e[i].nxt) {
int v = e[i].v;
dep[v] = dep[u] + 1;
deg[v]--;
if (!deg[v]) q.push(v);
}
}
}
int main() {
std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1;i <= m;i++) {
int s;
cin >> s;
vector<int> vis;
for (int j = 1;j <= s;j++) {
int u;
cin >> u;
vis.push_back(u);
}
for (int j = vis.front(), k = 0;j <= vis.back();j++) {
if (j == vis[k]) {
add(n + i, j);
deg[j]++;
k++;
}
else {
add(j, n + i);
deg[n + i]++;
}
}
}
toposort();
cout << *max_element(dep + 1, dep + n + m + 1) / 2 + 1 << '\n';///每个级别夹着一个站点,且深度从0计算
return 0;
}
NC16541 [NOIP2013]车站分级的更多相关文章
- NOIp2013 车站分级 【拓扑排序】By cellur925
题目传送门 我们注意到,题目中说:如果这趟车次停靠了火车站 x,则始发站.终点站之间所有级别大于等于火车站x的都必须停靠.有阶级关系,满满的拓扑排序氛围.但是,如果我们按大于等于的关系连,等于的情况就 ...
- [NOIP2013]车站分级 解题报告
妈蛋这道普及组水(神)题搞了我非常久. 一. 首先一个非常显然的事情就是每一个火车告诉了站与站之间的等级关系,所以拓扑求最长路. 可是发现暴力建边的话最坏能够达到500*500,所以时间复杂度有O(M ...
- noip2013 车站分级
题目描述 一条单向的铁路线上,依次有编号为 1, 2, …, n1,2,…,n的 nn个火车站.每个火车站都有一个级别,最低为 11 级.现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟 ...
- 题解【洛谷P1983】[NOIP2013]车站分级
题面 题解 不难想到拓扑排序 于是每一个等级高的向等级低的连一条边 考虑拓扑排序过程中的分层 对于每个点进行分层 于是答案就是这些点中的最大层数 然后就会RE 发现我们多连了一些重复的边 用一个标记数 ...
- 【NOIP2013 普及组】车站分级
[NOIP2013 普及组]车站分级 一.题目 [NOIP2013 普及组]车站分级 时间限制: 1 Sec 内存限制: 128 MB 提交: 3 解决: 0 [提交][状态][讨论版] 题目描述 ...
- 洛谷P1983 车站分级
P1983 车站分级 297通过 1.1K提交 题目提供者该用户不存在 标签图论贪心NOIp普及组2013 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 求帮忙指出问题! 我这么和(diao ...
- 【洛谷P1983】车站分级
车站分级 题目链接 首先,可以发现火车停靠站点的大小是没有什么规律的, 火车可以停靠在级别<=当前级别的站点,必须停靠在级别>=当前最高级别的站点 但是所有没有被停靠的站点级别一定比所有被 ...
- 洛谷P1983车站分级
洛谷\(P1983\)车站分级(拓扑排序) 目录 题目描述 题目分析 思路分析 代码实现 题目描述 题目在洛谷\(P1983\)上 题目: 一条单向的铁路线上,依次有编号为 \(1, 2, -, ...
- LG1983 「NOIP2013」车站分级 拓扑排序
问题描述 LG1983 题解 考虑建立有向边\((a,b)\),代表\(a\)比\(b\)低级. 于是枚举每一辆车次经过的车站\(x \in [l,r]\),如果不是车辆停靠的车站,则从\(x\)向每 ...
- [NOIp2013普及组]车站分级
思路: 对于每一趟车,将区间内所有经停的站和所有未经停的站连一条边,表示前者优先级一定高于后者,然后用Kahn跑一遍拓扑排序即可.然而这样会创造大量多余的边,会TLE1个点.考虑一种优化:因为每趟车本 ...
随机推荐
- docker 安装 nacos
转载请注明出处: https://www.jianshu.com/p/54f6da71ac48
- @Configuration 注解使用及源码解析
本文为博主原创,转载请注明出处: @Configuration 注解对我们来说并不陌生,以javaConfig的方式定义spring IOC容器的配置类使用的就是这个@Configuration. s ...
- AHB 局限性
AHB's problem SoC bus 架构 AXI is used more and more 频率200M使用AHB,频率再升高就使用AXI AHB的问题 AHB协议本身限制要求较高,比如co ...
- 【C/C++】 变参函数
#include <stdio.h> #include <stdbool.h> #include <stdarg.h> #define MLA_ASSERT(exp ...
- 云服务器搭建自己的GitServer!
云服务器搭建自己的GitServer! 如果你有一台云服务器并想在上面搭建自己的 Git 服务器,你可以使用 Git 自带的 git-shell ,也可以使用像 Gitea.GitLab.Gogs 这 ...
- [转帖]快速入门:在 Red Hat 上安装 SQL Server 并创建数据库
https://learn.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-red-hat?view=sql-server-linux ...
- [转帖]Kafka-LEO和HW概念及更新流程
https://www.cnblogs.com/youngchaolin/p/12641463.html 目录 LEO&HW基本概念 LEO&HW更新流程 LEO HW 更新流程示例分 ...
- 【转帖】32.MinorGC、MajorGC和FullGC的对比
目录 1.MinorGC.MajorGC和FullGC的对比 2.GC触发机制 1.MinorGC.MajorGC和FullGC的对比 1.JVM在进行GC的时候,并不是每次都是对新生代.老年代.永久 ...
- [转帖]Redis各版本特性汇总
redis4 redis5 redis6 redis6.2 重大特性 1.模块系统 2.PSYNC2 3.LFU淘汰策略 4.混合RDB-AOF持久化 5.LAZY FREE延迟释放 6.MEMORY ...
- [转帖]用实力诠释细节!“Java性能调优六大工具”之JDK命令行工具
https://www.zhihu.com/people/javajia-gou-ji-zhu-44/posts JDK命令行工具 在JDK的开发包中,除了大家熟知的java.exe和javac. ...