1
树上每次询问两点间的最大流,支持花费a的费用增加一条流量为1的边,花费b的费用给一条边扩容,最多花费k元。
首先如果加边不必扩容贵,那么肯定只加边
分情况讨论,取max:
1.只加边
2.只扩容
3.先加边然后在这条边上扩容
1、3种情况很好处理,倍增求一下路径最小值就好了
对于第二种情况,我们可以二分流量扩成了多少,那么原来小于这个流量的边都应该被扩容到这个流量
问题变成了查询一条链上小于某个数的和。于是在树上建主席树。
由于主席树本身是一个二分结构,所以直接在主席树上二分就好了。看一下能不能扩容到mid,能就往右走,否则往左走。
复杂度
O(nlogn)
O
(
n
l
o
g
n
)
2
树上询问最远同色点的距离,带修改。(bzoj3456)
考虑点分治
带修改点分治怎么做?
发现每次只会修改一颗子树的值。
每颗子树维护黑色最大值堆,白色最大值堆,和的最大值堆
3
n个点无向联通简单图个数
令
hi
h
i
表示n个点构成的所有图的数量
fi
f
i
表示n个点构成的连通图的数量
gi
g
i
表示n个点构成的不连通图的数量
显然,
fi=hi−gi , hi=2n∗(n−1)/2
f
i
=
h
i
−
g
i
,
h
i
=
2
n
∗
(
n
−
1
)
/
2
考虑如何求
gi
g
i
。
假设我们固定一个点,枚举这个点所在的联通块大小,可得:
把组合数展开,合并一下:
求
fi
f
i
。
一个叫做分治fft的神奇的东西。
fi
f
i
乘上
hj
h
j
会对
fi+j
f
i
+
j
产生贡献。
看起来像是一个卷积的形式。
考虑cdq分治,先计算左边,再计算左边堆右边的贡献。合并的时候用fft。
一道裸分治fft:hdu 5730
4
n个点m条边的无向图,询问保留编号在[l,r]的边的时候图中联通快的个数。
一开始的思路是按照询问区间的右端点排序,然后类似莫队的方法,r右移的时候一条一条往里加边,维护连通性。
问题是l左移时不能只删除掉这些边,因为删掉以后后面可能还有边会加进来。
考虑从右往左加边。
这样从左向右删边的时候,如果是一条树边 那么删掉以后联通块数量一定加一,因为他后面没有可以替代他的边了。
但是这样就处理不了第三个区间了。
可以发现我们要做的其实是选择尽量靠右的边做一颗生成树。
所以从左到右加边,如果有环,找到环上编号最小的边,删去。
如果要加进a要先删掉b,连边a->b。
用lct维护这个过程。
联通块个数等价于总点数-树边数量(因为每一条树边相当于合并两个联通块)。
区间内树边数量等于区间内箭头指向左端点左侧的边的数量。
上主席树。
5
点修改 换根 改链 询问子树最大值
(不基于dfs序)
询问子树最大值
就是它所有儿子的最大值取max和自己取max
维护一个堆
1.重儿子
2.轻儿子
对于2.维护一个堆,存它所有沿着轻边向下走的子树在最大值
对于1, 查询他的重儿子 递归往下做
修改一条路径 最多经过log条轻边,更改一下
2353
先手必胜当且仅当变数为偶数
一条边xy可以删除当且仅当xy度数奇偶性相同
也就是说xy项链的原来能删的边变得不能删了
不能删的边变得能删了
推一波狮子
假设总共有k条边能k-a-b
k-1-a-a+(d_p1-a-1)+(d_p2-b-1)
原来有奇数条边现在有偶数条边
所以有奇数条可删除的边必胜
任何一条不可删除的边一定链接一个基点和一个偶数点
一张图的度数和为偶数
所以一定有偶数个度数为奇数的点
折半搜索 fft