12 2021 档案

摘要:题意: 把长为n的数组切成k段,每段的得分为段中的数之和模p。问总分最大是多少(总分不用模p) n ⇐ 2e4,k ⇐ 50,p ⇐ 100 思路: 先考虑朴素dp。\(f(i,k)\) 表示把第 \(1\sim i\) 个数切成 \(k\) 段的最大答案,则 \(f(i,k) = max _{j< 阅读全文
posted @ 2021-12-31 18:48 Bellala 阅读(62) 评论(0) 推荐(0)
摘要:题意: 有n1个武器(wea),每个武器有攻击(v)和价格(c);有n2个防具(arm),每个防具有防御(v)和价格(c);有n3个怪兽(mon),每个怪兽有防御(def)、攻击(atk)和击杀奖励(coin)。必须购买一个武器和一个防具,只有当武器的攻击大于怪的防御且防具的防御大于怪的攻击时才能击 阅读全文
posted @ 2021-12-31 14:17 Bellala 阅读(61) 评论(0) 推荐(0)
摘要:题意: 有m家店,第 \(i\) 家店只在第 \(l_i\) 天到第 \(r_i\) 天之间开业,每个core卖 \(p_i\) 元,每天最多售出 \(c_i\) 个core(但也可以售出0个、1个等,不超过 \(c_i\) 就行)。在1~n天里,你每天要买k个core,如果当天所有店全买了也不够k 阅读全文
posted @ 2021-12-30 23:01 Bellala 阅读(49) 评论(0) 推荐(0)
摘要:题意: 给定数组,要求实现两种操作:区间加、查询数组中最长的 “先严格上升再严格下降” 的连续子区间的长度。 注意只严格上升或只严格下降或只有一个元素也是合法的。 思路: 把长为n的原数组处理成相邻项的差,长为n-1。w[i]表示第i+1个数与第i个数的差。 考虑相邻项的差的符号,1,0,-1表示大 阅读全文
posted @ 2021-12-30 18:29 Bellala 阅读(65) 评论(0) 推荐(0)
摘要:题意: 给定一个长为 n 的排列 a 和一个长为 m 的数组 b。q次询问 \(l,r\),回答 \(b_l,b_{l+1},\cdots ,b_r\) 中是否包含一个子序列恰是 a 的循环移位。 思路: 贪心,对于每个 \(b_i\),若有多个 \(b_j\) 可以作为 \(b_i\) 的后继,则 阅读全文
posted @ 2021-12-30 18:01 Bellala 阅读(45) 评论(0) 推荐(0)
摘要:这2000分的题最多800分。记录一下这个啥比模拟,免得以后再遇到想多了。 题意: 在n×n字符矩阵上走,如果当前位置字符为L,下一步就只能往左走,R、D、U同理。X表示当前位置不能走。已知从每个点开始走的终点,(-1,-1)表示没有终点即无限循环。构造原矩阵满足所有已知条件且不会走到矩阵外。 思路 阅读全文
posted @ 2021-12-30 01:00 Bellala 阅读(41) 评论(0) 推荐(0)
摘要:题意: 从数组中选尽量多的数组成一个环,使得环中任意两个相邻数相差不超过1。 思路: 假设环中的最小数为 \(l\),最大数为 \(r\),那么环必然可以写为 \(l,l+1,l+2,\cdots r-1,r,r-1,\cdots l+2,l+1\) ,除了 \(l\) 和 \(r\) 外,环中的其 阅读全文
posted @ 2021-12-29 18:11 Bellala 阅读(47) 评论(0) 推荐(0)
摘要:题意: 树中的每个节点有花费val、初值t1和目标值t2。t1、t2只取0或1。 进行任意次操作,每次选择任一节点u和一个整数k,在u的子树(包括u)中任选k个不同节点,重新排列它们的t值,花费是 k*val(u)。问让所有节点的t值从初值变成目标值的最小花费。 思路: 如果一个点要从0变成1,另一 阅读全文
posted @ 2021-12-29 14:06 Bellala 阅读(67) 评论(0) 推荐(0)
摘要:题意: 给定二维坐标系中的n个整数点。一个上无界的矩形 \((x1,y),(x2,y),(x2,+\infty),(x1,+\infty),矩形坐标为实数\) 可以围出一个无界区域,区域内的的点组成一个集合。随便画这样的矩形,问不同的集合有多少种。 思路: 按纵坐标从大到小处理点,纵坐标相同的点要放 阅读全文
posted @ 2021-12-29 01:28 Bellala 阅读(57) 评论(0) 推荐(0)
摘要:题意: 一个图中任意两点的距离为两点的点权和,另有m条边。求最小生成树的边权和。 思路: 直接跑会T。以某个最小的点为根与其他所有点连边,一共有n-1条,这就组成了一棵生成树。因为每个点都取到了与它相连的最小的边,所以这就是一棵最小生成树。 另外还要考虑新加进的m条边。对这些 n-1+m 条边跑 K 阅读全文
posted @ 2021-12-28 20:20 Bellala 阅读(49) 评论(0) 推荐(0)
摘要:题意: 长度为 \(2^i\) 的木棒有 \(a_i\) 根,问用这些木棒最多能做成几个三角形。 思路: 居然是个啥比贪心。。。 合法三角形形如 \(2^i,2^j,2^j\),其中 \(i\le j\) 从小到大考虑,让当前木棒拼出尽可能多的三角形:先尽量跟比它小的木棒凑成等腰三角形,这样消耗较少 阅读全文
posted @ 2021-12-28 09:43 Bellala 阅读(38) 评论(0) 推荐(0)
摘要:题意: 给定一个长为n的字符串,只有abc三种字母,相邻的两个字符不同。随便输出一个长度不小于 \(\lfloor n/2 \rfloor\) 的回文子序列(不必连续)。 思路: 每次从头找两个,从尾找两个,这四个字符必有至少一对相同。然后乱搞一下即可。 阅读全文
posted @ 2021-12-27 23:31 Bellala 阅读(32) 评论(0) 推荐(0)
摘要:题意: 给定一个数组,对所有的长度 \(len\),输出 “所有长为 \(len\) 的区间中的最小值” 的最大值。 思路: 用单调栈求出包含 \(a_i\) 的、长度最大的、其中的所有数都大于等于 \(a_i\) 的区间 \([l_i,r_i]\)。 这意味着对于 \(len\le l_i-r_i 阅读全文
posted @ 2021-12-27 21:39 Bellala 阅读(68) 评论(0) 推荐(0)
摘要:题意: \(x\) 和 \(y\) “相邻” 定义为 \(lcm(x,y)/gcd(x,y)\) 是个平方数。给定一个数组,每秒钟,数组中的所有数同时变为数组中与它相邻的所有数之积(包括它自己)。如果若干数两两相邻,则它们组成一个相邻组。q次询问,每次输入tim,输出第tim秒时最大相邻组的大小。 阅读全文
posted @ 2021-12-27 20:39 Bellala 阅读(102) 评论(0) 推荐(0)
摘要:题意: 把n的所有大于1的因子排列成一个环,使得环中互质的相邻数对最少,即尽量使相邻的两个数不互质。求排列方案和相邻互质数对的数量。 思路: 先找 n 的所有因子和所有质因子。 若只有1个质因子,则全都不互质。 若有2个质因子,如果这两个质因子相乘等于 n,则排列为 \(p_1,n,p_2\) ,必 阅读全文
posted @ 2021-12-27 13:26 Bellala 阅读(52) 评论(0) 推荐(0)
摘要:题意: 每次询问 L,R ,输出 L 与 R 之间形如 \(a^p,a\ge 1,p\ge 2\) 的数 L,R ⇐ 1e18 思路: 1~n中的平方数恰有 \(ceil(\sqrt n)\) 个,立方数不超过 1e6 个,更高次方的数更少。 对 \(p=2\) ,答案是 \(sqrt(R)-sqr 阅读全文
posted @ 2021-12-26 23:05 Bellala 阅读(170) 评论(0) 推荐(0)
摘要:题意: 一棵带点权 \(val(u)\) 和边权的树,1号点为根节点。若 \(v\) 在 \(u\) 的子树中,\(v\neq u\) 且 \(dis(u,v)\le val(v)\) ,则称 \(v\) 被 \(u\) 控制。问每个点能控制多少个点。 思路: \(u\) 能控制 \(v\) 即 \ 阅读全文
posted @ 2021-12-26 12:14 Bellala 阅读(281) 评论(0) 推荐(0)
摘要:题意: 把 \(n\) 个数分成尽量少的 \(t\) 组。每组中大于等于 \(i\) 的数不能超过 \(c_i\) 个。输出 \(t\) 和一种分组方案。 1 ⇐ ai ⇐ k 思路: 注意 \(c_i\) 之间是包含关系,相当于每个值的容量的后缀和。 \(c_1\ge c_2\ge\cdots\) 阅读全文
posted @ 2021-12-25 21:43 Bellala 阅读(35) 评论(0) 推荐(0)
摘要:题意: 在一个小写字符串中取字符组成环形项链,要求项链顺时针旋转 k 个字符后保持不变。问项链最大可取多长。 n,k ⇐ 2000 思路: 长为 n 的环中存在长为 m 的循环节,那么 m 必须既是 n 的约数又是 k 的约数。 这样的循环节有 n/m 个,这就要求一个循环节中的每个字符要在整个环中 阅读全文
posted @ 2021-12-25 18:58 Bellala 阅读(73) 评论(0) 推荐(0)
摘要:题意: 给定正整数 a 和 b,q次询问 \(l_i,r_i\) ,输出满足 \(l_i\le x \le r_i,(x\%a\%b)\neq (x\%b\%a)\) 的 \(x\) 的个数 a,b ⇐ 200,l,r ⇐ 1e18 思路: \(x\%a\%b=(x+lcm(a,b))\%a\%b\ 阅读全文
posted @ 2021-12-25 15:24 Bellala 阅读(50) 评论(0) 推荐(0)
摘要:题意: 给定 n 和 k,找一个最小的正整数 m 并在 1~m 中选 4n 个不同的数构成 n 个集合。每个集合的大小为4,且来自同一集合的任意两个数的 gcd 是 k。输出m和具体构造方案。 思路: 把所有数除以k,问题转化为构造n个集合,每个集合大小为4且同一集合中的数互质。 根据相邻的奇数必互 阅读全文
posted @ 2021-12-25 13:11 Bellala 阅读(51) 评论(0) 推荐(0)
摘要:题意: 给定正整数 \(c,d,x\),问有多少对 \((a,b)\) 满足 \(c\cdot lcm(a,b)-d\cdot gcd(a,b)=x\) \(1\le c,d,x\le 1e7\) 思路: 记 \(g=gcd(a,b)\),则 \(a=Ag,b=Bg\),\(A\) 与 \(B\) 阅读全文
posted @ 2021-12-24 23:31 Bellala 阅读(65) 评论(0) 推荐(0)
摘要:题意: 已知一棵有n个顶点的树。你要把树的所有顶点放在一个环上,要求顶点不能重叠且所有边不相交(当然在端点处可以相交)。然后任选一个点作为起点开始顺时针点数,可以得到一个n的排列。问不同的排列有多少种。 思路: 设 \(root\) 为根节点,\(u_i\) 为 \(root\) 的儿子们。\(tr 阅读全文
posted @ 2021-12-24 15:58 Bellala 阅读(59) 评论(0) 推荐(0)
摘要:题意: 给定一个01方阵。把某个 k*k 子矩阵变成0,使得全0行的数量与全0列的数量之和最大。输出和。 思路: 枚举 \((i,j)\) 作为子矩阵的左上角,预处理出能新增的全0行数+能新增的列数,最后加上原方阵中的行数列数。 甚至不用二位前缀和,只用每行/每列的前缀和 #include <bit 阅读全文
posted @ 2021-12-24 13:07 Bellala 阅读(55) 评论(0) 推荐(0)
摘要:题意: 把 \(p^{k_1},p^{k_2},\cdots p^{k_n}\) 分成两个集合,使两个集合的总和的差的绝对值最小(是原数的差最小而不是取模后最小)。输出差的绝对值取模。 思路: 从大到小考虑每个数,如果 ans 为 0 则把当前数放入集合Ⅰ,即 ans 加上 \(p^i\); 如果 阅读全文
posted @ 2021-12-24 00:51 Bellala 阅读(63) 评论(0) 推荐(0)
摘要:题意: 给定正整数 n,构造不超过 1e5 个真分数,要求这些真分数的和为 \(1-\frac 1{n}\) ,且每个真分数的分母都是小于 n 的 n 的因数。 思路: 答案一定形如 $\frac {cx}{n} + \frac{dy}{n} + \cdots $,其中 \(x,y\) 是 \(n\ 阅读全文
posted @ 2021-12-23 23:18 Bellala 阅读(44) 评论(0) 推荐(0)
摘要:题意: 一维数组中如果相邻的两个数字相等,则称它们属于同一个连通块。任选一个连通块(这不计步数)开始操作,每次操作可把当前连通块中的所有数同时变成另一个数,问至少几次操作后可使数组中的所有数相等。 思路: 法一:最长公共子序列/最长回文子序列 如果遇到形如 \(bbbaaabb\) 的序列,则从 \ 阅读全文
posted @ 2021-12-23 11:26 Bellala 阅读(75) 评论(0) 推荐(0)
摘要:题意: n个顶点的完全图,编号为0~n-1,任意两点间的边权为两个点的编号的异或,求最小生成树的边权总和。(仍是普通加和,不是异或和) 思路: 为讨论方便,把输入的n减一。 先写个prim找规律,发现除了0外,每个点 \(i\) 都向 \(i \oplus lowbit(i)\) 连一条边。总和就是 阅读全文
posted @ 2021-12-23 01:04 Bellala 阅读(86) 评论(0) 推荐(0)
摘要:题意: 每个点用坐标表示,在第 \(i\) 个点建电站的花费为 \(c_i\),在两点 \(i,j\) 之间拉电线的代价为 \((k_i+k_j)d\) ,\(d\) 为曼哈顿距离。要求每个点要么有电站,要么与一个有点站的点连通,求最小花费并输出一种方案。 思路: 建立超级源点0,0号点到每个点都连 阅读全文
posted @ 2021-12-22 17:28 Bellala 阅读(69) 评论(0) 推荐(0)
摘要:题意: 长为n的数组未知,只知道m个区间的或和: \(l_i,r_i,x_i\) 表示 \(a_{l_i}|a_{l_i+1}|\cdots|a_{r_i}=x_i\) 。求所有子列(不必连续)的异或和之和。 思路: 若所有数的第 \(i\) 位都是0,则异或和也是0,无贡献。 若有 \(k\) 个 阅读全文
posted @ 2021-12-22 16:13 Bellala 阅读(82) 评论(0) 推荐(0)
摘要:题意: 对数组中的任何一个数,要求存在一个相邻数大于等于它。数组中的一些数未确定(记为-1),求填数方案数,对 998244353 取模。 n ⇐ 2e5, 1 ⇐ a[i] ⇐ 200 思路: 前缀和优化的dp \(f(i,j,1)\) 表示填完了 \(a[1,i]\) ,最后一位 \(a_i=j 阅读全文
posted @ 2021-12-21 21:48 Bellala 阅读(62) 评论(0) 推荐(0)
摘要:题意: 删去一棵树中的一些边,只保留最多 k 条边,使到1号节点的距离仍为原来的最短距离的点尽量多。求一种方案,即输出要保留哪些边。 思路: Dijkstra。当某个点被标记为 v[i]=1 时,这个点的最短距离就被最终确定。注意除此之外其他的操作好像都是不确定的。应该把 “已确定最小距离的点” 作 阅读全文
posted @ 2021-12-20 22:42 Bellala 阅读(94) 评论(0) 推荐(0)
摘要:题意: n个节点的树,m次询问,每次把v的子树中与v的距离不超过d的节点都加上x。输出最终所有点的值。 n,m ⇐ 3e5,d,x ⇐ 1e9 思路: 每次处理节点u的所有询问,对每个询问,修改差分数组的区间 \([h,h+d]\) 的两个端点。每次把差分前缀和传递给儿子。 每差分完一棵子树都要还原 阅读全文
posted @ 2021-12-20 21:26 Bellala 阅读(49) 评论(0) 推荐(0)
摘要:题意: 把长为m的数组分为n个长为k的区间 \([a_1,a_{k}],[a_{1+k},a_{2k}],\cdots , [a_{1+(n-1)k},a_{nk}]\) ,多出来的 \([a_{nk},a_m]\) 不用管。题目保证一定够分。现在可以删除若干个数,使得至少有一个区间中,\(b_i\ 阅读全文
posted @ 2021-12-20 18:34 Bellala 阅读(37) 评论(0) 推荐(0)
摘要:题意: 猜两个数 a 和 b,输出 ? x y 会回答 a^x 和 b^y 的大小关系(1,0,-1分别表示大于等于小于)。 \(0\le a,b < 2^{30}\),询问次数不能超过62次 思路: 假设比 \(i\) 高的位都已经确定,而且要求 \(i\) 到末尾 \(a>b\) 。 以下的 \ 阅读全文
posted @ 2021-12-20 15:39 Bellala 阅读(49) 评论(0) 推荐(0)
摘要:题意: 每年有 n 个月,第 i 个月有 a[i] 天。在一个月的第 j 天,你将得到 j 个价值。选择连续的 x 天,最大化获得的价值。 x 不超过一年的天数,但可以跨年。 思路: 性质:x 天中的最后一天一定是某个月的最后一天。 为方便,倒序处理数组。为处理环,把原数组复制一倍接在末尾。维护每个 阅读全文
posted @ 2021-12-19 23:19 Bellala 阅读(93) 评论(0) 推荐(0)
摘要:题意: 从数组中取一些不相交(不必紧邻)的区间,每个区间内的数之和相等。输出区间数最大的方案。 n ⇐ 1500,时间3s 思路: mp[sum] 按右端点从小到大存储所有和为sum的区间。对每个sum,贪心求最大不相交区间数。 #include <bits/stdc++.h> using name 阅读全文
posted @ 2021-12-19 18:09 Bellala 阅读(73) 评论(0) 推荐(0)
摘要:题意: 求一棵树中距离为k的点对数量。点对没有顺序,即 (a,b) 和 (b,a) 是一样的。 n<=5e4, k<=500 思路: dfs1处理出 cnt[u][d] ,表示以u为根节点的子树中与u的距离为d的点的数量,距离大于k的点不用考虑。 dfs2计算答案。经过节点u且长为k的路径有两种,第 阅读全文
posted @ 2021-12-18 23:53 Bellala 阅读(78) 评论(0) 推荐(0)
摘要:题意: 给定一个2n的排列p[],问是否存在两个长为n的数组a和b,不断取出a数组首和b的数组首中最小的那一个,最终可以得到p 思路: 假设 \(p_i\) 为 p 中最大的元素,则 \(p_i,p_{i+1},\cdots p_{2n}\) 一定是 a 或 b 中连续的一段。把这些元素从p中取出, 阅读全文
posted @ 2021-12-18 19:19 Bellala 阅读(55) 评论(0) 推荐(0)
摘要:题意: 给定长为n的数组a,求a的严格上升子序列的异或和的所有可能取值。 n<=1e5, 0<=a[i]<=500 思路: 注意到元素范围特别小,所有异或和都小于512。 f[i] 表示所有异或和为 i 的上升子列中,末尾元素最小的那个子列的末尾元素。f[i]=INF 表示还没有子列的异或和为 i。 阅读全文
posted @ 2021-12-18 13:13 Bellala 阅读(32) 评论(0) 推荐(0)
摘要:题意: 给定两个字符串 a 和 b ,找 a 的子串 C 和 b 的子串 D,最大化 \(4\cdot LCS(C,D)-|C|-|D|\) 。其中 LCS为最长公共子序列 (subsequence) 的长度。 子串 - substring - 连续 子序列 - subsequence - 不要求连 阅读全文
posted @ 2021-12-18 12:01 Bellala 阅读(47) 评论(0) 推荐(0)
摘要:题意: 给定两个整数 b 和 a ,重排 b ,使得 b 尽量大但是不大于 a。 范围 1e18,两数位数不一定相等。保证答案存在。 思路: 开个桶记录 b[] 中数字出现的次数,cnt[i] 表示当前剩下几个 i 可以使用。 dfs(int u, bool same) 表示现在要填第 u 位,前面 阅读全文
posted @ 2021-12-17 17:29 Bellala 阅读(43) 评论(0) 推荐(0)
摘要:题意: 在数组 a[] 生成的循环数组 \(a_{i+kn}=a_i\) 中,求最小的 \(j\) 使得 \(H+\sum_{i=1}^j a_i\le 0\) 思路: 这题很经典。 假设答案是 \(ans=kn+r\ \ (r<n)\),则应使 \(k\) 尽量小。维护一个前缀和最值即可。注意特判 阅读全文
posted @ 2021-12-17 00:56 Bellala 阅读(46) 评论(0) 推荐(0)
摘要:题意: n 个蹦床,每个蹦床有强度 a[i]。从第 i 个蹦床起跳会跳到第 i+a[i] 个蹦床处,然后 a[i] 会 -1,但不能小于1。每轮任选一个蹦床开始跳,跳到超过 n 出界为止。问把所有 a[i] 变成1至少要多少轮。n<=5000,时间限制 2s 思路: 数据范围太小,直接 \(O(n^ 阅读全文
posted @ 2021-12-16 22:46 Bellala 阅读(51) 评论(0) 推荐(0)
摘要:题意: 数组中的元素两两不同。现做一个冒泡排序算法: repeat swapped = false for i = 1 to n-1: if a[i] > a[i-1]: add(a[i], a[i-1]) //加边 swap(a[i], a[i-1]) swapped = true endif e 阅读全文
posted @ 2021-12-16 17:25 Bellala 阅读(61) 评论(0) 推荐(0)
摘要:题意: 初值 x 为 0,给一段 -+--+--+ 命令,+ 表示当前值+1,- 表示当前值-1。有m个询问,每个询问 l r 表示屏蔽第 l 到第 r 个命令,剩下的命令按原顺序执行。对每个询问,输出命令执行的过程中出现的不同值的数量,初值0也要算。 思路: x 的变化是连续的,若变化过程中出现的 阅读全文
posted @ 2021-12-16 16:43 Bellala 阅读(33) 评论(0) 推荐(0)
摘要:题意: 有一个正整数n,甲乙二人轮流操作,每次让当前的数减去它的一个因子(但不能减去1或它自己)。不能操作者输。 思路: 质数显然是必败态。打表发现奇数必败,偶数只有 2,8,32,64,... 必败。最终结论是奇数和形如 \(2^{2k+1}\) 的偶数必败,其他必胜。下面证明。 先分类。①奇数; 阅读全文
posted @ 2021-12-16 12:57 Bellala 阅读(74) 评论(0) 推荐(0)
摘要:思路: f(i,j,p)表示第1~i棵树已染色, 染成了j组,第i棵树染成p颜色的最小花费。复杂度 \(O(nkm^2)\)。其实还可以维护2个最值优化到 \(O(nkm)\) #include <bits/stdc++.h> using namespace std; using ll = long 阅读全文
posted @ 2021-12-15 21:58 Bellala 阅读(61) 评论(0) 推荐(0)
摘要:题意: 给定非负初值 s 和长为 n 的数组 a[],a[] 中元素可正可负。求一段最长的区间 [l~r] 使得 \(\forall j\in [l,r],s+\sum_{i=l}^j \ge 0\) ,即 s 加上 a[l~r] 的任意前缀都大于等于0。输出l和r。 思路: 法一:双指针 每次循环 阅读全文
posted @ 2021-12-15 14:18 Bellala 阅读(144) 评论(0) 推荐(0)