12 2023 档案
摘要:原题链接 题解 事实1.两个数合并后的数一定是偶数 事实2.如果没有发生奇数和偶数合并,那么最终的结果一定是所有数的和 事实3.每发生一次奇数和偶数合并,最后的结果会减一 总结 综上所述,Masha会尽量选择同奇或同偶合并,但在有同奇的情况下,会优先选择同奇,因为合并会产生偶数,且Olya需要用到奇
阅读全文
摘要:原题链接 题记 1.题目漏了个说明条件,应该说明所给数据一定能找到对应的x 例如a=2,b=6就找不到相对应的x 2.如果一定存在对应的x,那么b一定是x除以x最小的因子,a一定是x除以x第二小的因子 如果第二小的因子不是由第一小的因子的平方得到的,那么 一定能找到x 否则再乘
阅读全文
摘要:原题链接 细节 1.如果b相乘能达到2023,那么b一定是2023的因子,即2023%b==0 2.只要有1个b不是2023的因子,就no 3.如果用乘法判定是否达到2023,那么有可能会类型溢出(5个不大于2023的数相乘) 综上所述 代码 #include <bits/stdc++.h> usi
阅读全文
摘要:原题链接 前言 考场上想了半天,用了好多种思路,最后用背包类一维数组加上最大的最小值记忆化求解。 思路 我一开始想的思路,就不说了,直接说我最终解法是怎么得到的。 我想什么时候无法启动智能车,即判断存不存在电池的组合使得刚好达到所需电力? 我的脑海里冒出了暴力搜索,但是显然这种方法不可能。 记忆化搜
阅读全文
摘要:原题链接 什么时候无解? 有解计算 code #include<bits/stdc++.h> #define ll long long using namespace std; ll a[200005]={0}; int main() { ll t; cin>>t; while(t--) { ll
阅读全文
摘要:原题链接 简化题目 有一些左端点,右端点和权重,总价值是区间的长度乘上权重(区间长度=右端点-左端点),求最小总价值 开始思考 事实1.所有区间长度加起来是个定值 开始思考:能不能贪心做?答案是能。 在贪心的情况下,交换任意两个区间的端点或权重都会使总价值上升。(可以简化到只有n=2的情况考虑) 细
阅读全文
摘要:原题链接 题解 1.在处理最短路的时候,我们采用优先队列的方法,即第一个出现的点一定是最小的,之后出现的点都是在其他点的基础上叠加的值,肯定不小于第一个。那么依然是这个思路,第二个出现的点一定是次短的。 代码 #include<bits/stdc++.h> using namespace std;
阅读全文
摘要:设想有一条竖线代表大串当前匹配到的字符的右边,一格一格往后移,同时小串已经匹配的位置和竖线右对齐。 如果竖线右移一格之后大小串下一个字符不匹配,就把小串往后移,直接移到最长的公共前后缀前缀盖过后缀,直到下一格字符匹配或下一个字符是小串的头字符。 为什么要计算前后缀呢? 在下一个字符之前的已匹配串中,
阅读全文
摘要:原题链接 思路 找到所有入度为零的点,然后消除其子节点的入度,再把入度为零的点塞入队列中 为什么可以这么做呢? 一个点能弹出队列,其父节点一定比他先入队,以此类推。。 代码 #include<bits/stdc++.h> using namespace std; vector<int> G[1000
阅读全文
摘要:原题链接 简单概括 把每个i看成一只怪兽,每只怪兽的初始能量值是 ,怪兽可以吃掉其他比自己能量值小的怪兽,并得到进化,能量值增加,增加的大小等于被吃的怪兽的能量值。 问每只怪兽最多能吃几只怪兽? 事实 1.无论如何,一只怪兽一定能吃掉所有初始值比他小的怪兽。 2.在吃完所有初始值比他小
阅读全文
摘要:原题链接 模拟+去重 代码 #include<bits/stdc++.h> using namespace std; int l[4]={1,1,-1,-1},r[4]={1,-1,-1,1}; struct unit { int x,y; bool operator<(const unit& ot
阅读全文
摘要:原题链接 总结 1.搜索其实就是全部遍历一遍,只不过可以把遍历过的,以及接下来一看就知道不用遍历的不去遍历,也就是剪枝 2.一定要明确自己所设的搜索函数各个变量的含义!! 代码 #include<bits/stdc++.h> using namespace std; int n,k; int a[3
阅读全文
摘要:原题链接 前言 一道精简但是内容丰富的题 一些事实 1.循环左移len位后数组的节点对应原数组的节点,相当于在无限自复制循环的数组中将原来的节点右移len位 2.如果该数组能被定点数组循环左移x位得到,那么该数组最后一个节点的值一定是x 3.不管怎么位移,可能的数组最多只有n种不同的情况(1~n分别
阅读全文
摘要:花了近1h没做出来的题,放弃吧。 1.用你目前的方法,绝壁做不出来,赶紧看答案去吧。 2.绝壁有一个你考虑不到的点,赶紧看答案吧,收获不比你自个熬来的小。 3.你一定缺乏相关逻辑链/基础知识作为支撑,赶紧看答案然后刷相关简单题吧。 4.再者,你看答案搞懂也要花很久,何必浪费时间?别提那可笑的自尊了
阅读全文
摘要:原题链接 题解说的很详细,我来讲讲我对为什么要用异或判断的想法 异或为零是先手必败状态的一个属性,我们通过属性来判断类别。 代码 #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) {
阅读全文
摘要:原题链接 洛谷题解很详细,自己写了些理解在代码注释里 代码 #include<bits/stdc++.h> using namespace std; int atch[50005]={0}; int vis[50005]={0}; vector<int> G[505]; int weiy(int n
阅读全文
摘要:原题链接 导论,有点博弈论的感觉? 每个人轮流选一个大家都有的球,然后自己扣一个球,对方扣完。问女生剩下的球减去男生剩下的球,最大值是多少? 一些条件 1.初始每个人每种球都有 2.女生想使答案值大一点,男生想使答案值小一点,换句话说,女生想使 值大一点,男生想使 值大一点,每个人都
阅读全文
摘要:原题链接 穷举,属于模拟题,不要害怕 注意,判断三天互不相同时要判断三次:a!=b,b!=c,c!=a 代码 #include<bits/stdc++.h> #define ll long long using namespace std; struct unit { ll v; ll d; };
阅读全文
摘要:原题链接 导论 1.第一想法是贪心,但是很显然,贪心不行,如果a[i]很小,b[i]很大,b[i]就永远不会用到 2.所以要有动态规划的思想,即把每种可能的情况都保留下来,以后可能用到 一些事实 不管我怎么选择完成任务的顺序,我至少会把前i种任务完成至少一遍,即a[i] 在假设我最多只完成到前i种任
阅读全文
摘要:原题链接 快速读题 给出一个序列,使其满足 成立的次数恰好为k 思路 只要满足条件的序列都算作成立,我们就可以特殊化 先做出一个单增序列,由于前半部分所有元素都满足条件,所以前半部分保留(k+1)个元素,翻转后(n-k-1)个元素 但是sort默认升序,所以我们倒
阅读全文
摘要:原题链接 结合样例读题 1.输入序列代表每一时刻思考的题目 2.如果思考的题目时长超过给定值就代表题目解决。 综上 如果一个字符的出现次数大于给定值就代表解决了这个问题。 代码 #include<bits/stdc++.h> using namespace std; int main() { int
阅读全文
摘要:原题链接 反思 要明确每个变量的含义!!! 读题 1.取一对01置换,或者删掉一个元素,使得经过若干次改变后的序列 ,和 的前 项元素各不相同。求问最少要删掉几个元素? 一些事实的思考 1.对于一个给定的序列 ,和另一个 “0的个数”与“1的个数”均相同,但是排列
阅读全文
摘要:原题链接 快速读题 将所给字符串分为两个部分,前半部分为a,后半部分为b。求问是否存在某种分法使得a<b 思路:贪心 分割方法:字符串的第一个数一定非零作为a的开头,找到第二个非零数作为b的开头 判断方法:因为 长度不超过8,而int型最大约 ,所以可以直接
阅读全文
摘要:原题链接 反思:要把各种可能的情况都判断一遍再提交!不要急着提交 简介 仓库里有若干个二次方数,请问是否能取出若干数使得刚好等于给定数? 情况讨论 情况1.仓库里只有一个4,但是我要求2,求不得 情况2.仓库里有三个1,我要求3,能求 大概思路 从 遍历(从大到小
阅读全文
摘要:原题链接 看代码,懂得都懂,不懂就真不懂 #include <bits/stdc++.h> using namespace std; string str, head, send; int N, M, K; int main() { cin >> str; cin >> N; while (N--)
阅读全文
摘要:原题链接 思路历程 1.一开始我不知道具体该怎么放,于是我按照样例2的顺序手画了一遍。 2.然后发现,对于一个n*n的矩形,再放一个格子最大能使其达到(n+1)*(n+1) 3.1*1时,放了1个格子,2*2时放了2个格子,由此可以推出放n个格子时最大能达到n*n 4.这道题就变成了,找出k使得k*
阅读全文
摘要:原题链接 前情提要 题目不难看懂,即求a->b过程中的所有点的延迟和。显然可以暴力遍历一遍完成,但是时间复杂度太高了。 改进算法 想象这个图是由点和线组成的,把其中一个点提起来,这样就变成了一个树(n叉树),任意两点(a,b)间的延迟和等于a->lca->b,其中lca为ab两点的最近公共祖先 这样
阅读全文
摘要:1.已知有路径算距离。 2.状态转移方程解读:在必须经过这个点的情况下,距离会不会更短? 3.wait til more
阅读全文
摘要:前言 翻遍洛谷题解,看到大家都在套模板,却很少有人讲出为什么,使我十分崇拜天赋哥。 原题链接 关于这题的一些事实性证据 事实1.来自 事实2.来自 事实3.来自 事实4.来自 整理上述事实 1.每一次”最短“最优涂色,要么在其他颜色的基础上涂,这称之为融入一个整体;要么另辟蹊径单独找一块地涂,这称为
阅读全文
摘要:原题链接 1.导论 这道题能不能用贪心做?答案是不能,具体为什么已经有题解给出回答。当贪心无法求解时,我们考虑一下动态规划。 2.算法设计 对于任一节点,其最坏情况(即所需最大起始威力值,后文称最大值)是什么? 当第一个被攻击的怪物(以下称头怪物)在其右边时,其最大值为右边怪物的数量加上自身初始值,
阅读全文
摘要:戳这里,看原题 多重思想的巧妙结合 不多说了,看代码就懂了 #include<bits/stdc++.h> using namespace std; int up[200006]={0},down[200006]={0}; int a[200006]={0}; int main() { int t;
阅读全文
摘要:绝,太绝了 看我娓娓道来 1.如果 过程中有进位,那么位数和肯定不等(+1-10) 2.由此可知,只要相加过程中没有进位的abc就是合法的 3.n的每一位等于abc对应的每一位的和 4.最后一步就是排列组合的思维,我真的词穷了。。。 代码 #include<bits/stdc++.h
阅读全文
摘要:题目传送门 我是彩笔 二分trigger:存在一个最小值,使得当大于最小值时一定成立,小于最小值时一定不成立 #include<bits/stdc++.h> using namespace std; int n; int l[200005]={0},r[200005]={0}; int ss(int
阅读全文
摘要:原题链接 思路请看题解,讲的非常详细,细节请看我 一道很多细节的题 1.初始化要赋1e9 2.只有在两个村庄都重建完之后,一条路才通 3.一条路都通了之后,两个村庄都要再走一遍 4.村庄编号从0开始,而不是从1开始 5.弹出重建完成的村庄时,迭代器it记得加上判断不超过n,因为t为零时永远小于whe
阅读全文
摘要:原题链接 导入 1.假如你是老头,你每次关灯最多有两个选择: 一.关最左边的灯 二.关最右边的灯 而你的目的是:使总耗电量最小 Q:那我能不能每次选去关功率大的那个灯呢? A:不行,因为耗电量还与时间有关 Q:那我能不能每次选去关 路程(时间) 功率 较大的灯(即贪心)呢? A:不行,假设这
阅读全文
摘要:原题链接 导入 1.对于一个给定的序列,最后一个加进来的元素不是最左端就是最右端,如果是最左端,那么代表去掉最左端的序列中最后一个加进来的元素比最左端小,最右端同理。 2.对于一个给定的序列,可能的排序结果无非两类,一类是以最左端的元素结尾的,一类是以最右端的元素结尾的。因此设\(sum[i][j]
阅读全文
摘要:原题链接 点拨: 运用动态规划的思路 对于一给定的字符串,其未来和现在有什么关系? 假如其过去已知,其现在和过去有什么? 细节 当两端相等时,继承不一定比从中间合起来要小 代码 #include<bits/stdc++.h> using namespace std; int main() { int
阅读全文
摘要:原题链接 导论 1.数列末尾插入一个没有在数列中出现过的数,然后对数列中的每个数加上x的若干倍数(其中的x对于每个数而言均相同),使得数列中的所有数均相等 2.由导论1可以推出,x一定是 的最大公约数 3.导论2的时间复杂度显然太高了,
阅读全文
摘要:原题链接 1.审题 1.使得转账后 B 收到 100 元。 2.互相转账 3. z%的手续费(z<100) 2.思路 1.dijkstra算法(很讨厌这种算法名字):把已探访过的点的下一个点中“ ‘还没探访过的点’的更新”放进堆里,堆里弹出未探访点的第一个更新便是该点的最值 2.准备工作,把所有的边
阅读全文
摘要:不能用dijkstra算法 的原因(个人拙见): 题解 1.思想导论 对于没有负环的图中能到达的任意一个节点,从1出发的最短路径,途中经过的点至少有2个,最多为n个(包括两端)。 设经过的点数为路径的长度 2.思想落实 设cnt[i]为到达i的最短路径的最大长度,每更新一次长度,就更新一次cnt[i
阅读全文
摘要:原题链接 不知道这个思想叫什么,应该叫结果思想 导论 如果存在一个最长的字符串,我又没有可能把他消掉? 答案是,只要其他字符的长度大于等于最长字符串的长度,就一定能把他消掉。 所以我们不考虑字符串是怎么消除的,直接看结果。 原因解释如下 1.该最长字符串一定和其他字符相连,则消除操作显然。 2.如果
阅读全文
摘要:1.原理 对于每一次函数调用,选当前数组的第一个元素为标准值,遍历数组,把所有小于标准值的元素放到标准元素的左边,大于等于标准值的元素放到右边。知道调用函数中的数组长度小于2。 2.为何使用 1).虽然时间复杂度不稳定->(O2),但是在许多应用场景中,我们并不需要稳定性。 2).没有病态的比较,即
阅读全文