BOJ Season Autumn, 2012

转至: http://blog.renren.com/share/256603565/14361820169?from=0101010202&ref=hotnewsfeed&sfet=102&fin=0&ff_id=256603565#nogo

A 怎么乱搞都能过…

标程是用树链剖分写的,然后通过的代码有dfs序列的,看不懂的,乱搞水过的…

B 数位dp。

状态是dfs(i, m, s, e),i为当前做到前i位,m为是否已经匹配了两个串,s为走到自动机的节点s(或者kmp也能做),e为前i位是否是上限。

C sg打表找规律。

证明用数学归纳法就好了。

D 构造题,乱搞。

我用的是秦九韶+模高斯消元:a[0]+a[1]*x^[1]+a[2]*x^[2]+a[3]*x^[3]+...+a[n-1]*x(n-1) = y (mod p(随便定个大一些的p)),把每对(x,y)都带进去可以得到一个模线性方程组,然后解出a[0],a[1],a[2],...a[n-1]。

E 构造题,乱搞。

答案是n/(n+1),证明如下:

考察最大的n个数n^2-n+1, n^2-n+2, n^2-n+3,...,n^2。如果有两个在同行或同列则

ans>=a/b>=(n^2-n+1)/n^2>n/(n+1)

否则其中必然有至少两个数和n^2-n在同行或同列

ans>=n^2-n/a>=(n^2-n)/(n^2-1)=n/(n+1)

然后构造方法非常多……

F 图论 差分约束最短路

如果删除的边不是最短路径上的边则最短路不变。现在假设v的前继边(u,v)被删除,要求到v的最短路,所有可能的答案是d[x]-d[v]+d[y]+w[x,y],其中x属于v的子树,y不属于v的子树。注意到对于给定的v,d[v]是定值,所以实际上是要求d[x]+d[y]+w[x,y]最小。

做法1:离线乱搞,具体就是对每个点维护一个非树边的可合并堆,从子树合并上来的时候,一直弹堆直到边的两端点不属于子树(并查集维护即可)。

做法2:还是离线乱搞,把所有非树边边按照d[x]+d[y]+w[x,y]排序,任意一条边可能更新的节点是其两端点到两端点的lca路径上的点,如果某个节点不能被更新,那么对于之后的边同样也不行。所以可以用并查集维护某个点是否被访问过,访问过的点全并到lca上,然后暴力更新就行。

G 分数规划。二分t(t可能是负数…),考察>t的方案有多少个,如果少于k个则t为可行解,二分直到找到最大的t。计算过程如下,t<=(sumvalue[i]-sumvalue[j])/(sumcost[i]-sumcost[j]),整理得sum(value[i]-t*cost[i])-sum(value[j]-t*cost[j])>0。令w=value-t*cost,sumw[i]-sumw[j]>0, i-j>=M。离散化+树状数组统计即可。注意精度。

H 汉诺塔…

这题要写得简短不太容易。稍候补上。

I 树形dp。

枚举起点做一下背包,注意走两步有走出去再走回来的情况。

J 几何。

判断每个线段和抛物线的关系,仔细硬算就好了。这题我手工构造了25组数据,滥竽充数的都是过不去的。


你可能感兴趣的:(c)