可持久化线段树 maya……树么……转化成序列……所以就写了个树链剖分……然后每个点保存的是从它到根的可持久化线段树. 然后就像序列一样查询……注意是多个左端点和多个右端点,处理方法类似BZOJ 1901 然后rausen(Orz!!!)粗来跟我说:你直接减去lca和fa[lca]不就好啦~搞树剖还多一个log…… 我恍然大悟!然后两个都交了一下,事实证明:我链剖写的还行,LCA写的太丑……速度反而是多一个log的链剖快QAQ(另:因为边少我就偷懒没写边表,直接vector水过) 链剖: /**…
[BZOJ1415][NOI2005]聪聪和可可(动态规划,数学期望) 题面 BZOJ 题解 先预处理出当可可在某个点,聪聪在某个点时 聪聪会往哪里走 然后记忆化搜索一下就好了 #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #i…
[BZOJ2684][CEOI2004]锯木厂选址(斜率优化,动态规划) 题面 万恶的BZOJ因为权限题的原因而做不了... 我要良心的提供题面 Description 从山顶上到山底下沿着一条直线种植了n棵老树.当地的政府决定把他们砍下来.为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂. 木材只能按照一个方向运输:朝山下运.山脚下有一个锯木厂.另外两个锯木厂将新修建在山路上.你必须决定在哪里修建两个锯木厂,使得传输的费用总和最小.假定运输每公斤木材每米需要一分钱. Input 输入的第一行为…
[BZOJ4911][SDOI2017]切树游戏(动态dp,FWT) 题面 BZOJ 洛谷 LOJ 题解 首先考虑如何暴力\(dp\),设\(f[i][S]\)表示当前以\(i\)节点为根节点,联通子树权值和为\(S\)的方案数,转移就是\(FWT\)的卷积,最后只需要把所有的\(f[i][k]\)全部加起来就可以得到最终的答案. 于是这样子的复杂度就是\(O(Qnmlogm)\).但实际上转移的时候不需要\(FWT\)回来,直接拿点值表示的数组做就可以了,这样子可以少一个\(log\). 那么…
[BZOJ2324][ZJOI2011]营救皮卡丘(网络流,费用流) 题面 BZOJ 洛谷 题解 如果考虑每个人走的路径,就会很麻烦. 转过来考虑每个人破坏的点集,这样子每个人可以得到一个上升的序列. 预处理\(dis[u][v]\)表示\(u\rightarrow v\)在不经过标号大于\(max\{u,v\}\)的点的情况下的最短路. 这个可以\(Floyd\)预处理. 不妨把\(0\)号点加入到每个人的序列开头,这样子一个假设一个人的序列是\(P\),那么他经过的所有边的和就是\(\sum…
[BZOJ4061][Cerc2012]Farm and factory(最短路,构造) 题面 BZOJ 然而权限题QwQ. 题解 先求出所有点到达\(1,2\)的最短路,不妨记为\(d_{u,1},d_{u,2}\). 那么假设新点是\(x\),任意一个点\(u\). 那么可以得到几个不等式:\(d_{u,1}\le d_{u,x}+d_{x,1},d_{u,2}\le d_{u,x}+d_{x,2}\).同理还有几个类似的不等式. 而题目限制又要求\(d_{u,x}\)最小, 因此\(d_{…
[BZOJ5303][HAOI2018]反色游戏(Tarjan,线性基) 题面 BZOJ 洛谷 题解 把所有点全部看成一个\(01\)串,那么每次选择一条边意味着在这个\(01\)串的基础上异或上一个有\(2\)个\(1\)的\(01\)串. 那么把边构建线性基,最终的答案显然就是\(2\)的不在线性基里的边数次方. 显然每次只需要考虑一个联通块,一个联通块随便拉出一棵生成树,就可以在线性基上确定\(n-1\)个元,那么对于其他边任意的情况,显然可以通过修改这\(n-1\)条边的选择情况使得最终…
[BZOJ1185][HNOI2007]最小矩形覆盖(凸包,旋转卡壳) 题面 BZOJ 洛谷 题解 最小的矩形一定存在一条边在凸包上,那么枚举这条边,我们还差三个点,即距离当前边的最远点,以及做这条边的垂线的最靠左和最靠右的两个点. 最远点很容易求,叉积计算面积来比就好了. 那么剩下两个点呢? 比如说找右侧的那个点,我们假装当前枚举出来的这条边就是水平线,那么只要当前的点和下一个点的直线与\(x\)轴正半轴夹角小于\(90°\) 显然就往这个方向走.然后从水平线换到一般的情况,也就是和枚举的这条…
[BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n\)列的,每个数和前面\(n\)个数的最大值,最小值同理,就做完了. #include<iostream> #include<cstdio> using namespace std; #define MAX 1010 inline int read() { int x=0;bool t…
[BZOJ3437]小P的牧场(动态规划,斜率优化) 题面 BZOJ 题解 考虑暴力\(dp\),设\(f[i]\)表示强制在\(i\)处建立控制站的并控制\([1..i]\)的最小代价. 很显然,枚举上一个控制站的位置\(j\) \(f[i]=min(f[j]+Calc(i,j)+a[i])\),其中\(Calc(i,j)\)表示\(i,j\)之间被\(i\)控制的位置产生的贡献. 这个可以用前缀和优化做到\(O(1)\)计算\(Calc\) 预处理\(s1[i]=\sum b[i],s2[i…