首页 > 其他分享 >WC 2018 题解

WC 2018 题解

时间:2023-01-09 14:34:46浏览次数:42  
标签:p1 WC log 题解 len que 2018 poi mathrm

A

若干套路拼起来的胖题。

设这三棵树分别是 \(T_1,T_2,T_3\)。沿用“CTSC 2017 暴力写挂”的思路,对第一棵树点分治,此时要处理的是以 \(u\) 为中心的一块在 \(T_1\) 上的连通块。一个直接的思路是,直接将当前连通块内的所有点都放在第二棵树上建虚树,并将在 \(T_1\) 上处于 \(u\) 的不同儿子的子树内的点染不同的颜色。预处理每个点到 \(u\) 的距离 \(d_x\) 和颜色 \(c_x\),需要求出

\[\max_{c_x\neq c_y}\{d_x+\mathrm{dep'}_x+d_y+\mathrm{dep'}_y-2\mathrm{dep'}_{\operatorname{LCA'}(x,y)}+\operatorname{dist''}(x,y)\}. \]

令每个点的点权 \(w_x=d_x+\mathrm{dep'}_x\),在虚树上枚举 \(v=\operatorname{LCA'}(x,y)\),直接维护 \(v\) 子树内的两端点颜色不同的带权直径。但这里实际上有一些问题,如果有 \(>2\) 种颜色,那么这里的直径需要记录很多条。

考虑点分治过程中,每次取出大小最小的两个子连通块做上述过程,并将这两个连通块合并。通过这个,我们可以做到与边分治相同的功能。此时,虚树上只有两种颜色,直接记录这两种颜色各自的带权直径,计算答案也是容易的。

时间复杂度 \(O(n\log^2 n)\),或者 \(O(n\log n)\)。

“合并”处的代码:

priority_queue<Block> que;
que.push({ 1,1 }), poi[len = 1] = u;
col[u] = u, val[u] = t2.dep[u];
for (auto [v, w] : t1.e[u]) if (!vis[v]) {
	int l = len + 1;
	GetDep(v, u, w, len);
	sort(poi + l, poi + len + 1, Comp);
	que.push({ l,len });
}
while (que.size() > 1) {
	auto p1 = que.top(); que.pop();
	auto p2 = que.top(); que.pop();
	int l = len + 1;
	len = merge(poi + p1.l, poi + p1.r + 1, poi + p2.l, poi + p2.r + 1, poi + len + 1, Comp) - poi - 1;
	For(i, p1.l, p1.r) col[poi[i]] = 1;
	For(i, p2.l, p2.r) col[poi[i]] = 2;
	VBuild(l, len), VDFS(1), Clear(1);
	que.push({ l,len });
}

B

有一个显然的 \(O(3^n)\) 做法。其中的瓶颈在于“半在线子集卷积”:给定 \(\{a_i\}_{i=0}^{2^n-1},\{b_i\}_{i=0}^{2^n-1}\),求

\[f_S=a_S\sum_{T\subsetneq S} f_Tb_{S\backslash T}. \]

做法以后写。

C

每次随机一个还未探索到的点 \(u\)。显然在任意时刻,已经探索过的点是一个包含点 \(1\) 的链,设其链头为 \(l\),链尾为 \(r\)。只需要花费多余的一次操作判断 \(u\) 接在链头还是链尾,然后将 \(l\leadsto u\) 或 \(r\leadsto u\) 的路径上的点都探索一遍即可。

毛估估一下,需要的询问次数是 \(n+\log n+O(1)\) 的。

一般的树

考虑当前已经扩展过的连通块 \(S\)。每次找到一个没被探索过的点 \(u\),并在 \(S\) 中进行点分治,直到分治到未被探索过的点,这样就找到了 \(u\) 会接在哪个点上。

这样的时间复杂度是 \(O(n^2)\) 而询问次数是 \(n\log n\)。考虑动态地维护一个点分树,每次需要支持在某个点底下接上一个叶子。我们做类似替罪羊树重构的操作:设定阈值 \(\alpha=0.8\),当加入一个叶子 \(x\) 时,考虑 \(x\) 到根的路径,找到其中深度最浅的一个点 \(v\) 满足 \(\mathrm{size}_v>\alpha\times \mathrm{size}_{\mathrm{fa}_v}\),若存在这样的 \(v\),则对 \(v\) 的子树进行重构。

注意重构时整棵树的结构可能完全改变了,写的时候需要注意 \(\mathrm{size}_x\) 的更新。

时间复杂度 \(O(n\log^2 n)\),询问次数 \(O(n\log n)\)。

标签:p1,WC,log,题解,len,que,2018,poi,mathrm
From: https://www.cnblogs.com/alan-zhao-2007/p/wc2018-problems.html

相关文章

  • FlashDevelop专用swc导出插件
     主页:​​http://sourceforge.net/projects/exportswc/​​ 下载:见附件 双击安装之后重启fd即可。   ......
  • rwctf体验赛-Snake详解
    首先展示一下apk中的内容,一个简单的贪吃蛇游戏静态分析蛇撞墙会有提示,直接去看定位到com.example.ct_sanke.SnakeView.i()i()方法只有一处调用,随着蛇吃食物进行逻......
  • CF652F 题解
    题意传送门在一个长度为\(m\)的圆环上有\(n\)只初始位置互不相同的蚂蚁,每只蚂蚁的速度都为\(1\),初始方向为顺时针或逆时针;两只运动方向不同的蚂蚁相遇时会调转方向,......
  • [SWPUCTF 2018]SimplePHP
    [SWPUCTF2018]SimplePHP考点:1、PHP代码审计 2、Phar反序列化漏洞网站中有两个功能:查看文件和上传文件,利用查看文件将源码都先弄下来进行PHP代码审计。file.php<?php......
  • Codeforces 1671 F Permutation Counting 题解
    题目链接把\(p_i>p_{i+1}\)的位置个数称为间隔数首先想到一个暴力做法。从小到大挨个添加1-n中的每个数,注意到添加数i时,只能添加到当前序列的最后11个位置中,否则逆序对数......
  • Luogu P4591 [TJOI2018] 碱基序列
    链接难度:\(\texttt{省选/NOI-}\)有\(k\)组,每一组有\(a_i\)个字符串\(t_{k,a_i}\),询问分别在每一组选一个字符串拼成的字符串在文本串\(s\)出现的个数的所有情况......
  • LibreOJ L2576 「TJOI2018」str
    链接难度:\(\texttt{?}\)有\(k\)组,每一组有\(a_i\)个字符串\(t_{k,a_i}\),询问分别在每一组选一个字符串拼成的字符串在文本串\(s\)出现的个数的所有情况的总和对......
  • 2018年各大赛事题解
    大多数题解都是口胡,不保证正确性,有错请指出,谢谢。CQOI2018除了“交错序列”和“九连环”两道数学题以外,全是板子题,遭不住了。破解D-H协议BSGS板子题,时间复杂度\(\m......
  • Atcoder ABC284 前五题题解
    ABC284A-SequenceofStrings题意:有n个字符串\(s_1,s_2,s_3,...,s_n\),要求按\(n,n-1,n-2,...,1\)的顺序输出样例:输入3TakahashiAokiSnuke输出......
  • Codeforces 1305 F Kuroni and the Punishment 题解 (随机算法)
    题目链接首先注意到每个数最多操作1次就能让他变成2的倍数,所以答案\(\len\)。如果我们能枚举[1,1e12]中所有的质数,并对每个质数p求出把数组中所有数都变成它的倍数的最少......