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个点.考虑一种优化:因为每趟车本 ...
随机推荐
- VUEX 使用学习六 : modules
转载请注明出处: 当Store中存放了非常多非常大的共享数据对象时,应用会变的非常的复杂,Store对象也会非常臃肿,所以Vuex提供了一个Module模块来分隔Store.通过对Vuex中的Stor ...
- SV 数据类型
system verilog可以用于设计也可以进行验证 语法规则 SV新数据类型 SV数据类型 bit - 0-255 byte - -127 - 128 # 快速进行sv文件仿真 VCS -R -s ...
- redis-持久化-RDB-AOF.png
- [转帖]TLB缓存是个神马鬼,如何查看TLB miss?
https://zhuanlan.zhihu.com/p/79607142 介绍TLB之前,我们先来回顾一个操作系统里的基本概念,虚拟内存. 虚拟内存 在用户的视角里,每个进程都有自己独立的地址空间, ...
- [转帖]CentOS-7-x86_64-DVD-2009 rpm包列表(centos7.9)
https://www.cnblogs.com/hiyang/p/14803391.html 文件数 4071 个,共3.8G 复制389-ds-base-1.3.10.2-6.el7.x86_64. ...
- [转帖]linux中Shell日期转为时间戳的方法
http://www.nndssk.com/xtwt/169617hFPRvq.html shell中获取时间戳的方式为:date -d "$currentTime" +%s $ ...
- [转帖]strace 命令详解
目录 1.strace是什么? 2.strace能做什么? 3.strace怎么用? 4.strace问题定位案例 4.1.定位进程异常退出 4.2.定位共享内存异常 4.3. 性能分析 5.总结 1 ...
- [转帖]010 Linux 文本统计与去重 (wc 和 uniq)
https://my.oschina.net/u/3113381/blog/5427461 wc 命令一般是作为组合命令的一员与其他命令一同起到统计的作用.而一般情况下使用 wc -l 命令较多. u ...
- docker hub arm64v8/postgres
arm64v8/postgres https://hub.docker.com/r/arm64v8/postgres By arm64v8 • Updated 4 days ago The Postg ...
- Nginx被它打败了?
Nginx被它打败了? 我们经常使用Nginx作为我们系统的代理,通常情况下是完全够用的,但是有时候业务的复杂性,我们也需要使用在网关中去代理中做一些业务,这个时候Nginx也可以使用lua脚本扩展, ...