238A Not Wool Sequences
题意:一个序列称为wool序列,当且仅当它存在一段连续的子序列,其异或和为0,即a[l]^a[l+1]^...^a[r] = 0,求存在多少个非wool序列a,长度为N,其中0 <= a[i] < 2^m。
思路:构造一个新的序列c,c[0] = 0,c[1] = a[1],c[2] = a[1]^a[2],c[i] = a[1]^a[2]^...^a[i],如果a是一个wool序列,即a[l]^...^a[r] = 0,等价于c[l - 1]^c[r] = 0,
所以只要任意的c[l - 1]^c[r] != 0即可,即任意的c的值不一样。所以答案为从[1,2^m-1]中选N个不相同的数的结果。
238B Boring Partition
题意:给出一个长度为N的数组a,和一个数h,要求将a分成两组,定义一个函数f,f(i,j) = a[i] + a[j] + h * (如果a[i],a[j]同组 = 1,否则为0),请输出一个划分,使得f(i,j)的最大值与最小值之差最小。
思路:将数组排序后,从让最小值尽量大和最大值尽量小的角度易证划分要么是所有数都在同一个类,要么最小值单独在一个类,剩余的数是另一类。
238C World Eater Brothers
题意:给一颗树,有向的,当忽略所有边的方向时是一个树。现在要求改变最少的边的方向,使得从某个点或者某两个点出发,可以遍历所有点。
思路:枚举任意一个点作为其中一个出发点(根),用sum表示从这个点出来,遍历所有点需要改变的边的方向,用dp表示从这个点是被儿子节点访问到的。sum[u] += sum[u->child]+边的方向是否为(u,u->child)。dp[u]的转移是min(sum[u],min(sum[u] - sum[u->child] + 1 + dp[u->child] - 2 * (u,u->child)边的方向)),意思是,既然u->child是有儿子访问了,那么不需要从u去访问,所以sum[u] - sum[u->child] - u到u->child这条边是否需要改变方向,访问的新代价是dp[u->child],还有要从u->child到u,这条边是否需要改变方向。
238E Meeting Her
题意:给出N个点,M条边的有向图,边权都是1。 有K类公交车,每类公交车都有自己的起点s(i),和终点t(i),公交车的行走规则是随机开往一条从s(i)到t(i)的最短路。一个人站在点A,要前往B点,问他从A到B在最坏情况下至少需要搭多少次buses,如果无法到达B,输出-1
思路:这些类型的buses,因为是随机走最短路,所以实质上它们一定到达的点是最短路上的必经点,只有这些点有意义,所以先求出每类buses对应的最短路上的必经点。用dp[i]表示在i点时在最坏情况下到达B点至少需要搭多少次buses,dp[B]=0,对于其他的dp状态,我们可以这次搭载的是哪一个buses,同时枚举起点进行更新,显然的,dp[u] = max(dp[v] + 1),其中(u,v)有边,且v是最短路上的点。最后输出dp[A]即可。