摘要: ```cpp #include #include #include #include #include #include #include #include #include #include #include #include //#include #include #pragma GCC optimize(2) #define up(i,a,b) for(int i=a;ib;i--) #de 阅读全文
posted @ 2020-03-06 21:32 LORDXX 阅读(123) 评论(0) 推荐(0) 编辑
摘要: 通过观察可以发现,当以u为根节点的时候,向他的子节点转移x次,此时差值固定,即等差数列。 我们就可以通过树链剖分,给每一条链上,维护线段树,保存等差数列。 最后再通过求前缀和的方式求得。 阅读全文
posted @ 2020-03-06 21:28 LORDXX 阅读(107) 评论(0) 推荐(0) 编辑
摘要: 分块+暴力。 对于每一块来说。如果更新不是一整块,我们直接暴力重构,如果是一整块更新的话,就给这一个块打上一个标记。 当询问的时候,我们二分答案,对于不是一整块的区间,暴力。 对于是一整块的区间,我们优先判断他和标记的大小。如果标记更大,那么由于这一道题更新的时候,区间只取min,故块中的所有数据不 阅读全文
posted @ 2020-03-06 21:25 LORDXX 阅读(96) 评论(0) 推荐(0) 编辑
摘要: 令len[x]表示特殊点(即要去的地方)到u的距离。 那么从u出发 走完所有特殊点所需要的代价是 2 [sigma(len[x])] max(len[x]) 令dp[u]表示从小到上,特殊点到u的距离和。我们如果从1出发,sigma(len[x])就可以通过一次dfs求得。我们令sum表示距离和。 阅读全文
posted @ 2020-03-06 16:28 LORDXX 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 令dp[n][k]表示 长为n的序列 分成k段 所需要的最小代价。 我们暴力转移。 dp[i][t]=min(dp[i'][t 1]+cost[i'+1][i]) (其中i'小于i) 对于这种dp我们首先考虑线段树dp,我们可以找到min(dp[i'][t 1]),但是没有办法统计cost的值。所以 阅读全文
posted @ 2020-03-06 16:15 LORDXX 阅读(144) 评论(0) 推荐(0) 编辑