树剖/dsu on tree/线段树合并【雨天的尾巴】 [Vani有约会]雨天的尾巴 题目链接 一道好板子 甚至能当三个板子( 树链剖分 vector<int> add[maxn], del[maxn]; vector<int> vp[maxn]; int dep[maxn], siz[maxn], son[maxn]; int fat[maxn], top[maxn]; void dfs1(int p, int fa 2022-04-13 题解 #板子 #数据结构
Atcoder Beginner 246 EFG E - Max Min 题意:给出一个序列,问有多少个子区间满足 \(max=X\) 且 \(min=Y\) 我的解法(下面还有另一种神仙解法: 枚举区间的左端点,然后二分区间的右端点,二分两次,分别找第一个使得区间max>X或min<Y的右端点,和第一个使得区间max>=X且min<=Y的右端点。简单来说就是找第一个达到要求的位置和第一个超出要求范围的位置。 2022-04-11 题解 #Atcoder #题解
Educational Codeforces Round 126 A-F A. Array Balancing 题意:给出序列 \(a\) 和 \(b\),可以任意交换相同位置的 \(a_i,b_i\) ,求 \(\sum|a_i-a_{i-1}|+|b_i-b_{i-1}|\) 的最小值 显然,把小的放一边,大的放另一边一定最优。 int n, m; int a[maxn], b[maxn]; void solve(){ cin & 2022-04-10 题解 #题解 #codeforces
Codeforces Round 781 div.2 CDE C. Tree Infection 题意:给定一棵树,一开始所有节点都是未传染的状态,接下来每一秒,可以手动传染一个新节点,同时已经被传染的节点会传染它的一个兄弟节点。问最短多少秒能够传染所有节点。 首先容易发现,这个树并没有什么用,我们可以把连同一个父节点的点分成一组,组与组之间是无关的。 看起来是个简单题了,\(n\) 秒内一定能传染完,那么模拟即可。然而这个模拟还是有点恶心的,不要想 2022-04-09 题解 #题解 #codeforces
Atcoder Beginner 246 FG EX F - typewriter 题意:给出 \(n\) 个字符串和一个长度 \(L\),接下来你可以任选一个字符串,并且只用这个串内有的字符来打字(不限制字符顺序,数量),问可以打出多少中长度为 \(L\) 的字符串。数据范围 \(N<18\),\(L<10^9\) 第一种想法(没a):可以暴力枚举所选的字符集,一共 \(2^{26}\) 种情况,先预处理出每一种字符在哪些给 2022-04-07 题解 #Atcoder #题解
Atcoder Beginner 245 G G - Foreign Friends 题意:给出一个带边权的无向图,每个点有一个颜色,其中还有若干个特殊点。现在要求输出:每个点前往一个颜色与自己不同的特殊点的最短距离 解法:首先不考虑颜色,这个题就是一个魔改的dij,初始将所有特殊点加入队列跑一遍即可。 然后我们考虑颜色,可以将颜色按照二进制位拆开,枚举每一位,将所有在这一位上为0的特殊点加入队列跑一遍dij,并且更新在这一位上为1的点 2022-03-31 题解 #Atcoder #题解
Codeforces Round 779 div.2 D2F D2. 388535 (Hard Version) 题意:给出两个数 \(l,r\) 和一个数字集合 \(a\),有某个 \(x\),使得 \([l,r]\) 范围内的这些数分别异或上 \(x\) 之后,结果恰好能组成序列 \(a\)。要求找到一个合法的 \(x\),保证有解。 对于每一位去考虑:如果在某一个二进制位上,两边集合0和1的个数不相等,比如 \(l...r\) 中共有3个0,2 2022-03-29 题解 #题解 #codeforces