CODEVS3294 车站分级 noip普及组T4

题目描述 Description

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

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

思路: 本来是想通过普及组的水题找自信的,但是浪费了我两个小时。。。真是醉了。。。看完题后,想到了拓扑排序,将这一趟火车始发站和终点站中没有出现的站点向出现的站点连一条有向边,拓扑排序查出有几层就可以了。但是,这里有一个问题,就是o(mn^2)的读入,和较大的计算量,于是就将读入稍稍减小了一些循环范围,达到最差o(mn^2/4)的读入复杂度。在拓扑排序中,也有一个小小的优化,每一层的入度为0的点都是又上一层删边时产生的,所以在删边的时候就可以将点加入到下一层中去,减少时间复杂度。

code:

#include<iostream>

#include<cstdio>

#include<cstring>

using namespace std;

struct use{

int num[1001],l;

}uc,ucc;

bool map[1001][1001]={false};

int r[1001]={0},bian[1001][1001]={0};

void work()

{

int tot=0,n,m,i,j,k,q,x,ans=0;

scanf("%d%d",&n,&m);

for (i=1;i<=m;++i)

{

scanf("%d",&q);

uc.l=q;ucc.l=0;

scanf("%d",&uc.num[1]);

for (j=2;j<=q;++j)

{

scanf("%d",&uc.num[j]);

for (k=uc.num[j-1]+1;k<uc.num[j];++k)

{

++ucc.l;ucc.num[ucc.l]=k;

}

}

for (j=1;j<=uc.l;++j)

for (k=1;k<=ucc.l;++k)

{

if (!map[ucc.num[k]][uc.num[j]])

{

map[ucc.num[k]][uc.num[j]]=true;

++bian[ucc.num[k]][0];

bian[ucc.num[k]][bian[ucc.num[k]][0]]=uc.num[j];

++r[uc.num[j]];

}

}

}

uc.l=0;

for (i=1;i<=n;++i)

if (r[i]==0)

{

++uc.l;

uc.num[uc.l]=i;

}

tot=uc.l;

ans=1;

while (tot<n)

{

ucc.l=0;

for (i=1;i<=uc.l;++i)

for (j=1;j<=bian[uc.num[i]][0];++j)

{

--r[bian[uc.num[i]][j]];

if (r[bian[uc.num[i]][j]]==0)

{

++ucc.l;

ucc.num[ucc.l]=bian[uc.num[i]][j];

}

}

uc=ucc;

tot=tot+uc.l;

++ans;

}

cout<<ans<<endl;

}

int main()

{

work();

}

时间: 2024-10-11 04:52:24

CODEVS3294 车站分级 noip普及组T4的相关文章

NOIP 普及组 T4 子矩阵(--洛谷P2258)

题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素得到一个2*3的子矩阵如右图所示. 9 3 3 3 9 9 4 8 7 4 1 7 4 6 6 6 8 5 6 9 7 4 5 6 1 的其中一个2*3的子矩阵是 4 7 4 8 6 9 相邻的元素:矩阵中的某个元素与其上下左右四个元素(如果存在的话)是相邻的. 矩阵的分值:矩阵中每一对相邻元素之差

纪中10日T1 2300. 【noip普及组第一题】模板题

2300. [noip普及组第一题]模板题 (File IO): input:template.in output:template.out 时间限制: 1000 ms  空间限制: 262144 KB  具体限制 题目描述 输入 输出 样例输入 样例输出 数据范围限制 朴素算法 考试开始的前一个小时我一直在折腾朴素算法 -> 对拍 1 #pragma GCC optimize(2) 2 #include<bits/stdc++.h> 3 #define IL inline 4 usin

NOIP普及组2015 T1金币

我对模拟的理解:http://www.cnblogs.com/AKMer/p/9064018.html 题目链接:https://www.luogu.org/problemnew/show/P2669 这是我OI生涯中第一场比赛的第一道题目,而且这题在2015的普及组之前我就做过了(当时教练说NOIP会从NOI题库里选原题就狂刷了一通emmm).只需根据它的题意模拟按阶段发金币,然后特判最后一个阶段是否会全部发完就可以了,水的不能再水.代码如下: 1 #include <cstdio> 2 #

NOIP2008 普及组T4 立体图 解题报告-S.B.S.(施工未完成)

题目描述 小渊是个聪明的孩子,他经常会给周围的小朋友们将写自己认为有趣的内容.最近,他准备给小朋友们讲解立体图,请你帮他画出立体图. 小渊有一块面积为m*n的矩形区域,上面有m*n个边长为1的格子,每个格子上堆了一些同样大小的积木(积木的长宽高都是1),小渊想请你打印出这些格子的立体图.我们定义每个积木为如下格式,并且不会做任何翻转旋转,只会严格以这一种形式摆放: 每个顶点用1个加号’+’表示,长用3个”-”表示,宽用1个”/”,高用两个”|”表示.字符’+’,”-”,”/”,”|”的ASCII

车站分级 (2013noip普及组T4)(树形DP)

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

[Noip 2009 普及组 T4] [Luogu P1070] 道路游戏

一道很迷的\(dp\). 感谢大爱无疆的sy 开始的时候采用的二维状态但是并不对) 然后把状态改成一维\(AC\) \(Solution\): 状态:开始想的是\(f[i][j]\),表示到达\(i\)时间时在\(j\)点处的最多金币数. 转移方程设置为:\(f[i][j]=max\{f[i-1][j-k]+sum-val[j-k]\}\)其中\(sum\)表示从\(j-k\)走到\(j\)所赚的金币数 但这样是不对的,因为题目中: 也就是上一个机器人消失的地方并不一定要买下一个机器人,而是可以

【基础练习】【拓扑排序】codevs3294 车站分级题解

题目来源:NOIP2013 普及第四题 题目描写叙述 Description 一条单向的铁路线上,依次有编号为1, 2, -, n的n个火车站.每一个火车站都有一个级别,最低为1级.现有若干趟车次在这条线路上行驶.每一趟都满足例如以下要求:假设这趟车次停靠了火车站x.则始发站.终点站之间全部级别大于等于火车站x的都必须停靠. (注意:起始站和终点站自然也算作事先已知须要停靠的网站) 比如,下表是5趟车次的执行情况.当中.前4趟车次均满足要求,而第5趟车次因为停靠了3号火车站(2级)却未停靠途经的

noip普及组2007 纪念品分组

纪念品分组 描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. [限制] 50%的数据满足: 1 <=n <= 15 100%的数据满足: 1 <= n <= 30

纪念品分组NOIp普及组2007

题目描述 元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作.为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数.为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少. 你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目. 输入输出格式 输入格式: 输入文件group.in包含n+2行: 第1行包括一个整数w,为每组纪念品价格之和的上上限. 第