1.一亩地 land
Description
老 G 是个辛勤的码农,他用了一生的时间,默默种下了一片又一片的代码。现在,他有了一亩代码地。这亩代码可以用一个 n 个节点的树来描述,所有节点可以通过树边互相到达。节点从 0 开始编号。
老 G 渐渐的老去,所以他现在想把他的地传承给他的两个儿子。为了避免儿子产生冲突,他决定将整块地平均分给两个儿子,更具体地,他会将地里 n 个节点平均分给每个儿子。
分割代码地是需要代价的,更具体地,若用树边相连的两个节点最后分给了不同的儿子,则这条边就会产生一定的代价,每条边的代价不一定相等。老 G 想知道最优的分割方案,你能帮助他吗?
Input
第一行一个整数 n,表示树有 n 个节点。保证 n 为偶数。接下来 n-1 行每行三个整数 ui,vi,wi,表示节点 ui,vi 之间有一条边,两个点若分给不同儿子则会产生 wi 的代价。
Output
第一行一个整数,表示分割的最小代价。
第二行 n/2 个用空格分隔的整数,表示分给第一个儿子的所有节点。若有多解任意输出一组即可。
Sample Input
| |
Sample Output
| |
Constraints
20%的数据:n <= 20
40%的数据:n <= 60
另有 30%的数据:树为一条链
100%的数据:1 <= n <= 2000 , 0 <= ui,vi < n , 1 <= wi <= 1000
Judge Method
第一行正确得 6 分
第二行方案可行得 4 分
Solution
树形背包。
f[i][j]表示i的子树中选取j个黑点的答案。
转移暴力枚举,因为每对点(i,j)只会在lca有贡献,所以总复杂度O(N^2)
Code
| |
2.三组基因 genes
Description
小 Y 是个灵魂重组师,他每天要和各种各样的基因玩耍。
这天他正在重组三组基因,三组基因用由小写英文字母组成的字符串 S1,S2,S3 表示。他重组的方式为提取出三个基因中相同的部分,并加以改造。
显然他有非常多种选择方式进行提取,现在他想知道,对于特定的提取长度 l,他有多少种方式进行提取,提取方式不同当且仅当存在某个基因提取的位置不同。
(可以通过样例数据来加深理解。)
Input
共三行,每行一个由小写英文字母组成的字符串。
Output
共 min(|S1|,|S2|,|S3|)行,每行输出一个整数,第 i 行表示提取长度为 i 的提取方法数。
答案模(10^9+7)。
Sample Input
aacbc
baac
aacaa
Sample Output
18
3
1
0
HINT
长度为2时三种提取方法为:
- aacbc baac aacaa
- aacbc baac aacaa
- aacbc baac aacaa
Constraints
20%的数据:1 <= 串长 <= 10
60%的数据:1 <= 串长 <= 1000
100%的数据:1 <= 串长 <= 10^5
Solution
后缀数组+set。
枚举长度L,把height小于L的砍断,那么原后缀数组变成了很多块,对于每块可以求出1、2、3的种数,乘起来就是答案。
另外,本题有后缀自动机的做法:用后缀自动机建立后缀树,每个节点的贡献就是深度*子树内1、2、3点对数。树形DP即可。
Code
后缀数组
| |
后缀自动机 (by liutao)
| |
3.TG主义均贫富 (average)
Description
小 Y 特别喜欢TG主义,这天他正在研究它的优越性。
他发现TG主义为了大众生活经常采取均贫富的方式。
有时候富人非常不听话,会拒绝这个政令,而TG人则会穷追不舍对其强制执行。
更具体地,我们可以把 Z 国看做一个 n 个节点 m 条边的无向图,点从 1 开始编号。
一开始富人在点 S,TG人在 T,每分钟,两队人都会随机采取一次移动,移动的方式也都一样:
位于某个点 i 时,会有 pi 的概率停留点 i,或是有 1-pi 的概率等概率的随机选择 i 的一个邻边移动。
若两队人在某点处相遇,富人就被抓了。
注意,在边上富人是不会被抓住的。
现在TG人想知道它在抓到富人前,他们所走过的路径长度期望和,以便惩治富人。
Input
第一行三个正整数 n,m,t,表示点数边数数据组数。
接下来 m 行,每行两个整数表示一条边。
接下来 n 个实数表示 pi。
接下来 t 行每行前 m 个数 vi 表示边的长度,最后两个数表示 S,T。
Output
共 t 行每行一个实数表示答案。答案保留两位小数。
Sample Input
| |
Sample Output
| |
Constraints
30%的数据:n<=5, t<=10
60%的数据:n<=12, t<=50
100%的数据:1<=n<=22, 1<=t<=500, 1<=vi<=10^6, 0.01<=pi<=0.99
保证图联通,无重边和自环
Solution
高斯消元+逆矩阵+矩阵乘法。
** 注意高斯消元的技巧:用第i行乘上系数去加j而不是用第j行乘系数去加i **
f[i][j]表示A走到i,B走到j的期望长度。
发现f[i][j] = f[j][i]
于是我们可以优化一下常数。。。
然后f[i][i] = 0
剩下的要考虑与i相邻的点u对i的贡献。
如果设p[i]为留在i点的概率,不妨设q[i]为走出i点的概率。
我们要考虑现在在(i,j)下一步走到哪里(加上一个边权后转移到哪里),而不是什么能转移到(i,j)(应该是等价的,但是比较难yy。。考场上不建议这样想)。
f[i][j] = Sum (f[u][j]+w[i][u])*q[i]*p[j] + Sum (f[i][v]+w[j][v])*p[i]*q[j] + Sum (f[u][v]+w[i][u]+w[j][v])*q[i]*q[j] + f[i][j]*p[i]*p[j]
发现这个递推式的状态之间的转移不是拓扑图(会有环)。于是用高斯消元,把w项移到左侧,f[i][j]移到右侧即可。
但是这样会T。
我们发现每次消元系数矩阵不变。于是我们不妨求系数矩阵的逆矩阵,然后每次构造出常数向量,左乘逆矩阵就是答案。
因为构造常数向量是n^2m的,所以总复杂度应该是O(n^6+tn^2*m)的。
其实构造常数矩阵的时候可以达到O(N^2),预处理出来一个奇怪的东西就可以啦。。(反正我也不会但是这样能优化不少复杂度)
Code
| |