01 2022 档案
摘要:题意: 给定两个字符串 \(s1, s2\),求区间 \([s1,s2]\) 中按字典序位于中间的串。 思路: 整数区间 \([l,r]\) 的中位数就是 \((l+r)/2\) 。现在要求字符串的中位数,就把字符串看成26进制数,模拟一下加法和竖式除以2即可。 cin >> n >> s1 >>
阅读全文
摘要:题意: 给定 n 个字符串,每个串的长度不超过3。问是否存在某几个串按原顺序拼接起来是回文串。 思路: 有个结论:如果存在,那么一定存在某个串本来就是回文串,或者存在两个串拼起来是回文串。三个或以上的情况就不用考虑了。
阅读全文
摘要:题意: 一段长为 \(l\) 的线段上,给定 \(n\) 个限速标志。第 \(i\) 个标志的值为 \(a_i\),位置为 \(s_i\),表示由此标志走到下一标志需要时间 \(a_i(s_{i+1}-s_i)\)。第一个标志在起点 \(0\) 处,且必须选择。 现去掉不超过 \(k\) 个标志,求
阅读全文
摘要:题意: 重排数组,使得 \(\sum \limits _{i=1}^n \gcd (a_1,a_2,\cdots a_i)\) 最大。输出最大值。 \(n\le 1e5,1\le a_i \le 5e6\) 思路: \(dp[x]\) 表示以 \(x\) 为第一个数的最大值。那么 \(dp[x]\)
阅读全文
摘要:题意: 青蛙在深度为 \(n\) 的井底。位于深度 \(i\) 时可以向上跳 \([0,a_i]\) 米,跳到位置 \(k\) 时要下滑 \(b_k\) 米。问至少跳几次能跳到地面(深度为0),并输出每次跳到的高度(未下滑)。 思路: \(dp[i]\) 表示从深度 \(n\) 开始至少跳几次能跳到
阅读全文
摘要:题意: 给定长为 3n 的 ABC 字符串,每次操作可选一个区间 \([l,r]\) 和一个字符 \(c\in \{A,B,C\}\),并把区间中的字符全变成 c。求操作次数最少的方案,使 A,B,C 的出现次数相等。 思路: 如果原字符串已经合法,那么不用操作。 只需操作1次的情况:设 \(cA[
阅读全文
摘要:题意: 给定数组,可选 \(x<y\),把小于 \(x\) 的数划为div1,除此之外小于 \(y\) 的数划为div2,剩下的数为div3。现往每组中放入额外的数,使得每组的大小都是2的幂。输出至少要加几个数。 n ⇐ 2e5,1 ⇐ ai ⇐ n 思路: 开桶记录出现次数。枚举加数后div1的大
阅读全文
摘要:题意: 数组中的数两两不同,每次操作任选数组中的两个数并把它们的gcd加入数组。问最多能操作多少次。 思路: 设原数组中的最大数为 \(A\),则 \(x\in [1,A]\) 会被加入数组当且仅当 \(x\) 的所有倍数的 gcd 恰为 \(x\)。否则,这个gcd与其他 \(x\) 的倍数取gc
阅读全文
摘要:题意: 给定01串s,尽量把1改成0,要求所有子区间的LIS长度与原串相等。 思路: 若一个子区间 \([l,r]\) 的LIS是一个全1串,那么把 \(s_l\) 从1改成0无影响。若LIS是全0串或者先0后1,则把 \(s_l\) 从1改成0会让LIS长度+1。 从后往前遍历,只有当以 \(i\
阅读全文
摘要:题意: 修改数组中的不超过k个数,最小化相邻数之差的绝对值的最大值。 k ⇐ n ⇐ 2000 思路: \(f(i)\) 表示第 \(i\) 个数不变,前 \(i\) 个数合法,至少要改变几个数。 初始化 \(f(i)=i-1\) 表示前面的数都改变。枚举 \(i\) 之前的所有 \(j\),把 \
阅读全文
摘要:题意: 给定一棵树,然后在所有有相同邻点的点对之间连边。新连的边不能用于判断相邻。求所有点对的距离和。 思路: 法一:烦人的树形dp。维护子树中与根的距离为奇数的点数和距离为偶数的点数。 #include <bits/stdc++.h> using namespace std; using ll =
阅读全文
摘要:题意: 构造正整数数组 \(a[],b[]\) ,要求用到的最大数尽量小。对任意 \(i,j\),\(a_i\) 和 \(b_j\) 的大小关系已知。 数组大小均小于1000 思路: 先处理所有相等关系。用并查集,把相等的元素放进同一连通块中,得到 idx 个连通块 \(blo_1,blo_2,\c
阅读全文
摘要:题意: 求 \(\prod a_i\) 的不同因子数量。答案对998244353取模。 \(n\le 500, 1\le a_i\le2e18,\) 每个 \(a_i\) 只有 \(3\sim 5\) 个不同因子。 思路: 范围太大了,分解质因数会tle。 因为每个 \(a_i\) 只有 \(3\s
阅读全文
摘要:题意: 问能否把给定数组重排成一个环,原数组的每个数必须用一次,且相邻的数之差恰为1。 \(n \le 1e5, 1\le a_i \le 1e9\) 思路: 从最小的数开始,每次优先往上走,走不了的话就往下走。 开桶计数之前不必离散化,因为合法情况的极差不会超过n,只需把每个数减去最小数 #inc
阅读全文
摘要:题意: n个球排成一列,每个球有值 \(v_i\) 和颜色 \(c_i\)。可任取子序列,对子序列中的某个球,若它不是子序列首且与子序列中的上一个球同色,则价值为 \(av_i\);若它是子序列首或者与子序列中的上一个球异色,则价值为 \(bv_i\)。子序列的价值定义为子序列中所有球的价值和。 现
阅读全文
摘要:题意: 数组已知。每次操作选择数组中等于某值的所有数,把它们全部移到数组首或数组尾。问至少操作几次可使数组升序。 思路: 找数组中最长的形如 \(b_1,b_1,\cdots,b_1,b_2,b_2,\cdots,b_2,\cdots\) 的序列,即值为 \(b_i\) 的数全都在值为 \(b_{i
阅读全文
摘要:题意: k个长为n的字符串(未知),只由字母a和b组成,且字典序均介于串A和串B之间。问集合 \(S=\{ p:p为至少一个串的前缀 \}\) 最大能是多少。 思路: 想象一棵trie,若无字典序限制则每层的节点数是上一层的2倍。考虑字典序,则只有两种边界情况非法。 每层最多能取k个 #includ
阅读全文
摘要:题意: 已知整数 \(p,k\),求多项式 \(f(x)\) 使得 \(f(x)=q(x)(x+k)+p\),且 \(f(x)\) 的系数 \(0\le a_i < k\) 。输出 \(a_i\)。 \(a_i\) 需为整数,但 \(q(x)\) 的系数不必为整数。 \(1\le p \le 10^
阅读全文
摘要:题意: 给定一个数组,要求两种操作:求区间和;让区间的每个数异或上x 思路: 每一位开一棵线段树,节点维护(某一位上的)1的数量。 #include <bits/stdc++.h> using namespace std; using ll = long long; const int N = 10
阅读全文
摘要:题意: 对给定数组(可能有负数)进行最多k次操作,每次让一个数 +x 或 -x。要使最终所有数的乘积最小,求操作方案。 思路: 如果负号的数量为偶,就尽量把绝对值最小的数的符号改变。(改变后负号数为奇) 如果负号数为奇,就让当前绝对值最小的数的绝对值增加 x #include <bits/stdc+
阅读全文
摘要:题意: 有一棵逻辑运算树,叶子节点为输入节点(IN),取值0/1;其他节点有AND/OR/XOR/NOT四种类型,并根据儿子节点取不同的值。输出为根节点的值。 初始每个输入节点的值给定(因此所有节点的值确定)。问单独改变每个输入节点的值而保持其他输入节点不变,输出是多少 思路: 二叉树,每个节点存储
阅读全文
摘要:题意: 一棵点权为0/1的树,实现两种操作:反转 u-子树 中的所有数、查询 u-子树 中1的数量 思路: 一次dfs求出三个数组 dfn、L、R。dfn为原数组按dfs序排列,L为节点 i 的dfs先序,R为节点 i 的一种奇怪的dfs后序。每个节点的R与它的最右边的子节点的R相同。 相当于把原数
阅读全文
摘要:题意: 在树中找一条最长的链,链上所有点的点权的gcd大于1。 思路: 每个数的质因子数量是非常少的,可以认为是个位数。因为2×3×5一直乘到19就快1e7了。 \(p[u][j]\) 为编号为 \(u\) 的节点的第 \(j\) 个质因子 \(dp[u][i]\) 表示以 \(u\) 为一个端点,
阅读全文
摘要:题意: 定义独立边集:集合中任两边无公共端点;独立点集:集合中任两点没有边直接相连。在一个有3n个点和m条边的图中找一个大小为n的独立边集或独立点集。 n ⇐ 1e5,m ⇐ 5e5,无自环和重边 思路: 先找独立边集:遍历每条边,如果某条边的两端点都没用过就取。如果找到了至少n条边就直接输出。 如
阅读全文

浙公网安备 33010602011771号