洛谷 Codeforces 这是一个非正解,被正解暴踩,但它还是过了. 思路 首先很容易想到DP. 设\(dp_{x,i}\)表示\(x\)子树全部被覆盖,而且向上恰好延伸到\(dep=i\)的位置,的最小费用. 转移方程非常显然:每次把\(dp_x\)和\(dp_v\)合并时\(dp_{x,i}+=\min\{dp_v\},dp_{v,i}+=\min\{dp_x\}\),然后对应位置取\(\min\)即可. 显然这东西可以用线段树合并维护,就做完了. 然而这题卡空间,需要垃圾回收. 线段树合…
点此看题面 大致题意: 有一棵树,给出每个叶节点的点权(互不相同),非叶节点\(x\)至多有两个子节点,且其点权有\(p_x\)的概率是子节点点权较大值,有\(1-p_x\)的概率是子节点点权较小值.假设根节点\(1\)号节点的点权有\(m\)种可能性,其中权值第\(i\)小的可能点权是\(V_i\),可能性为\(D_i\),求\(\sum_{i=1}^mi\cdot V_i\cdot D_i^2\). 前言 好妙的题目,像我这种蒟蒻根本想不到线段树合并还可以这么玩. 同时,在无数个地方漏掉\(…
今年年初的时候参加了PKUWC,结果当时这一题想了快$2h$都没有想出来.... 哇我太菜啦.... 昨天突然去搜了下哪里有题,发现$loj$上有于是就去做了下. 结果第一题我5分钟就把所有细节都想好了啊5555.... 场上$60pts$消失... 显然,我们可以用$f[i][j]$表示节点$i$值为第$j$大的值的概率. 我们不难列出$dp$式子,$f[i][j]=f[s1][j] \times (s[s2][j-1]\times p+(s[s2][m]-s[s2][j])\times (1…
还是没有弄清楚线段树合并的时间复杂度是怎么保证的,就当是$O(m\log n)$吧. 这题有一个显然的DP,dp[i][j]表示节点i的值为j的概率,转移时维护前缀后缀和,将4项加起来就好了. 这个感觉已经很难做到比$O(n^2)$更优的复杂度了,但我们要看到题目里有什么条件没用上:每个节点最多有2个儿子. 这个提醒我们可以用启发式合并,据说splay可以做,但我们可以考虑一下线段树合并做法. 仍然采用上面的转移方程,这里线段树上的一个节点T[x]表示x表示的区间[L,R]最终成为当前子树的根的…
E. Forensic Examination http://codeforces.com/problemset/problem/666/E 题目大意:给模式串S以及m个特殊串,q个询问,询问S的子串[pl,pr]在特殊串编号属于[l,r]中出现次数最多的次数以及在哪个特殊串. 一开始打算用S建SAM,特殊串去匹配...测样例时才想起这样不对.胡搞一番后,才开始写下面的做法. S与特殊串连在一起建SAM,记录S串[1,x]在SAM上节点位置,用来子串定位.每个节点的{right}该串出现的所有地…
BZOJ LOJ 令\(f[i][j]\)表示以\(i\)为根的子树,权值\(j\)作为根节点的概率. 设\(i\)的两棵子树分别为\(x,y\),记\(p_a\)表示\(f[x][a]\),\(p_a'\)表示\(f[y][a]\),\(P_i\)表示给定的\(i\)取最大值作为权值的概率. 转移就是两棵树之间的权值组合,即以\(x\)子树中的\(a\)作为最小值的概率为\(p_a\times\sum\limits_{v>a}p_v'\times(1-P_i)\),以\(x\)子树中的\(a\…
LINK 思路 首先暴力\(n^2\)是很好想的,就是把当前节点概率按照权值大小做前缀和和后缀和然后对于每一个值直接在另一个子树里面算出贡献和就可以了,注意乘上选最大的概率是小于当前权值的部分,选最小是大于当前权值的部分 然后考虑怎么优化 用线段树合并来做 每次向左递归的时候就把x右子树对y左子树的贡献加上,把y右子树对x左子树的贡献加上 每次向左递归的时候就把x左子树对y右子树的贡献加上,把y左子树对x右子树的贡献加上 考虑每个节点,左边的区间贡献一定会被统计完全,右边的区间贡献一定会被统计完…
好妙的一个题- 我们设 \(f_{i,j}\) 为 \(i\) 节点出现 \(j\) 的概率 设 \(l = ch[i][0] , r = ch[i][1]\) 即左儿子右儿子 设 \(m\) 为叶子结点的个数 显然,\(i\) 出现 \(j\) 的概率为 \[f_{i,j} = f_{l,j} * (p_i \sum_{k=1}^{j-1}f_{r,k} + (1-p_i)\sum_{k=j+1}^{m}f_{r,k}) + f_{r,j} * (p_i \sum_{k=1}^{j-1}f_{…
正题 题目链接:https://www.luogu.com.cn/problem/P6847 题目大意 \(n\)个点的一棵树上,每个时刻可以割掉一些边,一些节点上有果实表示如果在\(d_i\)时刻这个点恰好不与\(1\)联通,那么就可以获得\(w_i\)的价值. \(1\leq n,k\leq 10^5\) 解题思路 设\(f_{x,i}\)表示节点\(x\)在时刻\(i\)之前割掉时的最大权值那么相当与在儿子里面选一个最大的\(f_{y,j}(j\leq i)\)合并上来. 这是一个很经典的…
调了半天居然还能是线段树写错了,药丸 这题大概是类似一个树形DP的东西.设$dp[i]$为修完i这棵子树的最小代价,假设当前点为$x$,但是转移的时候我们不知道子节点到底有没有一条越过$x$的路.如果我们枚举每条路去转移,会发现这条路沿线上的其他子树的答案难以统计,那怎么办呢,我们可以让这条路向上回溯的时候顺便记录一下,于是有$val[i]$表示必修i这条路,并且修完当前子树的最小代价. 则有转移$dp[x]=min(val[j])$,且$j$这条路必须覆盖$x$. $val[i]=(\sum…