对原图跑费用流,设每次增广后的当前的流量总和和费用总和分别为 \(v_i,c_i\),分类讨论便可获得每次询问的答案为 \(\min\left\{ \frac{c_i+x}{v_i} \right\}\)。html
选一个点做为汇点,每一个点都有初始流量 \(1\),流量都向汇点流,那么每一个点流出的流量都比流入的流量大 \(1\),因而一个环内的点的个数就是流出环的流量减去流入环的流量。以汇点为根找一棵生成树,每一个点向父亲的流量就是该点的子树大小,提早对每一个点的出边进行极角排序,预处理前缀和后便可快速查询。闭包
都是有源汇上下界最小费用可行流。优化
CF708D Incorrect Flow CF1288F Red-Blue Graph编码
线段树优化建图跑费用流,扫描线的过程当中动态更新线段树上的图。spa
开 \(2m\) 棵线段树优化建图跑费用流,\(m\) 棵表示从左来,\(m\) 棵表示从右来,线段树上向儿子连边时处理跨过中点的费用。指针
[THUSCH2017] 换桌rest
离线后对询问按 \(r\) 排序,线性基中的每一位保留出现最晚的元素,在线性基上查询时,当 \(l\) 比一个元素出现时间早时,才能考虑该元素的贡献。
CF1100F Ivan and Burgers 二维状况:【NFLSPC #3】芳
设二元组 \((a,b)\),表示有至少 \(a\) 的血量时,能够加 \(b\) 的血量,用可并堆维护,注意当前节点的优先级最高,要与堆顶元素不断合并来更新。
线段树维护出栈序,内层再套李超线段树支持斜率优化,时间复杂度为 \(O(n\log^2n)\),空间复杂度为 \(O(n\log n)\)。也能够直接用树状数组套可撤销李超线段树,但空间复杂度为 \(O(n \log^2 n)\)。
对询问分块,每块先遍历一遍整棵树获得以前操做后的答案,并将该块要修改的点拿出来建虚树。虚树上的点维护到虚树父亲之间点的 \(t_i-siz_i\),\(siz_i\) 表示 \(i\) 子树内黑点个数,每次在虚树往上跳,打标记来修改,二分获得有多少个点知足 \(t_i<siz_i+tag\)。复杂度为 \(O(n\sqrt n \log n)\)。
\(LCP\) 就是后缀树上 \(LCA\) 的长度,在后缀树上用 \(01\ Trie\) 启发式合并便可。
发现 \(\sum|w|=qk\),考虑根号分治。当 \(k\) 比较小时,能够 \(O(k^2)\) 去枚举子串,在 \(s\) 的 \(SAM\) 上的对应节点计算每一个子串的贡献。当 \(k\) 比较大时,能够将 \(s\) 和全部 \(w\) 一块儿建成广义 \(SAM\),倍增找的对应的节点来依次回答每一个询问。
询问就是区间前缀两两 \(LCA\) 在 \(Parent\) 树上的深度最大值。离线询问后固定右端点,用 \(LCT\) 维护 \(Parent\) 树,\(access\) 染色来更新每一个前缀位置配对的 \(LCA\) 深度最大值,用树状数组维护后缀最大值便可。
由于是实数,因此不考虑区间端点重合的状况。发现线段会被 \(2n\) 个端点划分为 \(2n+1\) 段,每段指望长度为 \(\frac{l}{2n+1}\)。考虑每段的贡献,设 \(f_{i,j}\) 表示已经考虑了 \(i\) 个端点,有 \(j\) 个左端点未匹配的方案数,得答案为合法区间的方案数除以总方案再乘上每一个区间的贡献:
也能够考虑用积分来推式子,答案为:
CF1153F Serval and Bonus Problem
发现一个点的独特的城市必定在其所在的最长链上,所以找到树的直径,从直径端点开始 \(dfs\),用栈维护当前点的独特的城市,先用预处理的次长链更新栈,而后进入最长链所在的儿子,再用最长链更新栈,获得当前点的答案,最后进入其余儿子。直径两个端点获得的答案取较大值为一个点的答案。
\(T_1\) 的一条边 \((x,y)\) 能和 \(T_2\) 的一条边 \((u,v)\) 匹配的前提条件是路径 \((u,v)\) 在 \(T_1\) 上包含边 \((x,y)\)。根据霍尔定理能够发现必定存在完美匹配,由于任意取 \(T_1\) 的 \(k\) 条边去掉后,会造成 \(k+1\) 个连通块,得 \(T_2\) 上至少有 \(k\) 条边能匹配。在 \(T_2\) 上剥叶子,在 \(T_1\) 上用并查集和倍增找对应的边匹配便可。
CF1284F New Year and Social Network
贪心就是尽量让前面的段长。先将询问离线,按要求的极差从小到大排序。设 \(nxt_i\) 表示 \(i\) 在当前极差下所在段的下一个位置,将其看做连边,用 \(LCT\) 维护,询问就是到根的点数。但 \(nxt_i\) 变化次数是 \(O(n)\) 的,直接作复杂度为 \(O(n^2\log n)\)。考虑根号分治,只在 \(LCT\) 上连 \(nxt_i \leqslant \sqrt n\) 的边,剩下的用二分和 \(ST\) 表去跳。复杂度为 \(O(n\sqrt n\log n)\)。
CF1039E Summer Oenothera Exhibition
用分块维护度数根号分治,复杂度为 \(O(n\sqrt n)\)。也有 \(O(n\log^2n)\) 的作法,每次只给重子树和子树外加权值和自身打标记,查询时跳重链来加上轻子树的贡献。
用 \(LCT\) 维护,维护子树大小 \(siz_x\),虚子树大小(包括自身)\(s_x\),虚子树大小平方 \(s2_x\),子树内点的答案和 \(ans_x\),虚子树内点的答案和 \(val_x\),子树内 \(a_x \times s_x\) 的和 \(sum_x\),得:\(ans_x=ans_{ls}+ans_{rs}+val_x+a_x\times(s_x\times s_x-s2_x)+2\times a_x \times siz_{rs} \times s_x+2 \times sum_{ls} \times (siz_x-siz_{ls})\)。由于 \(splay\) 左子树中是祖先节点,所以就有了最后一项来算祖先的贡献。
先排序,得答案为 \(\sum\limits_{i=1}^n\sum\limits_{j=i+1}^np_ip_j2^{i-j-1}\),考虑两两之间的贡献,用权值线段树便可维护。
最优状况必定存在一个点在全部多边形上,否则能够旋转。当存在正 \(x\) 边形时,全部知足 \(y\mid x\) 的正 \(y\) 边形必定存在,所以加入一个正 \(x\) 边形的贡献为 \(\varphi(x)\),取 \(3\) 到 \(n\) 的前 \(k\) 小欧拉函数便可。注意特判。
每一个位置向其做为右端点的合法的括号序列的最小左端点的上一个位置连边,最小左端点即为用栈维护后右括号匹配到的左括号,其会造成若干条链。在 \(SAM\) 上动态加字符,得以 \(i\) 为结尾的合法后缀左端点 \(\leqslant i-len_{fa_{las}}\) 时才会有贡献,在链上倍增便可。
先树上差分,转化为求到根路径上的点集和定点的距离和。设 \(x\) 到根路径上的点集为 \(p_i\),定点为 \(k\),点到根的边权和为 \(dis_x\),所求即为:\(\sum dis_{p_i}+dis_{k}\times dep_x-\sum dis_{lca(p_i,k)}\)。只有最后一项很差求,发现其能够用 [LNOI2014] LCA 中的方法求出,可持久化线段树维护便可,区间加用标记永久化实现。
建出圆方树,设圆点权值为 \(1\),方点权值为 \(0\),所求即为点集造成的最小连通块的权值和减去点集大小。
设解异或方程组后自由元个数为 \(cnt\),答案即为 \(2^{cnt}\)。当图合法时,即每一个连通块黑点个数为偶数时,得其答案为 \(2^{m-n+p}\),其中 \(p\) 为连通块个数,考虑对每一个连通块取生成树,对于非树边的任意一个方案,树边都有惟一一个合法方案与之对应。严谨的说就是矩阵的秩为 \(n-p\),所以自由元个数为 \(m-n+p\)。用圆方树维护后解决屡次询问。
离线询问固定右端点,在 \(Parent\) 树上维护每一个子串上一次的出现位置,发现须要像 \(access\) 同样对当前节点到根的节点进行染色,像 [雅礼集训 2017 Day7] 事情的类似度 同样作便可,须要区间取 \(\max\)、区间和公差为一的等差数列取 \(\max\) 和单点查询,用两棵线段树来维护。
对每一个串建出 \(SAM\),当一个 \(SAM\) 上的节点没有 \(c\) 的转移时,就将其连向下一个 \(SAM\) 起始节点 \(c\) 的转移指向的点。在这样造成的 \(DAG\) 上统计路径条数即为答案。
将 \(b_i\) 从小到大排序,发现对于每一个 \(a_i\) 能匹配的 \(b_i\) 都是一段后缀。对每一个位置维护 \(c_i-i\),\(c_i\) 表示 \(b_i\) 能和当前多少个 \(a_i\) 匹配。线段树区间加,维护最小值,用霍尔定理断定便可,有完美匹配当且仅当最小值 \(\geqslant 0\)。
源点 \(\rightarrow\) 列连通块 \(\rightarrow\) 点 \(\rightarrow\) 行连通块 \(\rightarrow\) 汇点。跑费用流,拆边处理费用,即 \(\binom{i+1}{2}-\binom{i}{2}=i\)
对于每一个右端点求出左端点的答案,在可持久化线段树上回答便可。考虑新加入一个右端点的贡献,一个位置的全部回文后缀能够划分为 \(O(\log n)\) 个等差数列,对每一个等差数列一块儿处理便可,发现其贡献刚好为区间加 \(1\)。在 \(PAM\) 查询子树最大值便可获得一个串上一次的出现位置,用线段树维护便可。
先用折半搜索求出有用的苹果个数为 \(i\) 的合法方案数 \(s_i\),发现求出刚好有 \(i\) 个有用的苹果的生成树个数 \(f_i\) 后,\(\sum f_is_i\) 即为答案。设 \(g_i\) 为钦定有 \(i\) 个有用的苹果的生成树个数,其能够用矩阵树定理来求,连边方式为:有用 \(\longleftrightarrow\) 有用,有用 \(\longleftrightarrow\) 坏,没用 \(\longleftrightarrow\) 坏,坏 \(\longleftrightarrow\) 坏,得 \(g_i=\sum\limits_{j\leqslant i}\binom{i}{j}f_j\),二项式反演便可。
每次将当前点集按最高位是 \(0\) 是 \(1\) 划分为两个点集,两个点集递归处理后在两个点集间选一条权值最小的边相连,不难发现这样获得的树就是最小生成树。整个过程能够用 \(01\ Trie\) 来实现,找最小边就是在 \(01\ Trie\) 上贪心。到叶子节点时,若其有 \(n\) 个点,其方案数为彻底图生成树个数 \(n^{n-2}\)。复杂度为 \(O(n\log^2 n)\)。
建出 \(dfs\) 树,按通过的方向给每条边定向,得非树边只有返祖边。设 \(S=\left\lceil \sqrt n \right\rceil\),当某条非树边 \((x,y)\) 知足 \(dep_x-dep_y \geqslant S-1\) 时就找到一个大小至少为 \(S\) 的环了。不存在这样非树边时,对每一个点按 \(dep_x \bmod S-1\) 的值分类,由于非树边都知足 \(dep_x-dep_y < S-1\),所以每一类点都是独立集,由抽屉原理得必定存在一类点个数 \(\geqslant \left\lceil \frac{n}{S-1} \right\rceil \geqslant S\)。
\(01\ Trie\) 和前缀优化建图,跑 \(2-SAT\)。
对每一个人在每一个时刻的生死状态和互相限制用 \(2-SAT\) 来建图。但直接建图点数是 \(O(nT)\) 的,发现和限制无关的点是在一段链上,因而能够将这样的点缩起来处理,这样点数就是 \(O(n+m)\) 的了。\(n-1\) 减去每一个点最终的生存状态能到达多少个其余点最终的死亡状态就是该点的答案,用 \(bitset\) 来优化传递闭包。建反图分批处理来优化空间。
设 \(d_x\) 表示 \(1\) 到 \(x\) 的最短距离,对于任何一张连通图都有:\(d_x \in [0,n),d_1=0\),若存在边 \((x,y)\),则有 \(|d_x-d_y|\leqslant 1\)。能够发现这是 \(d_x\) 合法的充要条件,已知知足上述限制的 \(d_x\) 时能够按 \(d_x\) 从小到大来依次加点构造出其对应的图。因而问题就转化为了构造知足以上限制的 \(d_x\),使其费用最小。像 [HNOI2013] 切糕 同样建图跑最小割便可。
构造 \(g(n)\) 知足 \(f(n)=\prod\limits_{d\mid n}g(d)\),莫比乌斯反演得 \(g(n)=\prod\limits_{d\mid n}f(d)^{\mu\left(\frac{n}{d}\right)}\),考虑对 \(\text{lcm}\) 进行 \(\text{min-max}\) 容斥来转化为 \(\gcd\):
考虑最后的指数,设 \(S\) 中能被 \(d\) 整除的有 \(t\) 个数,得:
所以有:
先拆位,而后用差分算出每一个位置是否必须为 \(1\)。设 \(f_i\) 表示前 \(i\) 个位置合法,且第 \(i\) 个位置为 \(0\) 的方案数,合法的转移位置具备单调性,复杂度为 \(O(kn)\)。
平方的含义就是对于一种操做方式来讲有多少种操做方式和其结果同样。能够 \(DP\) 求出有多少种操做方式能获得给定的结果,设 \(f_{i,j}\) 为取了 \(i\) 次,取了上管道 \(j\) 次便可。对于原问题,考虑 \(DP\) 套 \(DP\),设 \(g_{i,j,k}\) 表示取了 \(i\) 次,给定结果的那个操做方式已经取了上管道 \(j\) 次对应的全部 \(f_{i,k}\) 的和,枚举每次取上管道仍是下管道转移便可。
出现三次的顺子看做三个刻子,所以顺子出现次数只能为 \(0,1,2\)。设 \(f_{i,j,k}\) 表示考虑了前 \(i\) 种牌,\(i-1\) 开始有 \(j\) 个顺子待匹配,\(i\) 开始有 \(k\) 个顺子待匹配的方案数,用矩阵快速幂转移便可,特殊处理有初始牌的位置。其实也是 \(DP\) 套 \(DP\),内层 \(DP\) 是可行性。
只要算出在 \(i\) 左侧和右侧同时出现的子串个数就能计算位置 \(i\) 的答案。在 \(SAM\) 上每一个节点维护出 \(\text{endpos}\) 集合的最小值 \(L_x\) 和最大值 \(R_x\),设 \(l=\min(R_x-L_x,len_{x})\),得该节点的贡献为:\([L_x+1,R_x-len_{fa}]\) 加上 \(l-len_{fa}\),\([R_x-l+1,R_x-len_{fa}]\) 加上首项为 \(-1\),公差为 \(-1\) 的等差数列,差分维护就能作到线性。
求出 \([1,i]\) 的答案 \(f_i\),\([i,n]\) 的答案 \(g_i\),必须选 \(i\) 的答案 \(h_i\) 后就能快速回答询问了。用斜率优化就能求出 \(f_i,g_i\)。暴力求 \(h_i\) 的作法就是枚举 \(l\leqslant i \leqslant r\),用 \([l,r]\) 的贡献加上 \(f_{l-1}+g_{r+1}\) 来更新 \(h_i\)。考虑分治,对于分治区间 \([L,R]\),只维护出 \([L,mid]\) 的凸包,去更新 \([mid+1,R]\) 的值,这样就保证了 \(l\in[L,mid],r\in[mid+1,R]\),同理还需维护出 \([mid+1,R]\) 的凸包,去更新 \([L,mid]\) 的值。
[ARC066D] Contest with Drinks Hard
建线段树,叶子节点权值为根节点到其的距离,非叶子节点权值为正无穷。询问离线,\(dfs\) 时在线段树上加减对应的权值来实现换根。
设 \(a_{l,r}\) 为两个端点都在区间 \([l,r]\) 内的合法路径数,\(b_{l,r}\) 为两个端点都不在区间 \([l,r]\) 内的合法路径数,\(cnt_i\) 为以 \(i\) 为其中一个端点的合法路径数,不可贵 \(2(a_{l,r}-b_{l,r})=\sum\limits_{i\in [l,r]}cnt_i -\sum\limits_{i\not\in [l,r]}cnt_i\),所以知足 \(\sum\limits_{i\in [l,r]}cnt_i -\sum\limits_{i\not\in [l,r]}cnt_i>0\) 的区间就是合法的。点分治求出 \(cnt_i\) 后双指针统计便可。
枚举每种边权 \(w\),\(\leqslant w\) 的边权值改成 \(0\),\(>w\) 的边权值减去 \(w\),新图的最短路加上 \(kw\) 看做这种边权的权值,每种边权的权值取 \(\min\) 即为答案。考虑到不符合要求的状况必定劣,所以其不会被统计到。由于路径边数可能 \(<k\),因此还要把 \(0\) 加到枚举的边权里。
[NEERC2017] Journey from Petersburg to Moscow
直接对每一个深度进行 \(Trie\) 树合并统计答案便可,复杂度证实类比 \(dsu\ on\ tree\),其余儿子合并到重儿子上,复杂度为轻儿子子树大小和 \(O(n\log n)\)。
可持久化 \(01\ Trie\) 维护来回答询问,异或直接全局打标记便可。剩下的只有 \(and\ 0\) 和 \(or\ 1\) 有用,发现执行这样的操做后同层节点都只会有一个儿子,另外一个儿子会合并过来,所以每次重构后,对于该层的操做打标记便可。重构次数只有 \(O(\log n)\) 次,因此复杂度有保证。
设全部数的异或和为 \(s\),若 \(s\) 的某一位为 \(0\),则 \(x_1,x_2\) 这一位要么都是 \(0\),要么都是 \(1\),由于要总和最大,因此要尽量选 \(1\),等价让 \(x_2\) 这一位尽量为 \(1\)。若 \(s\) 的某一位为 \(1\),则 \(x_1,x_2\) 这一位一个为 \(0\),一个为 \(1\),由于要 \(x_1\) 尽可能小,等价让 \(x_2\) 这一位尽量为 \(1\)。总的策略是让 \(x_2\) 先在 \(s\) 为 \(0\) 的位尽量为 \(1\),再在 \(s\) 为 \(1\) 的位尽量为 \(1\)。用线性基来实现,插入和查询时先考虑 \(s\) 为 \(0\) 的位便可。
[2017 山东一轮集训 Day1 / SDWC2018 Day1] Set
暴力 \(DP\) 就是设 \(f_{i,j,k}\) 为当前考虑到第 \(i\) 位,模 \(p\) 为 \(j\),数位和为 \(k\) 的方案数,转移即为枚举下一个要填的数 \(l\):
由于 \(n\) 过大,考虑倍增:
发现第三维是卷积的形式,用 \(NTT\) 优化便可。
设交集大小钦定为 \(k\) 的方案数为 \(k\) 为 \(f(k)\),交集大小刚好为 \(k\) 的方案数为 \(g(k)\),二项式反演得:
\(NTT\) 能够作到 \(O(n\log n)\),但题目要求线性。设容斥系数 \(\alpha(i)\),其知足:
考虑 \(g(i)\) 的贡献,得:
二项式反演得:
所以复杂度就能作到线性了。
将体积相同的物品一块儿处理,价值从大到小排序。考虑到体积为 \(p\) 的物品时,将模 \(p\) 余数相同的状态分为一类来转移,设余数为 \(q\),状态都形如 \(pi+q\)。发现转移具备决策单调性,由于相同体积的物品取的越多,价值越小。复杂度为 \(O(ck\log k)\)。
形如 \(x_1+x_2+\cdots+x_n=n+d\) 的最终序列的方案数为 \(\binom{d+n-1}{n-1}\),能够证实这些序列成为最终序列的几率相同。先将每一个数减一来将正整数转化为非负整数,设 \(f_{i,j}\) 为全部知足 \(x_1+x_2+\cdots+x_i=j\) 的非负整数序列的前 \(r\) 大的值和的总和,枚举序列中非零位置个数 \(k\) 来转移:
将非零位置都减一就化为子问题了,第二项是子问题序列的贡献。