全国信息学奥林匹克联赛(NOIP2018)复赛提高组day2第1页共8页CCF全国信息学奥林匹克联赛(NOIP2018)复赛提高组day2(请选手务必仔细阅读本页内容)一.题目概况中文题目名称旅行填数游戏保卫王国英文题目与子目录名travelgamedefense可执行文件名travelgamedefense输入文件名travel.ingame.indefense.in输出文件名travel.outgame.outdefense.out每个测试点时限1s1s2s测试点数目252025每个测试点分值454附加样例文件有有有结果比较方式全文比较(过滤行末空格及文末回车)题目类型传统传统传统运行内存上限512MB512MB512MB二.提交源程序文件名对于C++语言travel.cppgame.cppdefense.cpp对于C语言travel.cgame.cdefense.c对于pascal语言travel.pasgame.pasdefense.pas三.编译命令(不包含任何优化开关)对于C++语言g++-otraveltravel.cpp-lmg++-ogamegame.cpp-lmg++-odefensedefense.cpp-lm对于C语言gcc-otraveltravel.c-lmgcc-ogamegame.c-lmgcc-odefensedefense.c-lm对于pascal语言fpctravel.pasfpcgame.pasfpcdefense.pas注意事项:1、文件名(程序名和输入输出文件名)必须使用英文小写。2、C/C++中函数main()的返回值类型必须是int,程序正常结束时的返回值必须是0。3、全国统一评测时采用的机器配置为:Intel(R)Core(TM)i7-8700KCPU@3.70GHz,内存32GB。上述时限以此配置为准。4、只提供Linux格式附加样例文件。5、特别提醒:评测在当前最新公布的NOILinux下进行,各语言的编译器版本以其为准。全国信息学奥林匹克联赛(NOIP2018)复赛提高组day2第2页共8页1.旅行(travel.cpp/c/pas)【问题描述】小Y是一个爱好旅行的OIer。她来到X国,打算将各个城市都玩一遍。小Y了解到,X国的𝑛个城市之间有𝑚条双向道路。每条双向道路连接两个城市。不存在两条连接同一对城市的道路,也不存在一条连接一个城市和它本身的道路。并且,从任意一个城市出发,通过这些道路都可以到达任意一个其他城市。小Y只能通过这些道路从一个城市前往另一个城市。小Y的旅行方案是这样的:任意选定一个城市作为起点,然后从起点开始,每次可以选择一条与当前城市相连的道路,走向一个没有去过的城市,或者沿着第一次访问该城市时经过的道路后退到上一个城市。当小Y回到起点时,她可以选择结束这次旅行或继续旅行。需要注意的是,小Y要求在旅行方案中,每个城市都被访问到。为了让自己的旅行更有意义,小Y决定在每到达一个新的城市(包括起点)时,将它的编号记录下来。她知道这样会形成一个长度为𝑛的序列。她希望这个序列的字典序最小,你能帮帮她吗?对于两个长度均为𝑛的序列A和B,当且仅当存在一个正整数x,满足以下条件时,我们说序列A的字典序小于B。⚫对于任意正整数1≤ix,序列A的第i个元素Ai和序列B的第i个元素Bi相同。⚫序列A的第x个元素的值小于序列B的第x个元素的值。【输入格式】输入文件名为travel.in。输入文件共𝑚+1行。第一行包含两个整数𝑛,𝑚(𝑚≤𝑛),中间用一个空格分隔。接下来𝑚行,每行包含两个整数𝑢,𝑣(1≤𝑢,𝑣≤𝑛),表示编号为𝑢和𝑣的城市之间有一条道路,两个整数之间用一个空格分隔。【输出格式】输出文件名为travel.out。输出文件包含一行,𝑛个整数,表示字典序最小的序列。相邻两个整数之间用一个空格分隔。【输入输出样例1】travel.intravel.out651323253446132546见选手目录下的travel/travel1.in和travel/travel1.ans。全国信息学奥林匹克联赛(NOIP2018)复赛提高组day2第3页共8页【输入输出样例2】travel.intravel.out66132325344546132456见选手目录下的travel/travel2.in和travel/travel2.ans。【输入输出样例3】见选手目录下的travel/travel3.in和travel/travel3.ans。这组样例满足𝑚=𝑛−1。【输入输出样例4】见选手目录下的travel/travel4.in和travel/travel4.ans。这组样例满足𝑚=𝑛。【数据规模与约定】对于100%的数据和所有样例,1≤𝑛≤5000且𝑚=𝑛−1或𝑚=𝑛。对于不同的测试点,我们约定数据的规模如下:测试点编号𝑛=𝑚=特殊性质1,2,310𝑛−1无4,5100无6,7,81000每个城市最多与两个城市相连9,101000无11,12,135000每个城市最多与三个城市相连14,155000无16,1710𝑛无18,19100无20,21,221000每个城市最多与两个城市相连23,24,255000无全国信息学奥林匹克联赛(NOIP2018)复赛提高组day2第4页共8页2.填数游戏(game.cpp/c/pas)【问题描述】小D特别喜欢玩游戏。这一天,他在玩一款填数游戏。这个填数游戏的棋盘是一个n×m的矩形表格。玩家需要在表格的每个格子中填入一个数字(数字0或者数字1),填数时需要满足一些限制。下面我们来具体描述这些限制。为了方便描述,我们先给出一些定义:•我们用每个格子的行列坐标来表示一个格子,即(行坐标,列坐标)。(注意:行列坐标均从0开始编号)•合法路径P:一条路径是合法的当且仅当:1.这条路径从矩形表格的左上角的格子(0,0)出发,到矩形的右下角格子(n−1,m−1)结束;2.在这条路径中,每次只能从当前的格子移动到右边与它相邻的格子,或者从当前格子移动到下面与它相邻的格子。例如:在下面这个矩形中,只有两条路径是合法的,它们分别是𝑃1:(0,0)→(0,1)→(1,1)和𝑃2:(0,0)→(1,0)→(1,1)。对于一条合法的路径P,我们可以用一个字符串w(P)来表示,该字符串的长度为n+m−2,其中只包含字符“R”或者字符“D”,第i个字符记录了路径P中第i步的移动方法,“R”表示移动到当前格子右边与它相邻的格子,“D”表示移动到当前格子下面与它相邻的格子。例如,上图中对于路径𝑃1,有w(P1)=RD;而对于另一条路径𝑃2,有w(P2)=DR。同时,将每条合法路径P经过的每个格子上填入的数字依次连接后,会得到一个长度为n+m−1的01字符串,记为s(P)。例如,如果我们在格子(0,0)和(1,0)上填入数字0,在格子(0,1)和(1,1)上填入数字1(见上图红色数字)。那么对于路径𝑃1,我们可以得到s(P1)=011,对于路径𝑃2,有s(P2)=001。游戏要求小D找到一种填数字0、1的方法,使得对于两条路径𝑃1,P2,如果w(P1)w(P2),那么必须s(P1)≤s(P2)。我们说字符串a比字符串b小,当且仅当字符串a的字典序小于字符串b的字典序,字典序的定义详见第一题。但是仅仅是找一种方法无法满足小D的好奇心,小D更想知道这个游戏有多少种玩法,也就是说,有多少种填数字的方法满足游戏的要求?全国信息学奥林匹克联赛(NOIP2018)复赛提高组day2第5页共8页小D能力有限,希望你帮助他解决这个问题,即有多少种填0、1的方法能满足题目要求。由于答案可能很大,你需要输出答案对109+7取模的结果。【输入格式】输入文件名为game.in。输入文件共一行,包含两个正整数n、m,由一个空格分隔,表示矩形的大小。其中n表示矩形表格的行数,m表示矩形表格的列数。【输出格式】输出文件名为game.out。输出共一行,包含一个正整数,表示有多少种填0、1的方法能满足游戏的要求。注意:输出答案对109+7取模的结果。【输入输出样例1】game.ingame.out2212见选手目录下的game/game1.in和game/game1.ans。【样例解释】对于2×2棋盘,有上图所示的12种填数方法满足要求。【输入输出样例2】game.ingame.out33112见选手目录下的game/game2.in和game/game2.ans。。【输入输出样例3】game.ingame.out557136见选手目录下的game/game3.in和game/game3.ans。全国信息学奥林匹克联赛(NOIP2018)复赛提高组day2第6页共8页【数据规模与约定】测试点编号n≤m≤1~4335~102100000011~133100000014~168817~2081000000全国信息学奥林匹克联赛(NOIP2018)复赛提高组day2第7页共8页3.保卫王国(defense.cpp/c/pas)【问题描述】Z国有n座城市,n−1条双向道路,每条双向道路连接两座城市,且任意两座城市都能通过若干条道路相互到达。Z国的国防部长小Z要在城市中驻扎军队。驻扎军队需要满足如下几个条件:⚫一座城市可以驻扎一支军队,也可以不驻扎军队。⚫由道路直接连接的两座城市中至少要有一座城市驻扎军队。⚫在城市里驻扎军队会产生花费,在编号为i的城市中驻扎军队的花费是pi。小Z很快就规划出了一种驻扎军队的方案,使总花费最小。但是国王又给小Z提出了m个要求,每个要求规定了其中两座城市是否驻扎军队。小Z需要针对每个要求逐一给出回答。具体而言,如果国王提出的第j个要求能够满足上述驻扎条件(不需要考虑第j个要求之外的其它要求),则需要给出在此要求前提下驻扎军队的最小开销。如果国王提出的第j个要求无法满足,则需要输出-1(1≤j≤m)。现在请你来帮助小Z。【输入格式】输入文件名为defense.in。第1行包含两个正整数𝑛,𝑚和一个字符串𝑡𝑦𝑝𝑒,分别表示城市数、要求数和数据类型。𝑡𝑦𝑝𝑒是一个由大写字母A,B或C和一个数字1,2,3组成的字符串。它可以帮助你获得部分分。你可能不需要用到这个参数。这个参数的含义在【数据规模与约定】中有具体的描述。第2行n个整数pi,表示编号i的城市中驻扎军队的花费。接下来n−1行,每行两个正整数u,v,表示有一条u到v的双向道路。接下来m行,第j行四个整数a,x,b,y(a≠b),表示第j个要求是在城市a驻扎x支军队,在城市b驻扎y支军队。其中,x、y的取值只有0或1:若x为0,表示城市a不得驻扎军队,若x为1,表示城市a必须驻扎军队;若y为0,表示城市b不得驻扎军队,若y为1,表示城市b必须驻扎军队。输入文件中每一行相邻的两个数据之间均用一个空格分隔。【输出格式】输出文件名为defense.out。输出共m行,每行包含1个整数,第j行表示在满足国王第j个要求时的最小开销,如果无法满足国王的第j个要求,则该行输出-1。【输入输出样例1】defense.indefense.out53C32413915525334103021311050127-1全国信息学奥林匹克联赛(NOIP2018)复赛提高组day2第8页共8页见选手目录下的defense/defense1.in和defense/defense1.ans。【样例解释】对于第一个要求,在4号和5号城市驻扎军队时开销最小。对于第二个要求,在1号、2号、3号城市驻扎军队时开销最小。第三个要求是无法满足的,因为在1号、5号城市都不驻扎军队就意味着由道路直接连接的两座城市中都没有驻扎军队。【输入输出样例2】见选手目录下的defense/defense2.in和defense/defense2.ans。【数据规模与约定】对于100%的数据,n,m≤300000,1≤pi≤100000。测试点编号type𝑛=𝑚=1~2A310103