[做题记录乱做] 20211215 ~ 20211219 HN

CF914F Substrings in a String

操作分块以后块内做AC机, 块间kmp即可。

CF1404D Game of Pairs

偶数的时候选A, 奇数的时候选\(B\)

大体就是分 \(i, i + n\) 的归属讨论即可。

CF549F Yura and Developers

单调栈处理某个数作为最值的区间。

每次枚举区间中短的那一边, 另一边用个vector之类的东西处理。

每次枚举短的一边的话, 从枚举量大概是一个 \(\log\) 的。

CF1404E Bricks

把长方形的延伸看成是跨越边, 根据边能不能选可以搞出二分图, 直接网络流即可。

CF1365G Secure Password

\(\binom{13}{6} > 1000\)

可以拿出所有\(13\)位的有\(6\)\(1\)的二进制数作为标号,然后每次询问的时候拿出标号这位上是一的询问, 求答案的时候就是求除了这个数以外的所有数的按位或。

CF1285F Classical?

长得很经典。

\(lcm(a, b) = \frac{ab}{gcd(a, b)}\)

可以想到, 如果把\(a_i\)的所有约数全部拿出来, 那么应该会存在两个互质的数\(c, d\), 使得\(lcm(c, d) = ans\)

考虑从大往小扫描, 用一个栈存值。具体来说, 从大往小做, 每次加入一个数就判断栈中是否存在一个数和当前数互质, 如果存在, 那么一直弹栈直到把互质的数弹出去, 并且用那个互质的数更新答案, 因为被弹出去的数一定没用。最后把当前数加进来继续扫描。

最后即可得到答案。判断是否存在数互质的办法是这样的。

\(f(n)\)表示\(gcd(n, x) = 1\)\(x\)的个数, \(cnt(n)\)表示 \(n\) 的倍数的个数。

\[\sum [gcd(a, x) == 1] = \sum _a\sum_{p | gcd(a, x)}\mu(p) = \sum_{p|x}p\times cnt(p) \]

然后可以直接维护了。

CF464E The Classic Problem

主席树与封装练习题。

CF176E Archaeology

直接\(set\)维护即可。

CF1557E Assiut Chess

下棋题。

考虑把王逼下去就好了。

CF794F Leha and security system

搞个神秘线段树就好了。

CF325E The Red Button

\(n\) 为奇数无解, \(n\) 为偶数考虑讨论\(i, i + n (i < \frac{n}{2})\)的连边, 合并环即可。

CF671C Ultimate Weirdness of an Array

这也能差分就 \(nm\) 离谱。

值域很小, 考虑从大到小枚举一个值 \(i\), 然后维护一个数组 \(nxt_l\) 表示从 \(l\) 开始, 最远延伸到哪里使得 \(f(l, nxt_l) < i\) , 考虑 \(i\) 变化的时候, \(nxt\) 的变化只和整除 \(i\) 的值所在的位置相关。

考虑把这些位置拿出来作为 \(x_1, x_2, \cdots, x_m\), 讨论一下值的变化情况, 大力线段树维护即可。

CF1479D Odd Mineral Resource

显然和异或有关。

那就是主席树+二分解决了。

CF633G Yash And Trees

直接线段树套bitset。

CF1279F New Year and Handle Change

显然有\(n^2\)的dp。

带权二分即可。

CF455E Function

看起来就是直线+折线, 直接斜率优化即可。

CF986E Prince's Problem

憨憨题。这不直接分解+dfs完事。

CF1083C Max Mex

值做下标建线段树, 发现就是判断一个前缀区间里面所有点是不是在一条链上, 显然可以直接二分。

CF587E Duff as a Queen

异或差分以后直接线段树维护线性基即可。

[AGC010B] Boxes

差分以后考虑和和差分数组的变化判断。

[ICPC2019 WF]Azulejos

直接贪心。

[ICPC2019 WF]Beautiful Bridges

注意圆的凸性判断。

「JOISC 2017 Day 3」自然公园

给你一张大小为 \(n\) 的图, 每个点的度数不超过 \(7\), 每次可以指定 \(A\)\(B\) 和若干个点, 判断是否可以只经过这些点从 \(A\)\(B\) , 猜出这张图。

\(n \leq 1400, m \leq 1500\)

询问次数不超过 \(45000\)

这个问题上来就猜图, 看起来很强。

这种猜图题常见的想法是从猜链做起, 不妨先考虑链的情况, 也就是如果知道链的两个端点怎么做。

不妨假设链的端点是 \(x, y\) ,考虑怎么求出这条链。考虑把所有点拿出来变成一个序列, 然后在这个序列上二分, 二分到 \(mid\) 的时候把 \(x, y, a_l\cdots a_{mid}\) 的点加入询问集合, 看\(x, y\)是否联通, 如果不联通了增大, 反之减小, 取出恰好不连通的那个位置就应该在链上, 这样 \(\log\) 次询问可以确定一个点。

然后仿照WC2018即时战略那个题, 维护一个 \(1\) 所在的联通块, 然后不断扩大这个连通块。

考虑如果找到了一个和当前联通块直接相连的点, 怎么找联通块里面的点到这个点的连边。可以把当前联通块的所有点指定一个根随便跑一个 \(dfs\) 序, 然后在这个上面二分判断根到这个点 \(z\) 是否联通, 可以找到一个刚好有边的点, 删去这个点, 递归剩下的联通块即可找到所有边。那么这样一次二分最多多 \(7\) 个联通块, 每次有 \(\log\) 的代价, 那一条边的代价是 $7 \times \log n $ 。

然后再考虑怎么找一个直接连接的点。 随机一个不在联通块里面的点, 然后用链的那个二分找到一个不在连通块里面, 但是在路径上的点, 这样可以 \(\log\) 代价找点。

看起来跑不满那自然就可以过

过不去, 没事了

CF573D Bear and Cavalry

考虑排序不等式, 可以得到匹配的是相邻三个数, 设\(f_i\)表示前 \(i\) 大的人和马配对的答案, \(ddp\)转移即可。

原文地址:https://www.cnblogs.com/clover4/p/15695426.html