摘要:
关键点在于:全排列中,任意两点u、v相邻的次数一定是(n - 1)! * 2次,即一个常数(可以由高中数学知识计算,将这两个点捏一起然后全排列然后乘二;或者用n! / C(2, n))。 这之后就好算了,每条边算一下子树size对吧,乘法原理就是贡献次数,乘以边权加一起就行了。 所以不是dfs就行了 阅读全文
摘要:
Update:smz说regex秒过Orz,yzd记在这里了。 听说今年天梯赛有个烦人的模拟,我便被队友逼着试做一下……一发15,二发20.记一记,要不然枉费我写这么久…… 自己还是代码能力太菜了,校内大佬依旧随手A过去,你吉老师该AK还是AK…… 调调改改的,很丑,懒得优化写法了。 大概思路就是先 阅读全文
摘要:
据说这题是种dp的套路?然后被我国红名神仙(南大Roundgod)贪心了,不过思路上非常相近了,故而可贪吧。 设的dp[i][0]是:如果把第i个数放在上升序列里了,那么下降序列结尾的那个最大是多少;同理,dp[i][1]是:如果把第i个数放在下降序列里了,那么上升序列结尾的那个最大是多少。 个人y 阅读全文
摘要:
发现奇环不可行,偶环可行,考虑二分图。然后染色,方向全都从一种指向另一种就可以了,随意。 阅读全文
摘要:
题目传送门 性质是:把节点dfs序以后,异象石按这个序号排序,然后相邻两两求树上距离,这些距离的和除以二就是最小斯坦纳树。 插入删除的具体操作是根据我们上述性质,用一个set维护dfn,比如插入x,则ans加上:(set里的,即之前已经插进来的)左x + x右 - 左右。 阅读全文
摘要:
会卡vector。 阅读全文
摘要:
1 const int maxn = 4e4 + 5; 2 int T, n, m; 3 int f[maxn], vis[maxn], dis[maxn], ans[maxn]; 4 vector vc[maxn]; 5 vector query[maxn], id[maxn]; 6 7 inline int getf(int v) { return v == f[v] ? v... 阅读全文
摘要:
结论是:按位置排序好以后,对于真正的答案,走法应该是:依次走向第0个等分点,第1个等分点……这样对于这种等分情况,是最优的调度。 阅读全文
摘要:
1.答案要取连续的区间疯狂暗示线段树。 2.外层枚举r,内层枚举l显然过于暴力。 3.考虑内层的优化。dp[i]:以第i位为结尾的答案(长度大于1的)。dp[i] = max(第一种情况,第二种情况)。解释一下,首先我们可以做到求出i前面gap[j] > gap[i],j < i最大的j的位置pos 阅读全文
摘要:
用solve(l, r, prefix)代表区间l开始r结束、带了prefix个前缀str[l](即l前面的串化简完压缩成prefix-1个str[l],加上str[l]共有prefix个)的最大值。 每层可以选择: 1.直接“提现”,把起始位和前面的“存款”直接提出来,再计算l+1~r区间的值; 阅读全文