摘要: 嘟嘟嘟 首先看到k只有50,那么就可以开一个数组预处理出来。 sum[u][k]表示节点u到根节点所有节点深度的k次方和,dfs一遍就都搞出来了,预处理复杂度O(n * 50)(快速幂复杂度不计了)。 查询就是lca复杂度,对于路径(x, y),令z = lca(x, y),则ans(x, y) = 阅读全文
posted @ 2018-10-24 22:21 mrclr 阅读(147) 评论(0) 推荐(0) 编辑
摘要: 嘟嘟嘟 好题,好题…… 看这个修改和询问,就知道要么是求完dfs序后线段树维护,要么是树剖。又因为这道题都是子树的操作,没有链上的,所以线段树就够了。 然而重点不是这个。这道题最麻烦的是线段树pushdown时对于每一个节点打的标记都不一样,因为每一条边上的能力值不一样。这也是这道题最巧妙的一点:我 阅读全文
posted @ 2018-10-24 20:15 mrclr 阅读(210) 评论(0) 推荐(0) 编辑
摘要: 题面好难找:嘟嘟嘟 贪心 + dp。 首先要按bi的降序排序,让每一次减少大的数尽量靠前。为啥咧?于是我们就需要证明:令sum = a1 - (1 - 1) * b1 + a2 - (2 - 1) * b2 + a3 - (3 - 1) * b3 + ……+ an - (n - 1) * bn,整理 阅读全文
posted @ 2018-10-24 17:50 mrclr 阅读(202) 评论(0) 推荐(0) 编辑
摘要: 嘟嘟嘟 水贪心。 当经过一个加油站的时候,记下这个加油站能加的油,然后没油的时候从经过的加油站中选择加油最多的加。 1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<algorithm> 5 #include<c 阅读全文
posted @ 2018-10-24 16:18 mrclr 阅读(403) 评论(0) 推荐(0) 编辑
摘要: 嘟嘟嘟 这道题其实挺显然的。 首先dijkstra跑出最短路图,然后在最短路图上求最小割。 正确性显然。 需要注意的是,在新图中添加最短路图的边的时候,一定是跑完dijkstra再加边,如果边跑dijkstra边加边,得到的是最短路树,而不是图。我因为这个WA了好几发。 1 #include<cst 阅读全文
posted @ 2018-10-24 10:06 mrclr 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 嘟嘟嘟 线段树好题。 其实挺水的,想暴力怎么做:每一次从这个点开始向两边扩,直到遇到第一个摧毁的房屋。 那么把暴力改成倍增,然后线段树查询区间和是否为0。时间复杂度O(nlog2n)。 题解好像有线段树的O(nlogn)的做法,但是特别麻烦,也没怎么看懂。 1 #include<cstdio> 2 阅读全文
posted @ 2018-10-24 08:08 mrclr 阅读(234) 评论(0) 推荐(0) 编辑