摘要:
"题面" 题解 第$i$个数之前的符号是或那么记为0,是与就记为1,得到一个二进数x 然后按位分开考虑,如果这一行是1那么记为1,如果这一位数位0记为0,得到一个二进制数$b_i$ 第$N$行是最高位,如果这一位是1的话,需要有$x define fi first define se second 阅读全文
摘要:
"题面" 题解 考虑我肯定是从一个人出发,开始依次标记,而不会跳过某个人,因为如果我跳过了,那么我之后回来还需要标记它,比不上我等完它再一直走到最后(因为多了走一圈之后走回它的代价) 我们倍长整个序列,我们要求的就是 $Min_{i = 1}^{n}{Max_{j = i}^{i + n 1}{T_ 阅读全文
摘要:
"题面" 还有这么诚实的出题人! 我们最多影响20个点,然后把这20个点的虚树建出来,并且枚举每个点的选举状态,如果一个点选或不选可以通过改$dp[u][0] = 0$或$dp[u][1] = 0$完成 状态应该不多,因为每条边只有三种选的情况,上限是$3^{m n + 1}$的 然后我们考虑递推出 阅读全文
摘要:
A Digit Sum 2 从高位到低位数的第i位以前前缀都相同,第i位比当前位上的数小1的情况下,后面都填9 枚举一下然后计算最大的就好 B Holes 如果两个点的话或者所有点共线的话两个端点各是0.5 我们给这些点求一个凸包,由于半径是无穷大,我们只关心凸包上的点相邻两边做垂直平分线交出来的角 阅读全文
摘要:
C Flip,Flip, and Flip...... 只有一个这一个是反面 只有一行那么除了两边以外都是反面 否则输出$(N 2) (M 2)$ D Remainder Reminder 枚举模数,显然模数需要大于K 对于一个模数小于它的$i K$都合法,如果$K = 0$那么是$i K 1$ 对 阅读全文
摘要:
C 2D Plane 2N Points 把能连边的点找到然后跑二分图匹配即可 cpp include define fi first define se second define pii pair define space putchar(' ') define enter putchar('\ 阅读全文
摘要:
题解 我们转而维护每个点的斜率,显然一个楼房能被看见它就是一个前缀最大值,斜率比较为了节约精度可以用向量替代 我们每个区间维护被看到的楼房的个数,和楼房的最大值,叶子节点在有楼房时,值为1 那么考虑合并两个区间,左节点的所有能被看到的楼房还是能被看到,右边节点能看到的楼房的斜率需要大于左边节点所需要 阅读全文
摘要:
题解 虽然要求一个dfs序,但是不是从根开始贪心 从最小的点开始贪心,最小的点显然是父亲选了之后马上就选它 那么我们每次把最小的点和父亲合并,两个联通块之间也是如此 对于两个联通块,他们合并的顺序应该是平均值较小的更靠前 因为有两个联通块和为$S_i$和$S_j$,大小为$B_i$和$B_j$ 如果 阅读全文
摘要:
题解 读题是做题关键 我们设$dp[u][l][r]$表示$u$节点上方没改$l$条公路和$r$条铁路 然后记忆化搜索,枚举这条点改左边还是右边 代码 cpp include define fi first define se second define pii pair define mp mak 阅读全文
摘要:
C Traveling Plan 相当于一个环,每次删掉i点到两边的距离,加上新相邻的两个点的距离 代码 cpp include define fi first define se second define pii pair define space putchar(' ') define ent 阅读全文
摘要:
A Diverse Word 不到26位就加上一个最小的 到26位了就搜一下,最多回溯就一次,所以复杂度不大 阅读全文
摘要:
题解 终于了解怎么动态维护虚树了 就是把点按照dfs序排个序啊 这道题显然是求虚树上所有边长的两倍 我们把dfs序排完序,相邻两个点加上路径长(包括首尾),删除的时候删一个点减去它到两边再加上新近相邻的两个点即可 增加同理 代码 cpp include define fi first define 阅读全文
摘要:
题解 从每个质因子小到大指数非严格递减,直接搜就行 代码 阅读全文
摘要:
题解 随机跳题真好玩 这个就是考虑我们怎么判断点在多边形内,就是点做一条射线,穿过了奇数条边 我们只需要记录一个二进制状态表示每个点的射线穿过路径的次数的奇偶性 枚举起点,然后用BFS的方式更新dp状态 代码 cpp include define fi first define se second 阅读全文
摘要:
题解 这道题维护方法比较简单,也有点奇妙 我们可以很容易求出经过所有点的路径条数,和初始时分子的大小 然后单点修改的时候,相当于给当前点$v$加上$delta (siz[v] 1)$ $v$到根的路径上每个祖先都要加上设$t$为$k$在路径上的儿子,$delta (siz[k] siz[t])$ 如 阅读全文
摘要:
C Align 考的时候,我大胆猜了结论,就是一小一大一小一大这么排 证明的话,由于我们总是要加上相邻的最大值而减去最小值,我们就让最大值都保持在前面 如果长度为奇数,要么就是大小大小大,要么是小大小大小 第一种要求是靠中间的位置填(n + 1) / 2个最大值中较大的,两边填较小的(两边只被加了一 阅读全文
摘要:
A Fairness 如果奇数次是b a 否则是a b B Backfront 找数值最长的连续的一段子序列,然后将剩下的数必须要移动了 D Isomorphism Freak 答案是直径的长度 / 2 + 1 我们对于直径长度为奇数,也就是有偶数个点,如果直径长度增加颜色也要增加,所以我们不增加直 阅读全文
摘要:
C Attention 枚举,计算前缀和即可 代码 F Donation 感觉这道题和之前见过的某道题有点一样,又不太一样…… 智商 ,看了好久题解才想明白一点。。。 就是……我们先想一下,我们如果按照每个点交钱的顺序写下一个序列 对于第k次选走的点,我们需要的是我们钱数$w$,需要有$w = \s 阅读全文
摘要:
A Digits Sum 枚举即可 代码 阅读全文
摘要:
题解 发现我们选择一座桥会选择力$\frac{s + t}{2}$较近的一座桥 然后我们只需要按照$s + t$排序,然后枚举断点,左边取所有s和t的中位数,右边同理 动态求中位数用平衡树维护 代码 cpp include define fi first define se second defin 阅读全文