在 dp 问题中,如果发现可以用后缀最大值来进行转移的话可以考虑去查分这个后缀最大值. 这样的话可以用差分的方式来方便地进行维护 ~ #include <bits/stdc++.h> #define N 200007 #define ll long long #define lson t[x].ls #define rson t[x].rs #define setIO(s) freopen(s".in","r",stdin) using namespac…
题意 题目链接 Sol 首先不难想到一个dp,设\(f[i][j]\)表示\(i\)的子树内选择的最小值至少为\(j\)的最大个数 转移的时候维护一个后缀\(mx\)然后直接加 因为后缀max是单调不升的,那么我们可以维护他的差分数组(两个差分数组相加再求和 与 对两个原数组直接求和是一样的) 向上合并的过程中对\(a[x]\)处\(+1\),再找到\(a[x]\)之前为\(1\)的位置\(-1\)即可 (怎么感觉暴力区间加也可以qwq) 复杂度\(O(nlogn)\) // luogu-jud…
5469: [FJOI2018]领导集团问题 链接 题意: 要求在一棵树内选一个子集,满足子集内的任意两个点u,v,如果u是v的祖先,那么u的权值小于等于v. 分析: dp[u][i]表示在u的子树内,最大的数是i的时候,最多选多少点.其中每个i都要和i+1取max,即每个i维护后缀最大值. 考虑优化:如果不考虑u的权值,对dp数组从后往前差分,然后得到的一定全是正数,而且此时的差分数组就是所有子节点的差分数组的和(即把每一位上的数字求和). 而合并差分数组是可以做到$O(nlogn)$的,因为…
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\…
今年年初的时候参加了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]最终成为当前子树的根的…
题目大意:给你一棵树,树上一共n个节点,共m次操作,每次操作给一条链上的所有节点分配一个权值,求所有节点被分配到所有的权值里,出现次数最多的权值是多少,如果出现次数相同就输出最小的. (我辣鸡bzoj的权限号,洛谷上P4556也有这道题) 线段树合并入门题 也是比较常规的树上链的点差分 每次操作都在x,y上+1,在lca(x,y),fa[lca(x,y)]上-1 然后对每个点的所有差分操作构建一颗动态开点线段树,然后从叶节点向上合并即可 特别的,只有线段树的最底层存的是实际打的差分,而上层节点仅…
LINK 思路 首先暴力\(n^2\)是很好想的,就是把当前节点概率按照权值大小做前缀和和后缀和然后对于每一个值直接在另一个子树里面算出贡献和就可以了,注意乘上选最大的概率是小于当前权值的部分,选最小是大于当前权值的部分 然后考虑怎么优化 用线段树合并来做 每次向左递归的时候就把x右子树对y左子树的贡献加上,把y右子树对x左子树的贡献加上 每次向左递归的时候就把x左子树对y右子树的贡献加上,把y左子树对x右子树的贡献加上 考虑每个节点,左边的区间贡献一定会被统计完全,右边的区间贡献一定会被统计完…
点此看题面 大致题意: 有一棵树,给出每个叶节点的点权(互不相同),非叶节点\(x\)至多有两个子节点,且其点权有\(p_x\)的概率是子节点点权较大值,有\(1-p_x\)的概率是子节点点权较小值.假设根节点\(1\)号节点的点权有\(m\)种可能性,其中权值第\(i\)小的可能点权是\(V_i\),可能性为\(D_i\),求\(\sum_{i=1}^mi\cdot V_i\cdot D_i^2\). 前言 好妙的题目,像我这种蒟蒻根本想不到线段树合并还可以这么玩. 同时,在无数个地方漏掉\(…
好妙的一个题- 我们设 \(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_{…