原题大作战

NOIP2015

T1跳石头

二分,没啥好说的,不知道为啥\(n=0,k=0\)的特殊数据会错。

T2子串

\(f[i][j][p][0/1]\)表示\(a\)串到第\(i\)个字符,\(b\)串匹配到第\(j\)个字符,一共划分成\(p\)部分,第\(i\)个字符用\((1)\)没用\((0)\)的方案数。

\(if(a[i]==b[j])\)
\(f[i][j][p][0]=f[i-1][j][p][0]+f[i-1][j][p][1]\)
\(f[i][j][p][1]=f[i-1][j-1][p][1]+f[i-1][j-1][p-1][0]+f[i-1][j-1][p-1][1]\)

....感觉和代码一样了啊,不写了

T3运输计划

思路:最大中最小(最小中最大),百分之90可以二分。二分一个最长的时间\(k\)。这样就转化成了可行性问题。
关键是\(check\)函数怎么写。
用到了树上差分的知识。其中有一个很巧妙地合并方法:按构建顺序编个号,按这个编号的顺序由大到小向上合并,即保证先合并了深度深的点,又好写。
继续说\(check\),对于长度大于\(k\)的路径,用每条路径修改差分数组,记录一下他们的最大值\(maxx\)和条数\(cnt\)。在所有的路径中,只要有一条路径\(i\)被这\(cnt\)条路径都经过,并且\(maxx-val[i]<=k\),就\(return\) \(true\)。否则\(return\) \(false\)

猜你喜欢

转载自www.cnblogs.com/karryW/p/10805276.html