描述

一条单向的铁路线上,依次有编号为 1, 2, ..., n 的 n 个火车站。每个火车站都有一个级别,最低为 1 级。现有若干趟车次在这条线路上行驶,每一趟都满足如下要求:如果这趟车次停靠了火车站 x,则始发站、终点站之间所有级别大于等于火车站 x 的都必须停靠。
(注意:起始站和终点站自然也算作事先已知需要停靠的站点)
例如,下表是 5 趟车次的运行情况。其中,前 4 趟车次均满足要求,而第 5 趟车次由于停靠了 3 号火车站(2 级)却未停靠途经的 6 号火车站(亦为 2 级)而不满足要求。

现有 m 趟车次的运行情况(全部满足要求),试推算这 n 个火车站至少分为几个不同的级别。

格式

输入格式

第一行包含 2 个正整数 n, m,用一个空格隔开。
第 i + 1 行(1 ≤ i ≤ m)中,首先是一个正整数 s i (2 ≤ s i ≤ n),表示第 i 趟车次有 s i 个停靠站;接下来有 s i 个正整数,表示所有停靠站的编号,从小到大排列。每两个数之间用一个空格隔开。输入保证所有的车次都满足要求。

输出格式

输出只有一行,包含一个正整数,即 n 个火车站最少划分的级别数。

样例1

样例输入1

9 2
4 1 3 5 6
3 3 5 6

样例输出1

2

样例2

样例输入2

9 3
4 1 3 5 6
3 3 5 6
3 1 5 9

样例输出2

3

限制

每个测试点1s。

提示

对于 20%的数据,1 ≤ n, m ≤ 10;
对于 50%的数据,1 ≤ n, m ≤ 100;
对于 100%的数据,1 ≤ n, m ≤ 1000

来源

NOIP 2013 普及组


  题目大意 (题目很简洁,不需(会)要(写)大意)

  显然拓扑排序。(哪来那么多显然?)

  这是一个拓扑排序比较基本的应用吧。

  现在考虑如何建图,首先确定节点u连向节点v的一条有向边表示什么,表示v比u的等级高(严格大于)。

  那么拓扑排序进行了多少层就是答案了。

  因为从起点到终点间停靠的站的等级大于等于这两个站,所以不确定,不能连边,但是,中间没有停靠的站一定比这些停靠了的站等级低,故这中间所有没有停靠的站,向所有停靠了的站连1条有向边。

  然而这样很遗憾的是,理论上O(n3)是会TLE,所以我们需要一些黑科技优化。(但实际上,普及组的数据比较水。。。所以可以过)

  我们直接考虑点i会向哪些点连边。首先我们需要枚举所有航线,如果这个点在它的起点和终点间,并且没有停靠,我们就需要向这些停靠的点连边。这个实质上是将一些需要连边的顶点集合取并,所以考虑bitset黑科技优化,来代替暴力连边。

  因此总时间复杂度成功降为。就算是ccf老年机卡一卡就过去了。

  (这里不得不吐槽一下洛谷的评测鸡真的是ccf老年机标配,洛谷上跑bitset优化后的程序和在vijos和codevs上跑n3大暴力的时间差不多,不过记事本一遍A真地很开心,一个编译错误都没有)

Code

 /**
* luogu
* Problem#1983
* Accepted
* Time: 764ms
* Memory: 12132k
*/
#include <bits/stdc++.h>
using namespace std;
#define smax(a, b) a = max(a, b) int n, m;
bitset<> *g;
bitset<> *stop;
int *ss, *st; inline void init() {
scanf("%d%d", &n, &m);
g = new bitset<>[(n + )];
stop = new bitset<>[(m + )];
ss = new int[(m + )];
st = new int[(m + )];
for(int i = , c, t; i <= m; i++) {
scanf("%d%d", &c, &ss[i]);
c -= ;
stop[i][ss[i]] = ;
while(c--) {
scanf("%d", &t);
stop[i][t] = ;
}
scanf("%d", st + i);
stop[i][st[i]] = ;
}
} int *dag;
int *dep;
queue<int> que;
inline void topu() {
for(int i = ; i <= n; i++)
if(!dag[i])
que.push(i), dep[i] = ; while(!que.empty()) {
int e = que.front();
que.pop();
for(int i = ; i <= n; i++) {
if(!g[e][i]) continue;
dag[i]--, smax(dep[i], dep[e] + );
if(!dag[i]) que.push(i);
}
}
} inline void solve() {
dag = new int[(n + )];
dep = new int[(n + )];
memset(dag, , sizeof(int) * (n + ));
memset(dep, , sizeof(int) * (n + ));
for(int i = ; i <= n; i++) {
for(int j = ; j <= m; j++)
if(i >= ss[j] && i <= st[j] && !stop[j][i])
g[i] |= stop[j];
for(int j = ; j <= n; j++)
if(g[i][j])
dag[j]++;
}
topu();
int res = ;
for(int i = ; i <= n; i++)
smax(res, dep[i]);
printf("%d\n", res);
} int main() {
init();
solve();
return ;
}

NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset的更多相关文章

  1. [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)

    [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...

  2. [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...

  3. noip车站分级 拓扑排序

    题目传送门 这道题呢 每次输入一段数就把1~n里面没有在这组数里面的数和他们连一波 表示这些数比他们等级低 然后就搞一搞就好了哇 #include<cstdio> #include< ...

  4. 【Luogu】P2805植物大战僵尸(拓扑排序+最大流)

    题目链接 这题数据xie强qwq.拓扑用的那个图建反了得80. 一眼看出(个屁,题解上都说一眼看出,然而我还是太蒻了)这是个最大权闭合图.从被保护植物向保护植物连边,然后跑最大流,用正点权和减去. 哦 ...

  5. 【Luogu】P3116会议时间(拓扑排序,DP)

    题目链接 本题使用拓扑排序来规划DP顺序.设s[i][j]表示i步是否能走到j这个点,e[i][j]表示i步是否能走到j这个点——用第二条路径.因为要满足无后效性和正确性,只有第i个点已经全部更新完毕 ...

  6. 洛谷P1983 车站分级

    P1983 车站分级 297通过 1.1K提交 题目提供者该用户不存在 标签图论贪心NOIp普及组2013 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 求帮忙指出问题! 我这么和(diao ...

  7. 洛谷 P1983 车站分级

    题目链接 https://www.luogu.org/problemnew/show/P1983 题目描述 一条单向的铁路线上,依次有编号为 1,2,…,n的 n个火车站.每个火车站都有一个级别,最低 ...

  8. 【洛谷P1983】车站分级

    车站分级 题目链接 首先,可以发现火车停靠站点的大小是没有什么规律的, 火车可以停靠在级别<=当前级别的站点,必须停靠在级别>=当前最高级别的站点 但是所有没有被停靠的站点级别一定比所有被 ...

  9. 【NOIP2013 普及组】车站分级

    [NOIP2013 普及组]车站分级 一.题目 [NOIP2013 普及组]车站分级 时间限制: 1 Sec  内存限制: 128 MB 提交: 3  解决: 0 [提交][状态][讨论版] 题目描述 ...

随机推荐

  1. cocos2d-x 错误异常抛出捕获和崩溃拦截

    Error对象 一旦代码解析或运行时发生错误,JavaScript引擎就会自动产生并抛出一个Error对象的实例,然后整个程序就中断在发生错误的地方. Error对象的实例有三个最基本的属性: nam ...

  2. LeetCode35.搜索插入位置

    给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会被按顺序插入的位置. 你可以假设数组中无重复元素. 示例 1: 输入: [1,3,5,6], 5 输 ...

  3. activity bj draw 流程图

  4. 参数化define

    SV中的define,可以是对var类型,也可以是对function类型的,或者其他任何可以直接替换的字符. `define  wordsize   8 应用 logic [1 :·wordsize] ...

  5. Rpgmakermv(7) Chronus插件介绍翻译

    协议:MIT 作用:时间,有时间推进,可以设置速度,随着游戏中时间的推进,会发生昼夜改变和天气变化. ------------------------------------------------- ...

  6. JavaScript(六):错误处理机制

    1.Error()构造函数 javascript解析或执行语句时,一旦发生错误,js引擎会将其抛出! JavaScript原生提供了Error()构造函数,所有抛出的错误都是这个构造函数的实例(即对象 ...

  7. RPC框架小结

    为什么说要搞定微服务架构,先搞定RPC框架? 1. 为什么说要搞定微服务架构,先搞定RPC框架? 如果没有统一的服务框架,RPC框架,各个团队的服务提供方就需要各自实现一套序列化.反序列化.网络框架. ...

  8. maven 入门 (一)

    纠结了好久,到底要不要写一份maven入门的所谓“教程”,有好几次想写一下,但是都放弃了,因为网上的太多了,而且都很好,但是现在决定了,还是要写出来,因为者有我自己的理解.所以我想写一份教程出来. 首 ...

  9. Porsche Piwis Tester 2 Online Coding Guide

    Porsche Piwis online programming account service is piwis porsche subscription and piwis tester 2 on ...

  10. 需求中碰到的简单Map集合 key相同合并 value的思路

    从两个接口获取到了数据Map集合, 但是要展示到同一页面 根据了播控人为key 将两个返回的进行遍历 将他们存在新的map里面 只有单个key value 就存为(MAP<object,obje ...