文章目录
- T1 旅行
- T1 分析
- T2 分析
- T3 分析
不得不说…noip的趋势越来越像是day1基础+思路稳定分数,基本确定你能在哪个获奖区,day2难度提高,给满分dalao拼技术和给day1二等的人一个拿一等的机会,给三等的摸一个二等的机会…
总感觉这个day2数据放大就是一套省选…
T1 旅行
题目描述
小 Y 是一个爱好旅行的 OIer。她来到 X 国,打算将各个城市都玩一遍。
小Y了解到, X国的
小 Y 的旅行方案是这样的:任意选定一个城市作为起点,然后从起点开始,每次可 以选择一条与当前城市相连的道路,走向一个没有去过的城市,或者沿着第一次访问该 城市时经过的道路后退到上一个城市。当小 Y 回到起点时,她可以选择结束这次旅行或 继续旅行。需要注意的是,小 Y 要求在旅行方案中,每个城市都被访问到。
为了让自己的旅行更有意义,小 Y 决定在每到达一个新的城市(包括起点)时,将 它的编号记录下来。她知道这样会形成一个长度为 的序列。她希望这个序列的字典序 最小,你能帮帮她吗? 对于两个长度均为 的序列 和 ,当且仅当存在一个正整数 ,满足以下条件时, 我们说序列 的字典序小于 。
对于任意正整数 ,序列 的第 个元素 和序列 的第 个元素 相同。
序列 的第 个元素的值小于序列 的第 个元素的值。
输入输出格式
输入格式:
输入文件共 行。第一行包含两个整数 ,中间用一个空格分隔。
接下来 m 行,每行包含两个整数 ,表示编号为 和
输出格式:
输出文件包含一行,
输入输出样例
输入样例#1:
6 5
1 3
2 3
2 5
3 4
4 6
输出样例#1:
1 3 2 5 4 6
输入样例#2:
6 6
1 3
2 3
2 5
3 4
4 5
4 6
输出样例#2:
1 3 2 4 5 6
T1 分析
先分析数据范围
1.(即普通树), 60分
普通树的话就很简单了,因为当到达当前节点的时候,必须将这个点的子树全部遍历过才能返回,并且要求字典序最小,所以暴力dfs贪心就可以了,对当前节点选择最小的子节点就可以了。
2.
<基环树>是指一个有
对于这部分,首先要注意一点,对于到达过的点,只能回退到这个点,不能从它的父亲节点再次到达这个节点。所以直接贪心用优先队列维护当前能到达的所有点,选择最小的到达,并把这个点能到达的点加入队列,这个做法是肯定错的。
当然虽然题目本身是存在难度的,但是如果仔细分析的话并没有那么复杂,因为 (毕竟还是T1…不会太夸张)
手写几组数据随便画一画就可以发现,虽然这张图存在 条边,但是实际遍历的时候,环上一定有一条边不会被经过,这个随便画一画想清楚就好了。也就是说依旧只会经过 条边。
那么就比较简单了,暴力遍历一遍环上的边,选择这条边不经过,那么对于剩下的 条边,就是第一种情况了,直接dfs即可。求个最大的答案就可以了。
当然这里还可以发现一件事,因为数据只有 ,所以其实不用求边,暴力删除条边的复杂度也就是 ,不会
T2 填数游戏
题目点击→洛谷 P5023 填数游戏 小 D 特别喜欢玩游戏。这一天,他在玩一款填数游戏。
这个填数游戏的棋盘是一个的矩形表格。玩家需要在表格的每个格子中填入一个数字(数字 或者数字 ),填数时需要满足一些限制。
下面我们来具体描述这些限制。
为了方便描述,我们先给出一些定义:
- 我们用每个格子的行列坐标来表示一个格子,即(行坐标,列坐标)。(注意: 行列坐标均从
- :一条路径是合法的当且仅当:
- 这条路径从矩形表格的左上角的格子出发,到矩形的右下角格子结束;
- 在这条路径中,每次只能从当前的格子移动到右边与它相邻的格子,或者 从当前格子移动到下面与它相邻的格子。
例如:在下面这个矩形中,只有两条路径是合法的,它们分别是:→→和:→→。
对于一条合法的路径 ,我们可以用一个字符串来表示,该字符串的长度为,其中只包含字符“”或者字符“”, 第 个字符记录了路径 中第 步的移动方法,“”表示移动到当前格子右边与它相邻的格子,“”表示移动到当前格子下面 与它相邻的格子。例如,上图中对于路径,有"";而对于另一条路径, 有""。
同时,将每条合法路径 经过的每个格子上填入的数字依次连接后,会得到一个长 度为的 字符串,记为 。例如,如果我们在格子和上填入数字 ,在格子和上填入数字 (见上图红色数字)。那么对于路径,我们可以得 到"",对于路径,有""。
游戏要求小 找到一种填数字 、 的方法,使得对于两条路径,,如果,那么必须。
我们说字符串 比字符串 小,当且仅当字符串 的字典序小于字符串 的字典序,字典序的定义详见第一题。但是仅仅是找一种方法无法满 足小 的好奇心,小
小 能力有限,希望你帮助他解决这个问题,即有多少种填 、 的方法能满足题目要求。由于答案可能很大,你需要输出答案对取模的结果。
输入输出格式
输入格式:
输入文件共一行,包含两个正整数 n,mn,m,由一个空格分隔,表示矩形的大小。其 中 nn 表示矩形表格的行数,mm 表示矩形表格的列数。
输出格式:
输出共一行,包含一个正整数,表示有多少种填 、 的方法能满足游戏的要求。 注意:输出答案对 取模的结果。
输入输出样例
输入样例#1:
2 2
输出样例#1:
12
输入样例#2:
3 3
输出样例#2:
112
输入样例#3:
5 5
输出样例#3:
7136
T2 分析
oi一大经典类型题…暴力打表找规律。
先化简一下题意:
给定一个 网格棋盘,要求用填充每一个格子.
使得任意两条从点 到 的不完全相交路径,先向右(字典序大)的路径的 路径字典序相对小.
首先确定一件事,对于任意一种填法,棋盘中填的数字一定满足,即从左下到右上的任意对角线中的数字一定是非递增序列。
当然这种题目…一看数据那么小,而且是固定答案的,遇事不决先暴力 …只要把的表打出来基本就能过了…
当然对于dalao来说,一看,第一反应应该是状压才对…不应该是暴力…
/***********************************************/
比赛时的做法可能是这样的:
当然比赛的时候写个暴力找规律没有任何问题…直接上呗…
这时候会发现表很难打,打到 以后就非常慢了,然后基本上短时间内只能出一个 的答案
当然这里不管是打表还是画图,都可以发现第二件事,那就是对于 的答案和 是一样的,对称一下就行了。
这时候打一个以下的表…猜一下规律,会发现相邻的两项基本上都满足
- 时,
- 时,
- 时,
- 时,发现,之后的答案依旧满足上述的规律,即
- 时,发现,之后的答案依旧满足上述规律,即
- 时,发现,之后的答案依旧满足上述规律,即
其实这时候就算后面的答案你的代码很难跑出来…猜也猜要猜一个规律上去…
可以发现对于不满足常规规律是从开始的,那么从开始找规律,
可以发现
那么可以猜测一下 - 时,,之后的答案即
- 时,,之后的答案即
这样的话就做完了…并且可以用自己的暴力程序,开着代码一直跑,看看能不能满足自己找的规律,来告诉自己到底能估到几分,当然这个做法就是100分的…但是比赛时起码能保证自己可以获得65分,即的部分 - 这个表大概跑了半个小时左右吧,的情况暴力跑太慢了。
/***********************************************/
如果想要证明规律的话,需要发现以下条件
- ;
- 棋盘中填的数字一定满足,即从左下到右上的任意对角线中的数字一定是非递增序列;
- 如果(i-1,j)和(i,j-1)的填数相同,那么以(i,j)为左上角、以(n,m)为右下角的子矩阵内所有对角线内的填数各自相等。
那么现在就可以分类讨论了:
若
- 这种情况下,只需要使得的所有对角线上数字相同.
- 同时第一列和第一行会受其影响,画一画图,加上推一波式子可以发现,答案形如
若
- 相同:
这种情况类似第一种情况 - 其中一对相同:
设表示到第条对角线上时,在前两行的第条斜线上及以前有过匹配的方案数。
即在两行中,第二行的某一格与其斜上方的格相同,一旦出现这种情况接下来第二行的填数就会有限制.
当第一行和第二行不存在这种情况的时候,当前的一条对角线实际上有种填法,而当第条对角线上出现这种情况的时候,则只有种填法.
那么考虑一下转移就可以写出:
即
(在条斜线上以前就匹配成功的方案) * (当前第条对角线的种填法) + (条斜线第一次匹配成功的种填法) * (当前第条对角线因不受任何影响所以有种填法.)
PC画图太麻烦了,这里给出 的图
按照同样的方法可以画出接下去的几个图
这样就可以计算出当 的答案了.
当 时,前两种情况是很容易推下去的。
按照第三种情况,根据最后一条对角线是否匹配成功进行讨论.
不难推出另外一种的答案实质上是
当推过几次式子之后可以发现,也满足上面打表所说的规律, 每次 会让答案
T3 保卫王国
题目描述
Z 国有座城市,条双向道路,每条双向道路连接两座城市,且任意两座城市 都能通过若干条道路相互到达。
Z 国的国防部长小 Z 要在城市中驻扎军队。驻扎军队需要满足如下几个条件:
一座城市可以驻扎一支军队,也可以不驻扎军队。
由道路直接连接的两座城市中至少要有一座城市驻扎军队。
在城市里驻扎军队会产生花费,在编号为i的城市中驻扎军队的花费是。
小 Z 很快就规划出了一种驻扎军队的方案,使总花费最小。但是国王又给小 Z 提出 了mm个要求,每个要求规定了其中两座城市是否驻扎军队。小 Z 需要针对每个要求逐一 给出回答。具体而言,如果国王提出的第个要求能够满足上述驻扎条件(不需要考虑 第 个要求之外的其它要求),则需要给出在此要求前提下驻扎军队的最小开销。如果 国王提出的第个要求无法满足,则需要输出。现在请你来帮助小 Z。
输入输出格式
输入格式:
第 行包含两个正整数和一个字符串,分别表示城市数、要求数和数据类型。是一个由大写字母 , 或 和一个数字 ,,
第 行个整数,表示编号的城市中驻扎军队的花费。
接下来 行,每行两个正整数,表示有一条到的双向道路。
接下来 行,第jj行四个整数,表示第jj个要求是在城市驻扎支军队, 在城市驻扎yy支军队。其中, 、 的取值只有 或 :若 为 ,表示城市 不得驻 扎军队,若 为 ,表示城市 必须驻扎军队;若 为 ,表示城市 不得驻扎军队, 若 为 ,表示城市
输入文件中每一行相邻的两个数据之间均用一个空格分隔。
输出格式:
输出共 行,每行包含 个整数,第行表示在满足国王第个要求时的最小开销, 如果无法满足国王的第个要求,则该行输出。
输入输出样例
输入样例#1:
5 3 C3
2 4 1 3 9
1 5
5 2
5 3
3 4
1 0 3 0
2 1 3 1
1 0 5 0
输出样例#1:
12
7
-1
T3 分析
黑科技题目…反正我不会… 动态dp模板题,甚至还能实现一下传说中的“全局平衡二叉树”…
简述一下题意:对一颗个点的树进行染色,对第个点染色的花费是,要求相邻的两个点之间必须有一个点被染色,然后给出组询问,每次询问强制对两个点固定状态(染色或不染色)
先考虑比赛时的做法:乍一看不会做怎么办…我们暴力一发O(nm)再说…
对于每个点可以选或不选,所以我们用:
同时,还要求相邻的两个节点至少有一个要选,所以如果 不选,则 的所有叶节点必须都选,如果
以此得到状态转移( 为 的叶节点, 为 节点的权值):
对于每个询问,若必选则将权值修改为,若不选则将权值修改为,最后输出
时间复杂度,44分。
显然对于整个代码,进行dp是必须的,那么上面的代码慢在哪里呢?显然是对于每次询问都对整棵树重新做一次dp了,显然对于只修改两个点,可能对于dp值只需要修改几个关键点就可以了,很多点的值是不需要修改的,但是我们依旧做了一次dp,所以可以猜想优化应该在这里。
那么我们考虑修改两个值对整个dp数组会有多少影响。
假设修改x,y两个点,观察一下对整棵树的影响
表示根节点,表示的最近公共祖先,表示不包含的子树,表示根节点不包含的子树,分别表示的子树
我们可以发现,对于x,y修改,对整棵树的影响只有这两条路径上的值。其他点的值都是不会修改的。
所以其实我们对于每个询问需要做的就是修改后,将的值重新更新到根节点。
因为在结果上我们需要更新的路径可以分为三段:,即到达,再从到达根节点
所以考虑维护一个数组表示x不选/选,y不选/选时,x到y这条路径上能得到的最大的dp值.
接下去就可以对询问处理答案了,但是这里需要的空间是所以我们考虑修改一下记录方式。因为这个数组维护的目的其实也是使得到达,所以我们用倍增的方式来优化这个数组。
即将数组维护成表示 不选/选,从 往上跳 步的节点不选/选时,这条路上能得到的最大dp值。
接下去考虑一件事情,因为这条路径中,可能还存在一些点,这些点也存在它们的子树,而这个方程是没有办法考虑到这件事情的,所以我们需要重新定义方程:
设表示 不选/选,从 往上跳 步的节点不选/选时,这条路上能得到的最大dp值 且计入其他子树的最终dp值。即在整个祖先节点的子树中减去 的子树的影响。
然后我们得到转移方程:
样我们可以直接把到 的路径上的 f 数组加起来,并加上 的子树的贡献,再加上从 开始到根节点的贡献,再加上子树的贡献,就是最终的答案了。
当然这里还存在一些小问题,比如我们要用新的的值更新出新的的父亲的值时,要计算别的子树的贡献,它保存在中,但是即我们当前要替换的旧的值也算在里面了
设新的的值为,新的的值即为
然后两个特殊情况:
- 当在一条链上时,倍增之后已经在上了,此时直接倍增即可;
- 当为根节点时,显然不需要倍增,此时直接算出总答案。
还有个小问题…不要用…要用