首页 > 其他分享 >洛谷P1983 [NOIP2013 普及组] 车站分级 题解

洛谷P1983 [NOIP2013 普及组] 车站分级 题解

时间:2024-08-18 21:26:18浏览次数:13  
标签:NOIP2013 int 题解 站点 车次 P1983 停靠 节点 等级

思路

由题可知,在一趟车次的区间内,停靠的站点的等级恒大于不停靠的站点。
因此,对于每一趟车次的区间,给所有停靠的站点向所有不停靠的站点两两连有向边,然后求图中最长的路径长度,就能得到答案。

实现

因为可能出现重边,而且\(n\le1000\),所以在处理车次连边的时候使用邻接矩阵,再改成邻接表。
之后将入度为0的节点的等级设置为1(其实应该反着来,这样分出来的等级更符合逻辑,但是我是正着来的),遍历整张图。对于每一个节点,其等级为指向它的节点度数的最大值+1,即$$\large level_v=max(u)+1,(u,v)\in E$$
考虑对图进行拓扑排序,然后递推。然后我悲催地发现我已经把拓扑排序忘光了

代码

#include <cstdio>
#include <cstring>
#define N 1005
#define max(x,y) ((x)>(y)?(x):(y))
int s[N];
int u[N];
int f[N][N];
struct node
{
	int lvl,in,out;
	int nx[N];
} a[N];
int a2[N];
int main()
{
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		a[i].lvl=1;
	for(int i=1;i<=m;i++)
	{
		memset(s,0,sizeof(s));
		int l;
		scanf("%d",&l);
		for(int j=1;j<=l;j++)
		{
			scanf("%d",&u[j]);
			s[u[j]]=1;
		}
		for(int j=u[1];j<=u[l];j++)
			if(!s[j])
				for(int k=1;k<=l;k++)
					f[u[k]][j]=1;
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(f[i][j])
			{
				a[i].nx[++a[i].out]=j;
				a[j].in++;
			}
	int cnt=0;
	for(int i=1;i<=n;i++)
		if(!a[i].in)
			a2[++cnt]=i;
	for(int h=1,t=cnt;h<=t;h++)
		for(int k=1;k<=a[a2[h]].out;k++)
			if(!--a[a[a2[h]].nx[k]].in)
				a2[++t]=a[a2[h]].nx[k];
	for(int i=1;i<=n;i++)
	{
		int k=a2[i];
		for(int j=1;j<=a[k].out;j++)
			a[a[k].nx[j]].lvl=max(a[a[k].nx[j]].lvl,a[k].lvl+1);
	}
	int ans=0;
	for(int i=1;i<=n;i++)
		ans=max(ans,a[i].lvl);
	printf("%d",ans);
}

很冗杂凑合看吧

标签:NOIP2013,int,题解,站点,车次,P1983,停靠,节点,等级
From: https://www.cnblogs.com/neat-isaac/p/18366124

相关文章

  • P10660 BZOJ2759 一个动态树好题 题解
    从题目名字看出此题需要用动态树解决对于任意\(i\),都有唯一的\(p_i\)与之对应,由\(p_i\)向\(i\)连边,\(n\)种关系显然构成一基环树森林。对于环上的节点,一个点可以自己表示自己,所以可以直接解出该点的权值,其他点从环上的点直接推出即可。考虑如何动态维护这个过程,一个点上......
  • 洛谷P1001题解
    洛谷P1001题解友情提示:“题目传送门”被贴在了题目编号上,请自行点击查看!主要知识点C/C++语言框架基本数据类型的定义与使用cin/cout或scanf()/prinf()的使用代码一小步,OI一大步(bushi)AC代码#include<bits/stdc++.h>typedeflonglongll; //“十年OI一场空,不开long......
  • 题解:CF1630F Making It Bipartite
    题意图上有\(n\)个点,且具有点权,点权保证互不相同,若两个点点权有倍数关系,则两点之间有一边,问你最少删去多少个点能使图变为二分图。思路因为如果\(a\)是\(c\)的倍数且\(c\)是\(b\)的个数,所以\(a\)是\(c\)的倍数。由此可以看出,若\(a\)与\(b\)相连且\(b\)与......
  • 题解:CF1034B Little C Loves 3 II
    思路看到这道题时,第一思路就是网络流,结果一看数据\(10^{9}\)直接转向找规律。主要思路:神秘特判。首先,下面的结论基于\(n\lem\)。Case1.当\(n=1\)时,易得的是我们可以以\(6\)为循环节构造。Case2.当\(n=2\)时,我们可以构造出\(4a,5a,6a\)的形式。易得,通过裴蜀......
  • ABC 367 G 题解
    ABC367G神奇题目场上想到了引入多元生成函数之后就嗝屁了。定义两个多项式的运算\(A(z)*B(z)=\sum_{i}\sum_{j}z^{i\oplusj}a_ib_j\),也就是异或卷积。定义两个二元生成函数\(A(x,y)*B(x,y)=\sum_{i,p}\sum_{j,q}x^{i\oplusj}y^{p+q}a_{i,p}b_{j,q}\)我们仍然选用\(\prod......
  • 题解:AT_abc367_d [ABC367D] Pedometer
    首先肯定要单层循环枚举元素,然后想方法求出一个元素的所有答案。一开始我写了一个二分找\(m\)倍数的方法,发现\(m\)小的时候还不如暴力。于是联想到之前做过的一道题,可以借助于取模的前缀和数组。对于当前元素\(i\),如果一个元素之前的前缀和与\(i\)之前的前缀和对\(m\)......
  • Atcoder [ABC367F] Rearrange Query 题解
    简要题意给定两个长度为\(N\)的序列\(A\)和\(B\)。有\(Q\)个查询,每个查询给定\(l,r,L,R\),其中\(l\leqr,L\leqR\),要求判断\(A\)的第\(l\)项到第\(r\)项构成的集合与\(B\)的第\(L\)项到第\(R\)项构成的集合是否相等。题解显然两个相等的集合所有元素......
  • Atcoder [ABC367C] Enumerate Sequences 题解
    简要题意给定\(n,k\)和\(R_i\),你需要输出所有满足下列条件的整数序列:长度为\(n\)。第\(i\)个元素的范围为\([1,R_i]\)。一个序列的所有元素的总和为\(k\)的倍数。输出请按照按照从左至右按位从小到大的顺序输出。题解注意到数据范围很小,我们可以直接爆搜,这里用......
  • 【动态规划、dp】[CSP-J 2022] 上升点列 题解
    题目描述在一个二维平面内,给定nnn个整数点(xi......
  • 题解:AT_abc367_e [ABC367E] Permute K times
    题意给你一个长度为\(N\)的序列\(X\),其中每个元素都介于\(1\)和\(N\)之间(含),以及一个长度为\(N\)的序列\(A\)。打印在\(A\)上执行以下操作\(K\)次的结果。将\(A_i\)替换为\(A_{X_i}\)。每个操作同时进行。思路元素\(i\)经过\(k\)次变化后的值就是元素......