04 2024 档案
ABC 288 D - Range Add Query
摘要:题目链接: 设 表示下标对 取模为 的所有数的和。那每次操作就是将数组 的所有数都加 。最终为 的充分必要条件就是 的所有数都是一样的。 因此,对于每组询问,统计 中数字下标对 取
ABC 288 C - Don't be cycle
摘要:题目链接: 题目大意:给定一个简单无向图,要求删除最小的边数(可以不删)使得图中没有环。 每增加一条边,看这条边的端点 、 是否在一个连通块中,在的话就答案 (属于废边),否则将连通块合并。 #include <bits/stdc++.h> using namespa
14. 最长公共前缀
摘要:题目链接: 实现一、 求 多串的最长公共前缀,首先想到 。 class Solution { public: static const int N = 210; int ch[N][26], idx, cnt[N]; void insert(strin
ABC 287 E - Karuta
摘要:题目链接: 方法一、 由于 表示两字符串最长公共前缀的长度,首先第一反应就是字典树。 这题比较特殊,需要对每一个字符串求解其对其他所有字符串最长公共前缀的最大值。 思路:先将所有字符串插入字典树中,然后对于每个字符串,忽略字典树里它独有的结点
P2580 于是他错误的点名开始了
摘要:题目链接: 方法一、 #include <bits/stdc++.h> using namespace std; const int N = 5e5 + 10; int ch[N][26], idx, cnt[N]; void insert(string s) { int p
2351. 第一次出现两次的字母
摘要:题目链接: 自己的做法: class Solution { public: char repeatedCharacter(string s) { int n = s.size(); vector<int> v(28); vector<pair<char,int> > p; for (int i =
ABC 287 D - Match or Not
摘要:题目链接: 第一次提交:依据题意直接模拟,喜提 。 #include <bits/stdc++.h> using namespace std; bool check(string a, string b) { for (int i = 0; i < a.size(); i++)
ABC 287 B - Postal Card
摘要:题目链接: 由于是可以和 的多个字符串相同而仅计数一次,考虑把 中的字符串用 存储已达到去重的目的。 注: 的 返回 表示找到了该元素,返回 则说明没找到。 #include <
std::count 函数
摘要:1. 函数介绍 std::count是C++标准库中的一个算法,用于计算给定值在指定范围内出现的次数。它的原型如下: template <class InputIt, class T> size_t count(InputIt first, InputIt last, const T& value)
jiangly算法模板收集(自存)
摘要:转载自:jiangly算法模板收集 声明 2024.03.31 Update:新增《Splay(其三)》。 历史更新记录 2024.02.21 Update:文件层级重构,新增《后缀自动机(SuffixAutomaton 旧版)》、《回文自动机(PAM)》 龙年快乐~ 2023.12.29 Upda
值得学习的技巧/码风——mainly from jiangly
摘要:1、主体框架: #include <bits/stdc++.h> using i64 = long long; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); } 2、基本都在主函数中定义数组而非全局,且多用
ABC 286 C - Rotate and Palindrome
摘要:题目链接: 注意到“您可以按任意顺序执行以下两种运算零次或多次”。 因此,解决这个问题的一个重要观察点是,你可以假设 操作执行了几次,然后 操作执行了几次。你也可以假设 操作最多被执行 次(因为执行 次就会使它处于原始状态) 有了这个观察结
P3131 [USACO16JAN] Subsequences Summing to Sevens S
摘要:题目链接: 直接暴力的话时间复杂度为 ,显然会 。 #include <bits/stdc++.h> using namespace std; const int N = 5e4 + 10; int a[N], S[N]; int main() { ios:
2320. 统计放置房子的方式数
摘要:题目链接: 本题和198.打家劫舍有异曲同工之妙。 由于街道两侧互不干扰,因此可以考虑只计算出一侧的状态,然后利用乘法原理即可。 状态划分时,考虑第 个地块选或不选: 若选,则第 个地块不能选,第 个地块可选可不选。 若不
377. 组合总和 IV
摘要:题目链接: 本题是爬楼梯的又一变式。 分析样例可知,每次选择的都可以是 中的任一个数,而最后选择完毕的数之和等于 . 可以认为我们每次从 中选一个数作为往上爬的台阶数,问爬 个台阶有多少种方
2466. 统计构造好字符串的方案数
摘要:题目链接: 本题其实是爬楼梯这道题的变式。 题目要求长度在 之间的好字符串个数,那我直接把所有长度的好字符串个数搞出来,再取长度在这个区间的相加就完事了。 设 表示构造长为 的字符串的方案数,也即长为 的好字符串的
P3478 [POI2008] STA-Station
摘要:题目链接: 既然让求深度之和,那么我就定义以 为根时深度之和为 ,现在就是思考状态转移的问题。如果以某种手段得到了 ,那么接下来的转移就好说了。 设 为当前节点, 是当前节点的子节点。 表示以 为根的子树中的节点
1039. 多边形三角剖分的最低得分
摘要:题目链接: 实现一、记忆化搜索 class Solution { public: int minScoreTriangulation(vector<int>& values) { int n = values.size(); int memo[n][n]; memset(memo, -1, size
P1464 Function
摘要:题目链接: 本题为一道极其经典的记忆化搜索模板题,务必搞懂并掌握记忆化搜索的常见书写格式。 主要思想就是用一个 数组将每一个 函数的值存储起来,下一次检查 的值,如果已经算过就直接调用,可节省大量时间。 #include <cstdio> #
516. 最长回文子序列
摘要:题目链接: 本题考察区间 。 设 表示子串 中的最长回文子序列的长度。 思考状态转移方程。因为是判断回文的问题,考虑首尾元素是否相同。 若首尾元素相同,则考虑去掉首尾元素之后子串的最长回文子序列的长度 + 2(首、尾元素各一个) 反之若首
198. 打家劫舍
摘要:题目链接: 本题考察动态规划。 实现一、递推 表示考虑下标从 的房屋最多能抢劫到的金额。 思考状态转移时考虑第 个房屋抢或不抢。 由于不能抢劫相邻的房屋,若抢了第 个房屋,则第 个房屋就不能抢,再抢只能从 \(i-2
1312. 让字符串成为回文串的最少插入次数
摘要:题目链接: 本题为经典的区间 问题。 设 表示将子串(端点为 )转换为回文串所需的最少插入次数。 若首尾字符相同,则只需考虑去除首尾元素的子串。 反之,若首尾元素不相同,则 ① 先不看首元素,考虑 ,将其转换为回文串后只需
P1002 [NOIP2002 普及组] 过河卒
摘要:题目链接: 从起点走到终点,最后一步一定是向右或向下走过来的,因此就可以列出状态转移方程。值得注意的是,对于横着和竖着的两条边界不可直接想当然地认为路径数一定等于 ,因为在中途可能会有控制点的存在,因此还是要老老实实地列出状态转移方程。由于边界时只会从一个方向递推过来,但是初始时下标从 \
P3654 First Step (ファーストステップ)
摘要:题目链接: 本题数据范围仅为 ,因此可以暴力枚举 ,唯一需要注意的一点就是当 时,横着站和竖着站是一样的,答案被计算了两次,因此最终的 需要再除以 。 #include <bits/stdc++.h> const i
P2392 kkksc03考前临时抱佛脚
摘要:题目链接: 这道题的题意容易引起歧义。 举一个 数据。 2 1 100 2 答案应该为 左脑算 右脑算 答案是 。 第一个科目 有一题,所以我们可以得到: 1、全左脑:耗时 。 2、
P3392 涂条纹
摘要:题目链接: 第一反应是枚举白色和蓝色、以及蓝色和红色的边界。输入字符数组的同时,预处理出将每一行涂为白色、蓝色、红色所需要的块数。 分别表示将第 行涂成白色、蓝色、红色所需的块数。 然后对 分别求一遍前缀和,白色部
P2036 [COCI2008-2009 #2] PERKET
摘要:题目链接: 本题显然考查 ,但需注意是否恢复现场和参数设置的细节。 #include <cstdio> #include <algorithm> const int N = 15; struct Edge { int sour; int sweet; }e[N]; bool s
P2241 统计方形(数据加强版)
摘要:题目链接: 本题其实是一道找规律题,对于 的棋盘,可以试着找找看 矩形的个数,不难发现对于 的棋盘, 的矩形个数为: ① 横着的: ② 竖着的(可
P2089 烤鸡
摘要:题目链接: 不要怕太暴力而不敢打() 第一时间想到的其实是深搜,每个位置都有三种选择,考虑完当前位置后再顺次考虑接下来的位置。后来仔细一想,这不就是暴力枚举么!直接十重循环,每次看各个位置上的数之和是否等于 ,时间复杂度为 约为 , 因此不会超时。 #
P1618 三连击(升级版)
摘要:题目链接: #include <bits/stdc++.h> using namespace std; int p[10], sum; int main() { int A, B, C; bool flag = false; scanf("%d%d%d", &A, &B, &C); for (int