490 likes | 669 Views
NOI 2008 Day1 解题报告. 河南省实验中学 郭家宝. CmYkRgB123 http://www.cmykrgb123.cn. 2009.3.6. 概述. NOI2008 第一试,于 2008 年 7 月 29 日在绍兴一中举行。这次比赛有三道题,分别为: 假面舞会 设计路线 志愿者招募. 假面舞会. CmYkRgB123 http://www.cmykrgb123.cn. 题意转述. 有 N 个人,分为了 k 类,由于戴上了面具,第 i 类只能看见第 i+1 类人,第 k (k>=3) 类可以看见第 1 类人。
E N D
NOI 2008 Day1 解题报告 河南省实验中学 郭家宝 CmYkRgB123 http://www.cmykrgb123.cn 2009.3.6
概述 • NOI2008第一试,于2008年7月29日在绍兴一中举行。这次比赛有三道题,分别为: • 假面舞会 • 设计路线 • 志愿者招募
假面舞会 CmYkRgB123 http://www.cmykrgb123.cn
题意转述 • 有N个人,分为了k类,由于戴上了面具,第i类只能看见第i+1类人,第k (k>=3)类可以看见第1类人。 • 给出人数N,以及部分关系,(a,b)表示第a个人可以看见第b个人。 • 求出最大可能和最小可能的类别数k ,或者判断给出的关系是有误的。
样例解释 • 【输入样例一】6 51 22 33 44 13 5 • 【输出样例一】4 4 1 2 3 6 4 5
样例解释 • 【输入样例二】3 31 22 12 3 • 【输出样例二】-1 -1 1 2 3
题目分析 • 如果一个人能够看见两个不同的人,那么这两个人所戴的面具种类一定相同,同样,如果一个人能被两个人看见,这两个人所戴的面具种类也一定相同。 • 我们把能够推断出的带相同面具的人称为一个类。
题目分析 • 图中可能会有多个连通分量,对于某个连通分量,如果把边的方向去掉,该连通分量中存在一个无向环,则称该连通分量为环结构,否则称为树结构。 • 可以发现,一个环结构的连通分量,逐步把一个类的所有顶点收缩为一个顶点,最终一定会剩下一个有向环。
题目分析 • 一个环结构的连通分量,最终有向环上顶点个数,就是该连通分量的最大类数,而且,最大类数的所有约数也都可以满足该连通分量的类数。 • 而树结构连通分量,有向树中的最长路径,就是该连通分量的最大类数。
参考算法 • 如果一个顶点向几个顶点有边,或者几个顶点向一个顶点有边,则称这几个顶点为等位顶点。 • 算法的基本思想就是收缩等位顶点。 1 2 1 2 1 2 收缩 收缩 3 4 4 4 5 5
题目分析 • 如果同时存在树结构和环结构的连通分量,树结构连通分量可以忽略。 • 如果存在多个环结构连通分量,它们类数的最大公约数可以就是满足这两个连通分量的最大类数,它们类数的最大公约数的大于等于3的最小公约数就是满足这两个连通分量的最小类数。 • 这样收缩出所有环,算出最大和最小公约数即可。
参考算法 • 如右图,我们通过收缩等位顶点找出它等价的环。 1 2 5 4 3 6 7 8
参考算法 • 我们首先发现5和6为等位顶点,收缩5,6。 1 2 5 4 3 6 7 8
参考算法 • 发现1,7为等位顶点,收缩1,7。 1 2 4 3 6 7 8
参考算法 • 发现2,8为等位顶点,收缩2,8。 1 2 4 3 6 8
参考算法 • 此时,已经没有等位顶点,剩下一个环。长度为5。 1 2 2 4 3 1 3 6 6 4
总结 • 这道题在NOI的选手中,平均分为17.5。不能算太难的题,只是需要冷静深入的分析。
设计路线 CmYkRgB123 http://www.cmykrgb123.cn
题意转述 • 某国有一个公路网,每个城市最多只和一个位于它东边的城市相连。 • 现要将其中一部分改造为铁路。每个城市都有大量的客流涌向首都,定义某个城市的“不便利值”为从该城市到首都至少要换乘汽车走过的公路条数。整个国家的“不便利值”为所有城市不便利值的最大值。
题意转述 • 请你设计改造方案,使得整个国家的“不便利值”最小,并求出满足“不便利值”最小的方案个数mod Q的值。
题目分析 • 首先,注意一个重要的条件“每个城市最多只和一个位于它东边的城市相连”,通过这个条件,必须能够明白这个国家的公路网其实是树(或森林)。 • 假设每个城市东边的城市就是它的父节点,恰好满足是树的条件。
题目分析 • 把城市1(首都)当作根节点问题可以被描述为: • 给定一个根节点为1的数要求在树中找到一些不相交的链,使得每个节点的不便利值的最大值最小,并求出满足条件的方案个数。一个节点的不便利值就是从该节点到根的路径上经过的非链边的条数。
参考算法 • 考虑第一问,求最小不便利值。 • 可以发现,只有节点个数至少为一个高度为k+1的满三叉树,才能使不便利值达到k。对于最大的数据N<=100000,也不过最多可能有10层满三叉树,最大达到的不便利值为9。
参考算法 • 于是可以从0开始枚举第一问的答案,计算方案数,直到方案数大于0。 • 解决第二问,需要用到树形动态规划。考虑每个子树根节点向下连边构造不相交链,它向下连边有3种可能,不连边,只连一条边,只连两条边。不可能连更多,否则就会出现相交的链,连两条边还必须满足它的父节点没有向它连边。
参考算法 • F[i,b]为以i为根的子树中,每个节点相对于子树的根最大不便利值不超过b,且子树根节点向下连两条边的方案个数。 • G[i,b]为以i为根的子树中,每个节点相对于子树的根最大不便利值不超过b,且子树根节点向下连一条边或不连边的方案个数。
参考算法 • 对于F[i,b] (b>0) • 当i有1个或0个子节点 • F[i,b]=0 • 当i有至少2个子节点 • F[i,b]=Σ(G[j,b]*G[k,b]*Π(F[l,b-1]+G[l,b-1])) (j,k,l为i的不同的子节点)
参考算法 • 对于G[i,b] (b>0) • 当i有0个子节点 • G[i,b]=1 • 当i有至少1个子节点 • G[i,b]=Σ(G[j,b]*Π(F[l,b-1]+G[l,b-1])) + Π(F[l,b-1]+G[l,b-1]) (j,l为i的不同的子节点)
参考算法 • 特殊地,当b为0时。对于F[i,b] • 当i有且只有2个子节点 • F[i,b]=G[j,b]*G[k,b] (j和k为i的不同的子节点) • 当i有多于或少于2个子节点 • F[i,b]=0
参考算法 • 对于G[i,b] • 当i没有子节点 • G[i,b]=1 • 当i有且只有1个子节点 • G[i,b]=G[j,b] (j为i的子节点) • 当i有多于1个子节点 • G[i,b]=0
参考算法 • 根据上述所有的方程,直接进行树形动态规划,时间复杂度为O(N^3*logN),可以拿到40~50分。 • 观察N的范围(N<=100000),要想全部通过,必须优化到O(N*logN),向着这个目标,开始着手优化。 • 具体优化方法请参考我的题解。
总结 • 这是NOI2008相对较简单的一道题了,NOI上有6位大牛拿到了满分,而且平均分高达21.122。 • 但是对于包括我在内的大多数人来说,做出这道题依然很不容易。
志愿者招募 CmYkRgB123 http://www.cmykrgb123.cn
题意转述 • 现有一项工程,需要N天完成,有M类志愿者愿意提供帮助。 • 工程第i天需要的人数至少为A。第i类志愿者愿意从第Si天工作到第Ti天,招募的费用为每人Ci。 • 请你设计一个招募方案,求出完成工程所需的招募费用的最小值。
题目分析 • 这道题正确的解法是构造网络,求网络最小费用最大流,但是模型隐藏得较深,不易想到。构造网络是该题的关键,以下面一个例子说明构图的方法和解释。
题目分析 • 例如一共需要4天,四天需要的人数依次是4,2,5,3。有5类志愿者,如下表所示:
题目分析 • 设雇佣第i类志愿者的人数为X[i],每个志愿者的费用为V[i],第j天雇佣的人数为P[j],则每天的雇佣人数应满足一个不等式,如上表所述,可以列出 • P[1] = X[1] + X[2] >= 4 • P[2] = X[1] + X[3] >= 2 • P[3] = X[3] + X[4] +X[5] >= 5 • P[4] = X[5] >= 3
题目分析 • 对于第i个不等式,添加辅助变量Y[i] (Y[i]>=0) ,可以使其变为等式 • P[1] = X[1] + X[2] - Y[1] = 4 • P[2] = X[1] + X[3] - Y[2] = 2 • P[3] = X[3] + X[4] +X[5] - Y[3] = 5 • P[4] = X[5] - Y[4] = 3
题目分析 • 在上述四个等式上下添加P[0]=0,P[5]=0,每次用下边的式子减去上边的式子,得出 • ① X[1] + X[2] - Y[1] = 4 • ② X[3] - X[2] -Y[2] +Y[1] = -2 • ③ X[4] + X[5] - X[1] - Y[3] + Y[2] =3 • ④ - X[3] - X[4] + Y[3] - Y[4] = -2 • ⑤ - X[5] + Y[4] = -3
题目分析 • 观察发现,每个变量都在两个式子中出现了,而且一次为正,一次为负。所有等式右边和为0。接下来,根据上面五个等式构图。 • 每个等式为图中一个顶点,添加源点S和汇点T。
题目分析 • 如果一个等式右边为非负整数c,从源点S向该等式对应的顶点连接一条容量为c,权值为0的有向边;如果一个等式右边为负整数c,从该等式对应的顶点向汇点T连接一条容量为c,权值为0的有向边。 • 如果一个变量X[i]在第j个等式中出现为X[i],在第k个等式中出现为-X[i],从顶点j向顶点k连接一条容量为∞,权值为V[i]的有向边。 • 如果一个变量Y[i]在第j个等式中出现为Y[i],在第k个等式中出现为-Y[i],从顶点j向顶点k连接一条容量为∞,权值为0的有向边。
2 (∞,4) (2,0) 1 (∞,3) (4,0) (∞,3) (2,0) S 4 T (∞,5) (3,0) 3 (∞,6) (3,0) 5 题目分析 • 根据上面的例子可以构造出如下网络。
2 2 1 2 4 4 4 2 S 4 T 3 3 3 3 5 题目分析 • 在这个图中求最小费用最大流,流量网络如下图,每个红色边的流量就是对应的变量X的值。
题目分析 • 上面的方法很神奇得求出了结果,思考为什么这样构图。我们将最后的五个等式进一步变形,得出以下结果 • ① - X[1] - X[2] + Y[1] + 4 = 0 • ② - X[3] + X[2] + Y[2] - Y[1] - 2 = 0 • ③ - X[4] - X[5] + X[1] + Y[3] - Y[2] + 3 = 0 • ④ X[3] + X[4] - Y[3] + Y[4] - 2 = 0 • ⑤ X[5] - Y[4] - 3 = 0
题目分析 • 可以发现,每个等式左边都是几个变量和一个常数相加减,右边都为0,恰好就像网络流中除了源点和汇点的顶点都满足流量平衡。每个正的变量相当于流入该顶点的流量,负的变量相当于流出该顶点的流量,而正常数可以看作来自附加源点的流量,负的常数是流向附加汇点的流量。
题目分析 • 因此可以据此构造网络,求出从附加源到附加汇的网络最大流,即可满足所有等式。而我们还要求费用最小,所以要在X变量相对应的边上加上权值,然后求最小费用最大流。
总结 • 在NOI的现场上,该题得分的平均分12.56,只有高逸涵大牛拿到了满分。不能不说这是一道难题,难就难在抽象出问题的数学模型,设计有效的算法。而信息学竞赛正朝着这个方向发展,数学建模将是解决问题的共同关键步骤。
总结 CmYkRgB123 http://www.cmykrgb123.cn
总结 • NOI2008的题与往年历届的比较,算是较难的。实际上编程都并不是特别复杂,而主要难在问题的分析和建模上。 • 通过做这一年的题,我的水平得到了提高,也对NOI更加了解了。 • 水平有限,欢迎大家批评指正。
欢迎访问 http://www.cmykrgb123.cn CmYkRgB123 http://www.cmykrgb123.cn