05 2022 档案
摘要:D - String Deletion 贪心、链表 要想操作次数最大,设当前已经删到了第 i 个字符,那第一步操作就要找到 i 后面第一个有连续0/1的串,删掉其中一个 找到 i 后面第一个有连续0/1的串:将这些可以被删去的位置记录到 set 里,二分找到 i 后面第一个,找到了就删去 删去元素后
阅读全文
摘要:D - Sequence and Swaps 枚举 由于最后一定是排好序的,且数据范围很小,所以可以枚举最终的序列是什么,即枚举最后的 x 是哪个数,剩下的数组成了最终的序列 求每种情况的操作次数即可 #include <iostream> #include <cstring> #include <
阅读全文
摘要:D - Pairs 贪心 猜想可行的情况是连续的,所以只需要求出 在某一对中是小的,的个数,的最小情况和最大情况即可 若求最大情况,从 1~2*n 枚举,设当前是第 个数 已经被之前的数匹配过了,continue 在 b 集合里,想让 答案 尽量
阅读全文
摘要:C - Busy Robot 模拟 nx : 当前发送当前这次命令时机器人的位置 ed:当前正在执行的操作的结束时间 d:当前的方向 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #incl
阅读全文
摘要:D - Ceil Divisions 构造 方法1 可考虑先把除了 1,2,k 的所有数跟 n 搞一下,这个一定是花 n - 4 次让除了 k,n 都满足条件 现在就让 n,k 变成 1 一直让 n 跟 k 搞,需要 次 一直让 k 跟 2 搞,需要 \(\
阅读全文
摘要:C - Building a Fence DP 维护每一段的最下方能落在哪一段格子上,由此判断下一段是否可以 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <cmath>
阅读全文
摘要:D - Program st表 / 线段树 若查询去掉 操作后,整个操作过程中出现的值有哪些,由于每次操作值都是 +1 或 -1,因此是连续的,只要求出整个操作过程中出现的最大值和最小值即可 求出前缀和, 因为 l 可能为 1,r 可能为 n,所以令 \(s[0]=0,\;s[n
阅读全文
摘要:树上染色 树上背包 + 边贡献 HAOI2015] 树上染色 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include
阅读全文
摘要:Coins 多重背包可行性 SCUACM2022集训前训练-动态规划 - Virtual Judge (vjudge.net) 本题若用二进制拆解多重背包会T,可用单调队列优化 但由于本题是求可行性而非最优化,可用进行剪枝来减小复杂度 : 能否被表示出来 \(used[i
阅读全文
摘要:理想的正方形 二维倍增 SCUACM2022集训前训练-动态规划 - Virtual Judge (vjudge.net) 设 为以 为左上角,边长为 的正方形内元素的最大值 #include <iostream> #inclu
阅读全文
摘要:OSU! 期望dp SCUACM2022集训前训练-动态规划 - Virtual Judge (vjudge.net) 若连续 x 次成功的贡献是 x,则第 次对答案的贡献为 但连续 x 次成功的贡献是 , 而期望只有线性性质,对于 不可累加
阅读全文
摘要:Tele Broadcast 树上背包 SCUACM2022集训前训练-动态规划 - Virtual Judge (vjudge.net) 注意处理叶子结点 #include <iostream> #include <cstring> #include <algorithm> #include <v
阅读全文
摘要:Centroids 换根dp SCUACM2022集训前训练-动态规划 - Virtual Judge (vjudge.net) 重心只有 1 个 或 2 个 待补 #include <iostream> #include <cstring> #include <algorithm> #includ
阅读全文
摘要:高斯消元 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> #include <iomanip> using namespace std; typedef long long ll; const
阅读全文
摘要:st表 #include <iostream> #include <cstring> #include <cmath> using namespace std; const int N = 2e5 + 10, M = 18; int f[N][M], a[N]; int n, m; void ini
阅读全文
摘要:Arbitrage 判正环 套利问题,给出若干对货币兑换的汇率,求能否通过汇率兑换使钱越来越多 floyd求最长路,如果某一点到自身的最长路大于 1, 则可以 tarjan 判正环 #include <iostream> #include <cstring> #include <algorithm>
阅读全文
摘要:D - Journey dp 状态设计 为从 p 店出发,向 x 方向走,当前是第 t 天,还能走多少个城市(包括 p) 其中 x 为 0 表示向左,1 表示向右 t 为 0 表示边的方向是初始方向,t 为 1 表示边的方向是初始方向相反 #include <iostr
阅读全文
摘要:仓鼠找 sugar LCA SCUACM2022集训前训练-图论 - Virtual Judge (vjudge.net) 首先要观察出一个结论:若 a - b 的路径与 c - d 的路径相交,设 a, b 的 LCA 为 x; c, d 的 LCA 为 y 则有 x 在 c - d 路径上 或
阅读全文
摘要:Cow Contest floyd求传递闭包 SCUACM2022集训前训练-图论 - Virtual Judge (vjudge.net) 若 a 大于 b,则连一条 a - > b 的边,一个点能走到的点就是比它小的点 跑一遍 floyd,就可知道任意两个点的大小关系 枚举 i, j,如果 i
阅读全文
摘要:Wormholes spfa 判负环 SCUACM2022集训前训练-图论 - Virtual Judge (vjudge.net) #include <iostream> #include <cstring> #include <algorithm> #include <vector> #incl
阅读全文
摘要:LCA 倍增 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <queue> using namespace std; typedef long long ll; const
阅读全文
摘要:灾后重建 P1119 灾后重建 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) floyd 本题考查 floyd 算法的本质: for (int k = 1; k <= n; k++) for (int i = 1; i <= n; i++) for (int j = 1; j <
阅读全文
摘要:P3870 [TJOI2009] 开关 TJOI2009] 开关 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 线段树 维护区间和,区间异或 区间异或可视为 区间和 = 区间长度 - 区间和 #include <iostream> #include <cstring> #incl
阅读全文
摘要:Buy Tickets 线段树 / 树状数组上二分 + 逆向思维 SCUACM2022集训前训练-数据结构 - Virtual Judge (vjudge.net) 、 题意 一开始每个位置都没有人,每次给出一个 和 , 把 val 查到第 pos + 1 的位置,求最
阅读全文
摘要:Apple Tree SCUACM2022集训前训练-数据结构 - Virtual Judge (vjudge.net) dfs序 + 树状数组 注意以后存边时写,效率较高 vector<vector<int> > G(N); #include <iostream> #include <cstrin
阅读全文
摘要:线段树 区间加 ,区间和,区间最值,区间推平 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <cmath> #include <cstdio> using namespac
阅读全文
摘要:D - Playlist 思维 st[i] : 第 i 个数是否被删去了 ne[i] : 第 i 个数的下一个数是哪个 del:当前的可能被删掉的数的集合 降复杂度的关键:只有在newdel里的才可能被删去,因为别的数对已经在上一轮被判过了 复杂度为 #include <i
阅读全文
摘要:C - Alice and the Cake 队列/优先队列 记录每个重量的蛋糕个数 求出蛋糕的重量之和,看这个重量能否切出这些蛋糕 把总和放入队列,如果当前这个重量还有蛋糕,那就不切这个,如果没有就继续切 但是这样广搜,很多重量其实是切不出来的,但要一直切到 1 才能判断出来,所以效率很低 因为最
阅读全文
摘要:Ananagrams SCUACM2022集训前训练-数据结构 - Virtual Judge (vjudge.net) 字符串比较 若比较两个字符串能否经过重新排列构成(不区分大小写),不必统计每个字符出现的次数看是否相等,可以将字符全部变成小写再 sort 一下,看两个字符串是否相等 #incl
阅读全文
摘要:Andy's First Dictionary SCUACM2022集训前训练-数据结构 - Virtual Judge (vjudge.net) stringstream 把单词从字符串里分离出来,可以先把字符串里的非字母字符变成 空格, 再放入 stringstream 中,再读 strings
阅读全文
摘要:POJ 2566 - Bound Found SCUACM2022集训前训练-数据结构 - Virtual Judge (vjudge.net) 双指针 + 前缀和 本题似乎没有单调性,难以使用双指针,但可先求出前缀和并记录下标,然后对前缀和排序 因为是 取了绝对值,
阅读全文
摘要:Jessica's Reading Problem SCUACM2022集训前训练-数据结构 - Virtual Judge (vjudge.net) 双指针 假设当前枚举的区间是 , 且是以 为右端点的最大的可以满足条件的 , 那么 时这个
阅读全文
摘要:D - Pond 二分 + 前缀和 求一个子矩阵中元素的中位数,可二分中位数,check 过程中将矩阵变为 01 矩阵,若小于 mid 则为 1,用二维前缀和求出有多少元素小于 mid 复杂度 注意二分求中位数的细节 若有 个数,则中位数为
阅读全文
摘要:E - Cheap Dinner 枚举 枚举第 2 种食物,求出每个第 2 种与第 1 种食物搭配的和的最小值,把这个最小值赋给第 2 种食物 枚举第 3 种食物,求出每个第 3 种与第 2 种食物搭配的和的最小值,把这个最小值赋给第 3 种食物 枚举第 4 种食物,求出每个第 4 种与第 3 种食
阅读全文
摘要:C - 1D Sokoban 二分 + 找性质 可分正负的箱子分别讨论 本题的关键是发现一个重要的性质:因为推箱子这个过程会让被推到的箱子成为连续的一段,若想让在特殊位置的箱子最多,则这一段的终点一定要在特殊位置上(起点也可以, 这里的一定不是说不在特殊位置就取不到最优,而是在特殊位置上的某些情况一
阅读全文
摘要:C - Binary String 找性质 一开始没思路,想到可能跟前缀和,后缀和有关,就先试一下 设 为 的个数的前缀和,其他同理 先求出一开始的代价,即 的个数,设为 , 当前代价也是 假设从前面删到下标为 \(i
阅读全文
摘要:E - Moving Chips 线性dp 一开始想贪心,但 wa 在1101个点。。。 正解是 dp 首先根据一点贪心的思想,若最后在第 列,那第 列左边的向右走,第 列右边的向左走肯定是最优的 : 最终在 ,第
阅读全文
摘要:2022校赛 - G 食堂在哪里 四川大学在线评测系统 (scu.edu.cn) 换根dp 首先树dp :以 为根的子树中的学生,到 这个点的距离和 :以 为根的子树中的学生,包括 的学生,吃完 的面包后
阅读全文
摘要:狄利克雷卷积 f, g 为数论函数 , 即 性质 满足交换律 满足结合律,即 \(p(n)=(f*g)*h=f*(g*h)=\sum\limits_{d_1*d_2*d_3=n}f(d_1)*
阅读全文
摘要:Lucas 定理 组合数取模 3 (适用于模数较小且为素数,组合数较大的情况) Lucas 定理 给定 n, m, p, p 为素数 把 n, m 拆解为 p 进制 \[ n=n_0*p^0+n_1*p^1+...+n_k*p^k\\ m=m_0*p^0+n_1*p^1+...+m_k*p^k\\
阅读全文
摘要:中国剩余定理 构造法(只适用模数两两互质的情况,CRT的本质思想) 对于解线性同余方程组 useless,因为完全可以被增量法代替 但是揭示了若模数两两互质,则线性同余方程组一定有解。 若模数为合数 , \(q=p_1^{e_1}*p_2^{e_2}*p_3^{e_3}*...p_k^{e
阅读全文
摘要:C - Fox And Names 拓扑排序 要自定义字典序使给出的字符串是按字典序递增的顺序 可对于前后两个字符串可找到一组字母间的关系,转化为差分约束问题 #include <iostream> #include <cstring> #include <algorithm> #include <
阅读全文
摘要:D - Substring 拓扑排序 #include <iostream> #include <cstring> #include <algorithm> #include <vector> #include <cmath> #include <queue> using namespace std
阅读全文
摘要:E - Colorings and Dominoes DP + 算贡献 首先观察到每一行的贡献和每一列的贡献是独立的,所以可以单独算出每一行和每一列的贡献之和 对某一行考虑 设 为第 个元素可作为放骨牌的第一个位置的概率, 为第
阅读全文
摘要:双连通分量 边双连通分量 桥 :去掉该边后,图变的不连通 边双连通分量(E-DCC):极大的、不包含桥的连通块 性质: 一个边双连通分量内的任意两个点,之间至少存在两条没有公共边的路径 对边双连通分量缩点后,剩下的边都是桥,每一个连通块都是一颗树 对边双连通分量缩点后,若要把缩点后的图变成一个双连通
阅读全文
摘要:D - Toss a Coin to Your Graph... 二分 + 判环 + DAGDP 最大值最小化可以想到二分答案 check过程为只给小于等于答案的点之间连边,虽然 k 很大,但如果存在环则一定可以,不存在环就求当前图的最长路,如果最长路 ⇐ k - 1 则可以 判环和求最长路都可用拓
阅读全文
摘要:拓扑排序 判环 bool topsort() { int cnt = 0; queue<int> q; for (int i = 1; i <= n; i++) if (!din[i]) q.push(i); while(!q.empty()) { int u = q.front(); q.pop(
阅读全文
摘要:ACWING 368 银河 缩点 + DAG DP + 差分约束 368. 银河 - AcWing题库 tarjan 缩点 判原图中是否有正环,因为原图上所有边都是非负的**(这也是用强连通分量解差分约束的必要条件,否则若有正权边也有负权边,若环上边权总和仍为0,则并不能说明是矛盾的)**, 所以如
阅读全文
摘要:ACWING 1175 最大半连通子图 缩点 + DAG DP 1175. 最大半连通子图 - AcWing题库 因为一个强连通分量中所有点可互相到达,所以一个强连通分量必然是一个半联通子图 缩点后,求最长链即可(此处的最长指链上的强连通分量中的点数之和最多) 因为已经是DAG,所以求最长链及方案数
阅读全文
摘要:ACWING 367 学校网络 367. 学校网络 - AcWing题库 第一问:求出强连通分量,答案就是起点个数 第二问:结论:若把一个 DAG 变成一个 强连通分量,则需要加 条边 当 DAG 只有一个点时特判加 0 条边 #include <iostr
阅读全文
摘要:C - Berland Regional 算贡献 表面上若从 到 枚举 , 再枚举每个学校对第 个答案的贡献,复杂度为 但因为一共只有 个学生,设每个学校有 个学生,那么每个学校最多只会对前 \(cn
阅读全文
摘要:D - Maximum Sum of Products 区间DP 可先算出不反转任何子区间的答案 再利用 区间DP 算出反转 的话会比原来的答案多多少,记为 转移:\(f[l][r]=f[l+1][r-1]+a[l]*b[r]+a[r]*b
阅读全文
摘要:E - Assimilation IV 注意到 很小,可以算每个点被至少一个城市覆盖的概率,相加就是期望 本题中直接算点被覆盖的概率并不容易,可以算点没有被任何一个城市覆盖的概率 注意到 也很小,最大不超过 可以枚举每个点,按距离从小到大给这 \(n
阅读全文
摘要:POJ - 3579 Median 二分套二分 Median - POJ 3579 - Virtual Judge (vjudge.net) 对数轴上的点排序后,可枚举左端点,固定左端点后,区间长度关于右端点是单调递增的,因此可以二分 二分答案 check 返回有多少区间小于当前的二分值,求有多少区
阅读全文
摘要:POJ - 3685 Matrix 二分套二分 Matrix - POJ 3685 - Virtual Judge (vjudge.net) 关于 单调递增,关于 单调递减 要找第 \(m\
阅读全文
摘要:受欢迎的牛 缩点 USACO03FALL / HAOI2006] 受欢迎的牛 G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 用 tarjan 缩点后,在每个强连通分量中的点都可以互相到达。 在 DAG 中 如果有大于 1 个出口,则两个出口之间肯定不能相互到达,所以没有明星
阅读全文
摘要:SCC 性质: 缩点后为DAG 若一个 DAG 中点的最大出度和最大入度分别为 p, q, 则最少再加 条边可以使整个图变成一个 SCC tarjan 求 SCC vector<int> G[N]; int tin[N], tim; int scc_cnt, sz[N],
阅读全文
摘要:树状数组 逆序对 #include <iostream> #include <cstring> #include <algorithm> #define int long long using namespace std; const int N = 5e5 + 10; int tr[N], ran
阅读全文
摘要:线段树 区间加,区间和 #include <iostream> #include <cstring> using namespace std; typedef long long ll; const int N = 1e5 + 10; ll w[N]; struct Node { int l, r;
阅读全文
摘要:E - Gold Transfer 树上倍增 + 贪心 由于 , 所以一定是把结点祖先的黄金采完才会采这个结点的,因此某个点有无黄金这个性质具有单调性,靠近根的一侧没有,靠近叶子的有,所以可以倍增查到某个结点上方离根最近的有黄金的结点,从该点开始采 由于一个点被采完才会
阅读全文
摘要:D - Inconvenient Pairs 思维 不方便的点对就是类似于,这种在同一行块或同一列块的两个点,他们的距离一定大于曼哈顿距离 其中红色为横向点对,紫色为纵向点对 所以可按 y 递增排序,找到每一个行块有多少个点,这一行块中的点对贡献为:\(\binom {cnt}2-\sum\bino
阅读全文
摘要:D - The Strongest Build BFS + 优先队列 + 哈希 将被 ban 掉的策略存到 map 里,一开始将最大的策略放入优先队列中,每次取队首策略是否被 ban 掉了,如果没有当前策略就是答案 如果被 ban 掉了,那放入比该策略小一点的策略,设队首策略为 \(b_1,b_2,
阅读全文
摘要:D - Playoff Tournament 树形dp 将字符串颠倒,并把每个结点的左右儿子交换,即可变成二叉树的形式(本题中让左右儿子交换) 首先 dp 算出当前字符串每个结点的答案 注意到修改一个结点时只会影响到他上方一条链上的结点,数目为 级别,因此每次修改复杂度为 \(lo
阅读全文
摘要:C - Unstable String DP 状态表示: 为以第 个字符且这个字符为 结尾的子串的个数 状态转移见代码 因为统计的是有多少子串是稳定的,不是统计有多少稳定的字符串,所以一个位置上只能取 中最长的 所以答案为 \(\
阅读全文
摘要:C - Manhattan Subarrays 枚举 多观察数据,发现当子数组中元素个数 >= 5 时一定不满足条件,因此枚举子数组个数为 3, 4 即可 #include <iostream> #include <cstring> #include <algorithm> #include <ve
阅读全文
摘要:E - Boring Segments 线段树 + 双指针 题意:有一些线段,每条线段有权值,能把整个区间覆盖住的集合为好集合,求好集合中线段的最大权值 - 最小权值的最小值 首先关于线段覆盖区间的问题,可化段为点,覆盖了一个点视为覆盖了这个点和它右边的长度为 1 的段,因此覆盖了 \([l,r]\
阅读全文
摘要:D - Say No to Palindromes 枚举 可观察到只有类似 abcabcabcabc..., bacbacbac... 等 abc 三个字母都循环出现才满足要求 可记录 ,前 个中 分别在 模 余 \(0
阅读全文
摘要:D - Reverse Sort Sum 线段树 / 树状数组 从后往前遍历,如果 c[i] = i, 则说明第 i 个位置上的 1 是从时刻1到 时刻 i 都存在的,所以这一位最开始就是 1,此时若前 i 位有 k 个 1,它们一定在 [i - k + 1, i] 位置上,这个区间 - 1,这是第
阅读全文
摘要:C - Line Empire 贪心 每次征服一个国家之后,如果要将首都迁过来,显然之后迁不如现在迁 在征服第 i 个国家后,可利用前缀和 算出 迁或不迁 时征服之后国家的代价,若迁的代价小就迁,否则就不迁 #include <iostream> #include <cstring
阅读全文
摘要:D - Optimal Partition 线段树 + dp 设 s[i] 为前缀和数组,f[i] 为考虑前 i 个数的最大答案。当枚举到第 i 个数时,有状态转移方程如下 \[ 1. \;s[i] -s[j]>0,\;即\;s[j]<s[i]\;(j<i)\\f[i]=max(f[j]+i-j)\
阅读全文
摘要:E - Preorder 树形dp 若两颗满二叉树深度相同,一颗二叉树交换任意两个兄弟结点及其子树可以得到另一颗二叉树,则成这两颗二叉树同构 设 u 的左右儿子为 ls,rs 若 ls 与 rs 同构,则 否则,ls,rs 交换又是一种新方案,
阅读全文
摘要:D - Insert a Progression 绝对值 首先算出不插入时的答案 如果插入的数在 [minn, maxn] 中,则没有代价 如果 x > maxn, 则有 这些数要产生代价,把他们放到最大值后面,则代价为 若放到开头或结尾,则代
阅读全文
摘要:D - Progressions Covering 线段树维护差分序列 把问题看作是每次给 b 数组的一个长度为 k 的子段减去一个等差数列,直到所有数小于等于 0 因为子段长度严格为 k,因此对于当前 b 数组中最右边的大于 0 的元素,只能让它尽量作为子段右端点 为了模拟这个过程,在子区间中减去
阅读全文
摘要:C - Water the Trees 二分 因为奇数天 +1, 偶数天 +2,所以找到最大的 记为 maxn,最后的高度只能在 maxn, maxn + 1 中,因为如果答案为 maxn + 2,则可以去掉一些操作,使最大高度为 maxn 二分答案即可 #include <ios
阅读全文
摘要:D - Shuffle 组合数学 记当前枚举的区间从第 i 个 1 到 第 i + k - 1 个 1,记 j = i + k - 1, 那这些 1 可以随意排列的区间为 , 设为 , 这个区间对答案的贡献为 \(\binom
阅读全文
摘要:C - Set or Decrease 一定是先对最小的元素使用 -1 操作 再从大到小把元素变为最小值 这样一定是最少操作将序列和减到 k 一下 操作数 = 操作 1 的个数 + 操作 2 的个数,操作 1 可能有很多次,操作 2 是将较大的元素变为最小值,所以可能是 [0, n - 1] 次,所
阅读全文
摘要:E - Star MST 给出一个 n 个顶点的完全图,边权可以从 [1, k] 中设置,求最小生成树的边权和 == 跟 1 相连的边权和的赋权方案 题意为 2 - n 号结点都与 1 号相连,这个生成树可以是最小生成树的方案数 dp 设 为当前的生成树中边权最大为 \(i\
阅读全文
摘要:D - Martial Arts Tournament 枚举 不能枚举 x, y ,但是可以枚举集合大小,设三个集合大小分别为 , 枚举 i,j 即可,复杂度为 #include <iostream> #include <cstring
阅读全文
摘要:Tokitsukaze and Strange Inequality 维护二维前缀和 为前 i 个数中比 j 小的有几个 枚举 b,c,分别判断 a,d 有多少种,每对 b,c 的贡献为 #include <iostream> #include
阅读全文
摘要:Tokitsukaze and Good 01-String (hard version) 贪心 两个一组分成 个 01 段 当前这一组不相同,则操作数++,并且让这一组变成和上一组一样的,段数不变 当前这一组相同,如果和上一组相同,段数不变;如果不相同,则段数++。更新
阅读全文
摘要:E - Messages 思维 因为每个学生最多只能读 k (1 ⇐ k ⇐ 20) 条消息,可以从这个小数据入手 结论:最多贴 20 条消息 可以算出贴 t 条消息时,贴每条消息的贡献,取最大的 t 个贡献相加, 设贡献分别为期望 个学生能读到 若已经贴了贡献最大的 20 条,再贴
阅读全文
摘要:E - Crazy Robot 搜索 搜索能变成 + 的点,第一次搜到的时候入队 枚举队头的点的邻居,判断是否能变成 + ,能的话也入队(判断的方法就是如果周围的 '.' 的个数 ⇐ 1 就可以变成 + ) 关键:只让能变成 + 的入队,并且每个 + 的邻居都要判断是否能变成 + ,不能因为某个邻居
阅读全文
摘要:D - MEX Sequences dp 合法序列只有两种 :序列最大值为 x,且序列中包含 1~ x 所有数 :序列最大值为 x,且序列包含 [1, x-2] 所有数与 x 证明:因为当前的值 x 与 mex 的差不能超过 1,所以合法序列的 x =
阅读全文