摘要:
首先最小斯坦纳树求出连接所有重要情报站的最小代价。 然后状压每个频道做一遍子集DP就完事了。 代码: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> #include< 阅读全文
摘要:
给定一个包含 \(n\) 个点和 \(m\) 条边的无向联通图 \(G=(V,E)\)。 再给定包含 \(k\) 个结点的点集 \(S\),选出 \(G\) 的子图 \(G'=(V',E')\),使得: \(S\subseteq V'\); \(G'\) 为连通图; \(E'\) 中所有边的边权和最 阅读全文
摘要:
代码: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #include<queue> using namespace std; const int N=109,INF=1<<30; int n,m, 阅读全文
摘要:
容易发现这就是后缀排序后连续 \(k\) 个后缀的 \(lcp\) 的最小值的最大值,用单调队列跑一遍 \(height\) 数组即可。 代码: #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #in 阅读全文
摘要:
对每一条边单独考虑其贡献。 我们现在想算有多少连续区间跨过了这条边。正难则反,我们考虑有多少连续区间不跨过这条边,最后用总的减去这些。所以我们只需要计算当前子树内和子树外的连续区间的贡献就行。 考虑 dsu on tree。子树内用并查集维护并计算极长子段的贡献,子树外用set维护其补集并计算贡献即 阅读全文
摘要:
考虑点分治。 考虑如何合并线段 \(\sum\limits_{i=1}^{n}i\times a[i]\) 和 \(\sum\limits_{j=1}^{m}j\times b[j]\)。新线段的表达式 \(\sum\limits_{i=1}^{n}i\times a[i] + \sum\limit 阅读全文
摘要:
首先考虑判断两个点 \(a,b\) 在一个询问 \((l,r,x)\) 下连通:\(path(a,b)\) 上的点的编号都在 \(l \sim r\) 之间,可以用倍增预处理。 对原树建立点分树。对于每个询问 \((l,r,x)\),我们考虑找到这样一个点: 这个点是 \(x\) 在点分树上的祖先 阅读全文
摘要:
闲聊 看到树上路径问题点分治肯定可以做 看了一下其他题解好像没有具体介绍如何不重不漏地计数以及一些细节(其实是我太菜了没看懂 蒟蒻我做点分题还没有用过容斥定理,一般都是在每颗子树里跑一遍的时候直接累加前面已经跑过的贡献QWQ 前置芝士 点分治 平衡树(其实可以不用,但因为我不太会容斥,而且这题边权比 阅读全文
摘要:
强行把李超线段树搬到树上。然后这题我调了两天,最后发现数组开小了。。。 我们发现题目就是把凸包放到树上然后求最值。用树剖把树化为序列,然后直接李超线段树就可以了。 惨痛的教训:一共插入的线段数量是 \(O(nlogn)\) 级别的,数组一定要开大/lb。 代码: #pragma GCC optimi 阅读全文
摘要:
我竟然为这题的函数不能拆成完成积性函数想了两个小时(捂脸)。 看到这么大的数据范围和求前缀和的要求,我们首先想到了Min_25筛。 设 \(f(i)=\sigma_0(i^k)\),则 \(f(p^e)=ke+1\)。 啊啊啊这个 \(f\) 没有办法拆成完全积性函数,所以我们就求不了 \(f\) 阅读全文