NOIP 车站分级 (luogu 1983 & codevs 3294 & vijos 1851) - 拓扑排序 - bitset
描述
一条单向的铁路线上,依次有编号为 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的更多相关文章
- [LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset)
[LOJ 3101] [Luogu 5332] [JSOI2019]精准预测(2-SAT+拓扑排序+bitset) 题面 题面较长,略 分析 首先,发现火星人只有死和活两种状态,考虑2-SAT 建图 ...
- [Luogu P3953] 逛公园 (最短路+拓扑排序+DP)
题面 传送门:https://www.luogu.org/problemnew/show/P3953 Solution 这是一道神题 首先,我们不妨想一下K=0,即求最短路方案数的部分分. 我们很容易 ...
- noip车站分级 拓扑排序
题目传送门 这道题呢 每次输入一段数就把1~n里面没有在这组数里面的数和他们连一波 表示这些数比他们等级低 然后就搞一搞就好了哇 #include<cstdio> #include< ...
- 【Luogu】P2805植物大战僵尸(拓扑排序+最大流)
题目链接 这题数据xie强qwq.拓扑用的那个图建反了得80. 一眼看出(个屁,题解上都说一眼看出,然而我还是太蒻了)这是个最大权闭合图.从被保护植物向保护植物连边,然后跑最大流,用正点权和减去. 哦 ...
- 【Luogu】P3116会议时间(拓扑排序,DP)
题目链接 本题使用拓扑排序来规划DP顺序.设s[i][j]表示i步是否能走到j这个点,e[i][j]表示i步是否能走到j这个点——用第二条路径.因为要满足无后效性和正确性,只有第i个点已经全部更新完毕 ...
- 洛谷P1983 车站分级
P1983 车站分级 297通过 1.1K提交 题目提供者该用户不存在 标签图论贪心NOIp普及组2013 难度普及/提高- 提交该题 讨论 题解 记录 最新讨论 求帮忙指出问题! 我这么和(diao ...
- 洛谷 P1983 车站分级
题目链接 https://www.luogu.org/problemnew/show/P1983 题目描述 一条单向的铁路线上,依次有编号为 1,2,…,n的 n个火车站.每个火车站都有一个级别,最低 ...
- 【洛谷P1983】车站分级
车站分级 题目链接 首先,可以发现火车停靠站点的大小是没有什么规律的, 火车可以停靠在级别<=当前级别的站点,必须停靠在级别>=当前最高级别的站点 但是所有没有被停靠的站点级别一定比所有被 ...
- 【NOIP2013 普及组】车站分级
[NOIP2013 普及组]车站分级 一.题目 [NOIP2013 普及组]车站分级 时间限制: 1 Sec 内存限制: 128 MB 提交: 3 解决: 0 [提交][状态][讨论版] 题目描述 ...
随机推荐
- 答案在哪里?action config/Interceptor/class/servlet
项目已提测,这两天我们都集中精力梳理外包团队给我司研发的这个三方支付系统的代码逻辑.今天下午爱琴海会议室,开发组里一同学分享他对支付结果回调的梳理成果. 支付结果回调的整体时序是:支付渠道方处理完用户 ...
- HttpClient超时设置setConnectionTimeout和setSoTimeout
http是基于TCP/IP进行通信的,tcp通过3次握手建立连接,并最终以4次挥手终止通信. 知乎上对三次握手和四次挥手有如下解释: 作者:知乎用户链接:https://www.zhihu.com/q ...
- mysql group_concat用法
MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔 ...
- 一个tomcat下,两个系统的jar包可以相互引用。
将道路挖占管理系统(rems)从交通设备设施系统(tms)中剥离出去以后,在本地调试的时候是在同一个Tomcat下启动的,上传文件成功. 然后部署到西安以后,分成两个tomcat以后,发现rems上传 ...
- UVAL 4728 Squares(旋转卡壳)
Squares [题目链接]Squares [题目类型]旋转卡壳 &题解: 听着算法名字,感觉挺难,仔细一看之后,发现其实很简单,就是依靠所构成三角行面积来快速的找对踵点,就可以省去很多的复杂 ...
- IntelliJ IDEA 2017.3/2018.1 激活
传统的License Server方式已经无法注册IntelliJ IDEA2017.3的版本了. http://idea.lanyus.com,这个网站有破解补丁和注册码两种方式,另外http:// ...
- Android -- 实现RecyclerView可拖拽Item
1,今天和大家一起实现RecyclerView可拖拽Item,主要是使用RecyclerView结合ItemTouchHelper来实现的,来看一下效果 2,看一下怎么实现的呢,很简单,只需要给rec ...
- <6>Cocos Creator调试
高手在于调试,下面来谈Cocos Creator调试! 1. 网页平台调试 调试常见的三种形式为调试打印.运行时报错与断点调试,这里主要利用编辑器"VS Code"与"C ...
- Python之words count
要求: 对文件单词进行统计,不区分大小写,并显示单词重复最多的十个单词 思路: 利用字典key,value的特性存单词及其重复的次数 每行进行特殊字符的处理,分离出被特殊字符包含的单词 def mak ...
- python中使用rabbitmq消息中间件
上周一直在研究zeromq,并且也实现了了zeromq在python和ruby之间的通信,但是如果是一个大型的企业级应用,对消息中间件的要求比较高,比如消息的持久化机制以及系统崩溃恢复等等需求,这个时 ...