随笔分类 - 《洛谷永远滴神》
orz!!
摘要:可以发现,统计同k级祖先数,可以看成统计k级祖先k级儿子有几个。 那么,就可以dsu on tree来统计了。 依据上面的思路,我们就可以把询问挂到k级祖先上,把询问变成统计以该祖先为根的深度为k的孩子数为多少。 那么,首选就是找这个k级祖先,因为暴力找肯定会T,所以我们可以倍增跳。 然后挂上询问,
阅读全文
摘要:挺好的一道题: 首先,可以dsu on tree做。 这里的精髓就是当奇数个数的点 <= 1时,就能构成。(这里对2取模了。) 那么可以用异或操作来实现对二取模。同时异或两次也就相当于没有做异或操作。 所以也可以用异或来清空轻儿子的贡献。 那么就需要状压每个字母的状态。因为只有26个字母。 这里还有
阅读全文
摘要:题意:统计每个子树里的最多颜色编号和。 注意的是,如果有多个颜色编号次数一样,那么都要加上。所以这里会爆int。 思路:dsu on tree的模板题吧。 对于重儿子保留操作,轻儿子删去。 也就是说暴力的一种优化,复杂度nlogn,不会证明。 一些细节:注意的是,所谓轻儿子的清空,就是对统计做一次-
阅读全文
摘要:带修改的莫队: 在普通莫队的基础上维护了一个修改的结构体。加上了一维时间戳。 对于查询操作,记录最近的修改位置。然后在查询操作中。 对于查询之后,还需要去维护一个修改操作,并且要维护对答案的影响。 这题有点卡常,还好我卡的好(逃 // Author: levil #include<bits/stdc
阅读全文
摘要:第一眼:啊,大水题,直接上莫队分块,70分,原地懵逼。 因为出题人疯狂加强数据,莫队的复杂度已经跟不上了orz。 考虑新的解法:首先,我们可以统计一个数出现的位置。 我们先对询问离线,进行r的升序。 那么可以发现,就算前面出现过当前数,也只能算作一个数,且因为我们按r升序。 那么这个数越后面就越能影
阅读全文
摘要:其实是很水的一道题,但是由于我没有算好ans的数组大小导致一直wa。。 就是莫队分块,然后统计一下不同的个数。我们只需要看一个数出现是否>0来计算即可 // Author: levil #include<bits/stdc++.h> using namespace std; typedef long
阅读全文
摘要:很显然是树形DP。 第一眼定义了f[u][i]表示向上覆盖i长度的最小代价。 但是因为这里的D是圈的影响范围,所以下面的点也会被该点影响到。显然不能这么简单处理。 我们再定义g[u][i]表示u点向下i层以下(包括i层)被覆盖的最小代价。这样中间空开的i长度也会得到处理。 这里我们可以思考一下转移:
阅读全文
摘要:首先注意题意,是统计>=k的个数。 那么首先考虑一下暴力的思路,用cnt[i]来表示次数>=i的个数。 考虑删去一个点,那么cnt[c[i]]--。注意的是cnt[c[i]-1]不需要++,一开始误区就在这了,因为cnt[c[i]-1]还是满足>=c[i]-1的。 那么加入一个点,cnt[c[i]+
阅读全文
摘要:提供两种解法。 第一种:直接对询问离线,然后莫队分块。 我们用一个数组vis来统计每个数出现的次数,然后维护区间内出现次数超过2的数量即可。 一开始加了个vis[i] = max(vis[i],0)防负数操作还wa了,这样其实有点违背统计思想了。 // Author: levil #include<
阅读全文
摘要:这就是国家集训队嘛i了i了。 关于路径的统计。 考虑对所有路径都对3取模。 然后路径数就是关键了。 设长度为0的路径为n0,长度为1的路径为n1,长度为2的路径为n2 那么1和2组合肯定可以为0。因为反转也算不同的路径,所以要*2。 所以方案数为n1*n2*2; 这里的难点在于与长度为0路径的计算。
阅读全文
摘要:也是点分治的简单题。(对我来说算难了orz.) 首先这里的难点就在于查询是否存在长度k。 如果我们每次都去对询问进行一次点分治,显然是过于浪费了。 所以我们可以离线做它。 在点分治过程中统计所有答案。 那么怎么统计答案,又是一大难点,如果要直接按之前找k点对的统计。 那么容斥删点的时候,需要找遍所有
阅读全文
摘要:显然第一眼用线段树合并线性基即可。 对于线段树复杂度nlogn。合并logn,插入logn.。 总复杂度在nlogn^3。对于这里的5e5,依旧会超时。 考虑其他的思路:这里用了和某道树上查询的紫题差不多的思路。 我们让线性基尽可能靠右,然后只需要判断是否在区间内即可。 因为预处理出了所有点,那么查
阅读全文
摘要:第一眼就觉得是个DP。一开始想的背包枚举对应长度时的最小代价。 但是这样复杂度是N*M,显然会T。 正解:不需要去考虑凑成长度的最优代价。 用dp[i]来表示到把到i包括i的牛全覆盖掉的最小代价。 那么对于每一个i,我们去枚举转移的位置j,这样最优的方案里会包括上最优的组合法(包括重复选同一个) 那
阅读全文
摘要:第一眼就觉得是费用流,但是建图确实很麻烦,逐渐递增这个费用到时想到了 solution: 首先,对于每一个事件,我们从s向这个事件连一条容量为1的边,然后对于这个事件,向两个点连一条容量为1的边。 这样满足了事件的关系。可以发现,我们的容量还是由s->事件的1来控制,只是有两个点的选择,即哪个点胜利
阅读全文
摘要:首先,这题要对题意先进行一个转化。 可以发现,这是一棵树,并且,我们要删点,肯定要从叶子节点开始删,才能保证在大于2个点时。 每个点最少存在一个朋友。 那么,我们主要要去分析,当我们加入关系边时,有哪些点无法作为最后点了(如果没有关系边,那么从一个点两边删,肯定每条边都会满足) 从遥远的国度借鉴经验
阅读全文
摘要:题意:懂得都懂。 首先考虑到这题如果没有换根的操作,那么很显然就是一个裸的树剖部分,那么随便搞搞就能过了。 对于加上了换根的操作。 我们来对询问进行一个分类讨论。 我们统一以1为根来建树: 如果当前的询问的点等于根,那么显然就是全局最小值,就是node[1].mi。 如果当前的询问的点在不在1->r
阅读全文
摘要:思路: 观察后可以发现。 卸载操作就是删除子树上存在的点(包括自身). 安装操作就是添加上该点到根的链上的所有点。 树剖重链,线段树维护重链。 对于卸载很简单,删去子树上的值即可。 对于安装。不断跳到链头,直到到根即可。 对于查询有多少只改变了。 只需要记录改变前的值,然后查询改变后的值。 一减就是
阅读全文
摘要:思路: 显然那个集合点肯定是某两个点的LCA。 因为到LCA,两个点走的距离不会重叠。另外一点到LCA也没有重叠。 那么直接枚举LCA判断就行。 这里时间卡的很紧。 于是:链式向前星存图,倍增常数优化,卡卡常。 Code: #include<bits/stdc++.h> using namespac
阅读全文

浙公网安备 33010602011771号