摘要:
【树状数组是什么】 树状数组(Binary Indexed Tree, BIT) 支持单个元素修改 和 前缀查询。 比较一下: 子段和 修改单个元素 数组 \(O(n)\) \(O(1)\) 前缀和 \(O(1)\) \(O(n)\) 树状数组 \(O(\log n)\) \(O(\log n)\) 阅读全文
摘要:
【朴素 LCA】 LCA 是树的一个重要概念,意为两结点的最近公共祖先。 先给出朴素求 LCA 的代码。 int get_LCA(int u, int v) { if (d[u] > d[v]) swap(u, v); while (d[u] != d[v]) v = p[v]; while (u 阅读全文
摘要:
【倍增算法】 先来介绍一些倍增。 倍增是用来加速枚举过程的算法。 一般可以把算法变成 \(\log\) 级别 \(O(n)=>O(\log n)\)。 举个栗子。 这里有一个小人,他想去右边的目标,但是他并不知道这个目标有多远。 不过他知道目前自己是在终点的左边还是右边。 我们说,他可以一步一步走, 阅读全文
摘要:
【最小生成树是什么】 在一张图 \(G\)(设 \(n\) 个结点)中,选取 \(n-1\) 条边,用这些边把结点之间连通。 那么这 \(n-1\) 条边和原来的结点所构成的图 \(S\),就叫做 \(G\) 的生成树。 最小生成树,就是希望 \(S\) 中边权的和最小。 而求最小生成树,有两种比较 阅读全文
摘要:
【并查集是什么】 并查集是用来表示一些不相交集合的算法。 它可以很快地处理两个点之间是否在一个连通块中。 【并查集的特点】 动态合并集合; 合并之后就不能拆开了。 并查集开始前,先按顺序把初始集合编号。 (初始也不一定每个都是单个元素) 【并查集的实现】 数据结构分类:抽象结构、存储结构。 抽象结构 阅读全文
摘要:
A 先判断初始行不行,再模拟加入。 B 题意:数轴上给定一些线段,和点 \(t\)。问能否删去一些线段,使得 \(t\) 变成唯一的覆盖次数最多的点。 差分 + 贪心。 C 有 \(n\) 杯水,\(n\) 个人。每杯水有水量上限,每个人有喝水上限。初始第 \(i\) 个人对着第 \(i\) 个杯子 阅读全文
摘要:
A 分类讨论。 B 二分。 C 题意:给定一个字符串 \(s\)。记 \(s_i\) 为将 \(s\) 删去 \(i\) 个字符,使得剩余字符串字典序最小得到的字符串。令 \(S=s_0+s_1+\dots+s_{sz-1}\)。现在要询问 \(S[pos]\) 是哪个字符。 通过一些取模,加减可以 阅读全文
摘要:
A:氵 B:排序对两个偶数没影响,对两个奇数没影响。唯一的影响是可能原本偶数在后面,调到前面贡献变多。所以把所有偶数弄到前面就行。 C:\(dp[i]\) 表示前 \(i\) 个字符以第 \(i\) 个字符结尾,有多少个子串符合条件。 若 \(s[i]=?\),\(dp[i]=dp[i-1]+1\) 阅读全文
摘要:
A 氵 B 如果 11 后出现了 00 就不行。 C 枚举走几段。 横竖可以分开算。 一定是:除了费用最小的都是走长度 \(1\),费用最小的包揽剩下的。 D \(c\cdot lcm(a,b)-d\cdot gcd(a,b)=x\) \(c\cdot \dfrac{a}{gcd(a,b)}\cdo 阅读全文
摘要:
传送门 A: 一个组 \(2^n+2^1+\dots+2^{\frac{n}{2}-1}\),另一个组剩下的。 B: 考虑不停循环。 如果不同的数字超过 \(k\),无解。 否则先把原序列去重,然后把末尾补一些数补成 \(k\) 个,再把这个新序列循环 \(n\) 次。 C: 先把字符们排序。 肯定 阅读全文
摘要:
A 用计算器式显示数字,可以显示 \(n\) 段。可以显示的最大数字是多少? 如果用了一个需要至少四段的数字,一定不如把这个替换成两个 \(1\) 好。 如果一共可以用偶数个,一定是全部 \(1\)。 如果一共可以用奇数个,一定是开头一个 \(7\),之后全是 \(1\)。 B 给定一个 \(01\ 阅读全文
摘要:
A 题意:你在数轴原点。有一个宝箱在 \(x\),钥匙在 \(y\)。每移动一单位,耗费 \(1\) 时间。你可以到了 \(x\) 然后抱着宝箱走,但是抱着宝箱走的总路程不能超过 \(k\) 单位。如果某时刻你、钥匙、宝箱在同一个单位上,就能开宝箱。问:最快要多久开宝箱? 要么是拿钥匙,向宝箱走;要 阅读全文
摘要:
只做出 A,身败名裂 A 显然不管怎么排,13,31 总有一个会出现,看看哪个出现。 B 给定两个 01 串,每次可以挑一个串的一个子串,要求两端相同,然后把这个子串全部变得和两端相同。 问经过若干次操作,能否使两个串相同。 重要性质:如果能变相同,存在一种方案,任意两次操作的子串都不相交。 证明: 阅读全文
摘要:
A 让 \(c\) 保存数组中所有最大的数,如果所有数都相等则 \(-1\)。 B 只需要记录每个序列的最小值和次小值,然后对次小值求前后缀和。 C 枚举最大值 \(mx\),然后遍历 \(i:n\sim 1\)。对于 \(i\),取最大数 \(x\) 满足 \(x\) 未选且 \(i\times 阅读全文
摘要:
传送门 A 氵 B 在吃了五次罚时后,我终于放弃了卡常优先队列,并发现:把余 \(0\) 看作余 \(k\),答案就是余数从大到小排列的,每种余数内部又按照下标排序。 C 我为什么没想到哈希?自我检讨:见到关于字符串判定相等/不同个数时,一定要尝试用哈希!!! 记前缀 \([0,i)\) 的哈希值为 阅读全文
摘要:
你谷的加题速度实在太慢了 被 CF 的题目薄纱 A 可以选任意次 \(i\in [1,n]\),使 \(a[1\sim i]++,a[i+1\sim n]--\)。求最少操作次数使得原数列变成非从小到大排序的。 首先判断原数列是否已经非排序。然后看每一个相邻位置 \(a[i],a[i+1]\),令 阅读全文
摘要:
A 比两边和的大小即可。 B 显然如果一个数拥有的所有二进制位的 \(1\) 被包含在 \(x\) 中,选了一定不会导致不能变成 \(x\);如果有一个 \(1\),\(x\) 对应的位上是 \(0\),则一定不能选。 因此从三个栈上面看,只要所有 \(1\) 对应到 \(x\) 上也是 \(1\) 阅读全文
摘要:
A 氵 B 把奇数和偶数拿出来分别排序,然后按下标归并,看看得出的结果是不是排好序的。 C 如果头尾同色,就找有没有 \(k\) 个位置和头尾同色; 否则从头找 \(k\) 个和头同色的,然后再在这之后找 \(k\) 个和尾同色的。 D 把每个前缀和相邻的相减,得出的结果: 有大于 \(n\) 的, 阅读全文
摘要:
A 给出一个由 \(1,-1\) 组成的序列。一次操作可以让一个数变相反。 要多少次操作,才能让整个序列和非负且积等于 \(1\)。 大 氵题。 B 定义两个数 \(A,B\) 有一个价值:每一位上的数字的差的绝对值相加。(位数不足用前导零补齐) 给出区间 \(l,r\),问在 \([l,r]\) 阅读全文
摘要:
A 题意:给一个长度为 \(n\) 的全是 \(1\) 的数列,Alice 先操作,Bob 交替。每次操作选择至少两个(可以更多)相等的数字,删除它们,在序列中加入它们的和。直到有人不能操作为止,这个人就获胜了。 问:谁有必胜策略? 很简单的结论题。 如果 \(n\geq 5\),Alice 把 \ 阅读全文