2015 China Collegiate Programming Contest Nanyang

题目可以在cdoj以及hdoj上找到,先写一份简要题解,


A. Secrete Master Plan

题意:

给定两个2*2的方阵,问能否通过若干次旋转操作把第一个变成第二个。

题解:

直接模拟即可。


C. The Battle of Chibi

题意:

给定一个长为n(<=1000)的序列,求长度为m(m<=n)的上升子序列个数,对1000000007取模。

题解:

先将所有数离散化一下,记dp[i][j]为末尾是i且长度为j的上升子序列个数,用树状数组优化转移,复杂度O(nmlogn),据说有O(nm)的做法但是不会。


D. Pick The Sticks

题意:

有n(<=1000)根金条,每根金条有一个长度和一个收益,要放在一个长度为L(<=2000)的盘子上,要求金条不能叠放,并且重心要在盘子上(包括端点),求最大收益。

题解:

金条放在边上相当于用一半的代价获得这个金条,由于长度可能为奇数,先把长度加倍,记dp[i][j][k]为已经放了前i根金条,背包剩余容量为j,已经有k根金条半价优惠,直接枚举下一根金条转移即可,复杂度O(nL),这里有个trick,如果只放一根金条,无论金条多长都是可以放下的。


E. Ba Gua Zhen

题意:

有一个n(<=50000)个顶点m(<=100000)条边的无向图,每条边有一个边权(0<=边权<2^60),求所有回路中边权xor和的最大值。

题解:

任意选定一个起点,从起点出发开始dfs,同时记录路径xor和,每访问到一个访问过的点表明得到了一个环,将当前异或值与起点到当前点的xor和xor一下可以得到环上的xor和,由于xor的性质,任意一个回路都可以用前面得到的环来线性表示,于是对之前得到的xor和做一次xor高斯消元,得到一组向量基,令ans=0,枚举每个向量基,用ans=max(ans,ans^base)更新答案即可,复杂度O(60*(n+m))。


F. The Battle of Guandu

题意:

在一场战争中,有m(<=100000)个战场和n(<=100000)个村庄,每个战场有一个重要度,重要度为0表示在这个战场己方输赢无所谓,重要度为1表示己方不能输,重要度为2表示己方必须胜出,己方获得战争的最终胜利当且仅当己方在每个战场的战果均不违背其重要度,每个战场输赢的判据只有人数,人多的一方胜出,若两方人数相同则打平,对于第i个村庄,每花费c[i]的代价能够征用一个人派到己方x[i]战场,同时有一个人会跑到敌方y[i]战场,问己方能否获得战争的最终胜利,若能,求出最小代价。

题解:

考虑每个战场的净人数(己方人数-对方人数),那么相当于第i个村庄花费c[i]的代价使得y[i]战场净人数-1,x[i]战场净人数+1,相当于转移了1个人过来。建立如下费用流模型,源向重要度为0的战场连容量INF费用0的弧,重要度为2的战场向汇连容量1费用0的弧,对于第i个村庄,战场y[i]向x[i]连容量INF费用c[i]的弧。如果满流,说明每个重要度为2的战场净人数>0,并且每个重要度为1的战场由于出入流平衡,净人数=0,于是能获胜。但是直接跑费用流是会TLE的,考虑每一次增广都是找一条从源到汇最短路,并且每次增广流量限制总为1,连向汇的费用总为0,因此可以从源出发跑一次单源最短路得到每次增广的费用,复杂度O((n+m)log(n+m))。


G. Ancient Go

题意:

给定一个9*9的围棋局面,先除去对方的死棋,再除去己方的死棋,对于当前局面,问能否通过一手棋吃掉对面至少一个子。

题解:

模拟,先找出每个连通块,找出与连通块相邻的格子中有多少个空位,如果空位数为0则是死棋,将其从棋盘上拿掉,先处理对方的死棋,再处理己方的死棋,然后检查剩余的棋子中,是否存在对方连通块的相邻空位数恰好为1,若有则可以吃掉。


H. Sudoku

题意:

有一个4*4的数独,已经有一些位置填上数字,求解这个数独(保证只有一组解)。

题解:

直接爆搜即可。


K. Game Rooms

题意:

有一层高度为n(<=4000)的楼,每层楼可以建两种娱乐设施之中的一个,并且每层楼分别想玩两种娱乐设施的人数已知,需要找一种建设方案使得总代价最小,每个人的代价为移动到最近有他想玩的娱乐设施的楼层的距离,输出最小代价。

题解:

记dp[i][j][0/1]为只考虑前i层楼,并且第i层楼建了第0/1种娱乐设施,且最近一个与第i层不同的娱乐设施位于第j层,这里认为所有层都建同一种设施被认为是不合法的,因此需要先处理前i-1层楼都是同一种娱乐设施且第i层与第i-1层不同的情形的结果,转移的时候枚举下一层修建的娱乐设施来转移,有两种可能,(1)第i+1层和第i层相同,那么第i+1层想玩另一种的人需要跑到第j层去,(2)第i+1层和第i层不同,那么第i+1层想玩另一种的只需要跑到第i层,同时中间有一些原来会跑到第j层的人会转而跑到第i+1层,这里需要预处理一些信息来O(1)转移,总复杂度O(n^2)。


L. Huatuo's Medicine

题意:

一位医生有n种药,每一种药恰好放在一个药瓶里,每次出诊他都会把这些瓶子串成一条链,当他拿出这条链的时候,他不记得哪些瓶子装哪些药,只记得药的顺序,为了不拿错药,求最少需要的药瓶个数。

题解:

有n个不同字符的回文串的最短长度为2n-1,直接输出即可。

你可能感兴趣的:(2015 China Collegiate Programming Contest Nanyang)