随笔分类 - 题解
摘要:ABC380F. Exchange Game 因为 \(n+m+k\leq 12\),考虑状压 dp,设 \(f(x,s1,s2,s3)\) 表示 先手,后手,桌子上的牌分别是哪一些,这有 \(O(3^n)\) 种状态。 然后只要枚举出哪一张即可,有 \(f(s1,s2,s3)\to f(s2,s1
阅读全文
摘要:注意到如果可以构造出所有由 \(\texttt{A}\) 和 \(\texttt{B}\) 组成的字符串,那么在图上游走的路径必须成环,并且的环上的每一个点都必须同时有一个 \(\texttt{A}\) 邻居和 \(\texttt{B}\) 邻居。 于是可以考虑把点拆分为入点和出点,相邻两个点为 \
阅读全文
摘要:A - Sort Left and Right 答案为 0 即已经排序。 考虑答案为 1 的情况:一定是存在一个 \(p\),使得 \(\min_{i=1}^{p}a_i=p\) 且 \(a_p=p\),这时只要选择 \(p\) 即可。 考虑答案为 2 的情况:如果 \(a_1\neq n\oper
阅读全文
摘要:如果边数为奇数,一定无解。 如果边数为偶数,一定有解。考虑证明: 我们可以先随便定向,然后给每个点 \(i\) 一个值 \(a_i\in\{0,1\}\),表示出边条数奇偶性。 然后随便考虑图的一颗生成树。 注意到一条边 \((u,v)\) 翻转定向会让 \(a_u\gets 1-a_u,a_v\g
阅读全文
摘要:弱化版:CF280C Game on Tree(有向图的限制变成一棵根节点为 1 的外向树) 弱化版解法: 根据期望线性性,\(Ans=\sum_{i=1}^nE(p_i)\)。 其中 \(p_i\) 是 \(i\) 被选到的概率。 因为对于 \(i\) 和 \(i\) 的祖先节点,某个点在这些店里
阅读全文
摘要:注意到只要随便 dfs,如果没有可以走的点,说明这个端点满足要求。 因为有两个端点,所以从同一个点开始搜两次,拼在一起就行了。 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 1e5 +
阅读全文
摘要:注意到如果把每一对胜者败者连边,可以得到一颗树: (例子) 但是因为胜者每次只能和一个败者打,所以要用类似多叉转二叉的方法,让有不止一个孩子的节点变成有一个孩子和一个虚点。 如图,原来 \(1\) 有三个儿子 \(2,3,4\),通过转换,变成了上图。 上图可以直接变成对战图(\(x2\to x1\
阅读全文
摘要:注意到第 \(i\) 行和第 \(i+2\) 行被删除的格子的排列顺序相同,格子上的数差了 \(2m\)。 于是处理出第 \(i,i+1\) 行的答案 \(a_i,a_{i+1}\),有值的格子的个数 \(c_i,c_{i+1}\)。 令 \(s(i)=\dfrac{(i-1)i}2\),也就是 \
阅读全文
摘要:考虑贪心。 设字符串 \(S\) 里数字之和为 \(S_d\),X 的个数为 \(S_c\)。 考虑相邻的两个字符串 \(A,B\) 的贡献: 考虑临项交换,这只影响到相邻两个串的相互贡献。 注意到交换 \(A,B\) 只会影响到 \(B_dA_c,A_dB_c\),那么产生的贡献 \(\Delta
阅读全文
摘要:注意到,对于一棵树 \(T\) 的任一直径 \(a-b\),对于任意一点 \(u\),离 \(u\) 最远的点一定是 \(a\) 或 \(b\)。 考虑反证:如图,如果存在点 \(c\) 使得 \(dis(u,c)>\max(dis(u,a),dis(u,b))\)。 如图,\(a-b\) 为直径,
阅读全文
摘要:输入的图是一颗基环树。 对于 \(x,y\),如果把环上的边去掉,得到的森林里 \(x,y\) 仍然在同一颗树内,那么显然只有一条路。 否则一定要经过环,有两条路。 于是 dfs 或着拓扑排序找环即可。 #include<bits/stdc++.h> using namespace std; typ
阅读全文
摘要:对于一种构造,考虑怎么表示。 可以把相邻不同颜色建图连边。 注意到答案不可能小于 \(n-1\),否则图不联通,显然不可能。 考虑什么情况下是 \(n-1\)。图是一棵树。 考虑怎么构造出一棵树。 因为一种颜色出现次数大于等于这个点的度数,可以考虑可以确定叶子。 把剩余度数最小的往最大的连边,如果出
阅读全文
摘要:首先考虑 \(n\equiv 0\pmod 3\) 的情况。 非常简单, 然后考虑 \(n\equiv 1\pmod 3\) 的情况。 只要把多出来的第一列第一行填满就行了。还要比原来情况多一个连通块。 然后考虑 \(n\equiv 2\pmod 3\) 的情况。 手玩一下,再往左上角添一点东西就行
阅读全文
摘要:考虑每次更新就跑一遍 bfs。 \(O(n^4)\),复杂度不对? 但是注意到 \(dis\) 的最大值也就是 \(n\),每次更新 \(dis\) 至少减一。 所以最大值最多被更新 \(n\) 次,一共更新 \(O(n^3)\) 次,复杂度是对的。 直接暴力。 #include<bits/stdc
阅读全文
摘要:因为一条边只能在 \(V_i,V_i+1\) 之间,如果把 \(V_1,V_3,\cdots\) 看作一部分,\(V_2,V_4,\cdots\) 看作一部分,这就是个二分图。 考虑一个二分图怎么“展开”成最多的集合。 考虑答案上界。上界是点对最短路的最大值加一。 如果集合个数超过上界,那么一定存在
阅读全文
摘要:这里树的直径 \(l\) 定义为两个有硬币的点的最长距离。 做一次操作后,树的直径一定会变短。 我们发现,如果在直径端点做操作,直径减一。 在非直径端点操作,直径减二。 于是变成了一个威佐夫博弈,但是要注意的是,在直径长度为 0,1,2 的时候,每次都只能让直径减一。 因为直径长度为 1,先手必败,
阅读全文
摘要:A. Strong Password 注意到最大效果是在两个相同字符之间插入一个不同的,贡献为 3。 否则在一开始插入一个和首位不同的,贡献为 2。 #include<bits/stdc++.h> using namespace std; typedef long long ll; void sol
阅读全文
摘要:\(O(mk\alpha(n))\) 暴力,考虑对于每个询问 \(l,r\),枚举 \(1\sim l-1,r+1\sim m\),并查集连边即可。 1154 ms。 \(O(n(m+k\alpha(n)))\) 我们发现枚举 \(i\in [1,l),j\in (r,m]\) 太慢了。 考虑先预处
阅读全文
摘要:D 先对 \(a\) 从小到大排序。 将题目转化成找到最小的 \(d\),使得恰好有 \(k\) 个 \(a_i\in [b-d,b+d]\)。 对于每个询问 \(b,k\),考虑二分答案。 设待检查的答案为 \(d\),二分找到最小的 \(p1\) 使得 \(a_{p1}\geq b-d\) 和最
阅读全文