合集-洛谷
摘要:原题链接 我曾经写题时有个疑惑,那就是会不会算力恢复之后大于最大算力? 其实不会,把消耗的算力想象成占领,恢复算力想象成撤离,不管怎么恢复,领地都是那个领地。 #include<bits/stdc++.h> using namespace std; int power[200005]={0}; st
阅读全文
摘要:1. 利用map实现速查,优点是代码简洁,缺点是速度慢,内存大 #include<bits/stdc++.h> using namespace std; int a[200005]={0}; int main() { int n,c; scanf("%d%d",&n,&c); map<int,int
阅读全文
摘要:原题链接 题解 每次从所有果子堆中选重量最小的两堆并累加,观察到只需要找出 最小 因此考虑用堆,而当你对于堆的理解足够深之后,可以用c++ 的 priority_queue 代码 #include<bits/stdc++.h> using namespace std; int pile[10005]
阅读全文
摘要:原题链接 非常详细的题解见洛谷,个人见解见代码 方法一:倍增法 #include<bits/stdc++.h> using namespace std; #define N 500005 vector<int> G[N];//链树,以链上的元素为根节点的树 void add(int x,int y)
阅读全文
摘要:原文链接 枚举即可 #include<bits/stdc++.h> #define ll long long using namespace std; int s[14]={0}; int main() { ll n; scanf("%lld",&n); for(int i=1;i<=9;i++)s
阅读全文
摘要:原题链接 详解见题解区,个人见解见代码,蒟蒻真的折服于dalao的思路 #include<bits/stdc++.h> #define ll long long using namespace std; ll dp[20][210][1026]={0}; ll counts(int now) { l
阅读全文
摘要:不能用dijkstra算法 的原因(个人拙见): 题解 1.思想导论 对于没有负环的图中能到达的任意一个节点,从1出发的最短路径,途中经过的点至少有2个,最多为n个(包括两端)。 设经过的点数为路径的长度 2.思想落实 设cnt[i]为到达i的最短路径的最大长度,每更新一次长度,就更新一次cnt[i
阅读全文
摘要:原题链接 1.审题 1.使得转账后 B 收到 100 元。 2.互相转账 3. z%的手续费(z<100) 2.思路 1.dijkstra算法(很讨厌这种算法名字):把已探访过的点的下一个点中“ ‘还没探访过的点’的更新”放进堆里,堆里弹出未探访点的第一个更新便是该点的最值 2.准备工作,把所有的边
阅读全文
摘要:原题链接 点拨: 运用动态规划的思路 对于一给定的字符串,其未来和现在有什么关系? 假如其过去已知,其现在和过去有什么? 细节 当两端相等时,继承不一定比从中间合起来要小 代码 #include<bits/stdc++.h> using namespace std; int main() { int
阅读全文
摘要:原题链接 导入 1.对于一个给定的序列,最后一个加进来的元素不是最左端就是最右端,如果是最左端,那么代表去掉最左端的序列中最后一个加进来的元素比最左端小,最右端同理。 2.对于一个给定的序列,可能的排序结果无非两类,一类是以最左端的元素结尾的,一类是以最右端的元素结尾的。因此设\(sum[i][j]
阅读全文
摘要:原题链接 导入 1.假如你是老头,你每次关灯最多有两个选择: 一.关最左边的灯 二.关最右边的灯 而你的目的是:使总耗电量最小 Q:那我能不能每次选去关功率大的那个灯呢? A:不行,因为耗电量还与时间有关 Q:那我能不能每次选去关 路程(时间) 功率 较大的灯(即贪心)呢? A:不行,假设这
阅读全文
摘要:前言 翻遍洛谷题解,看到大家都在套模板,却很少有人讲出为什么,使我十分崇拜天赋哥。 原题链接 关于这题的一些事实性证据 事实1.来自 事实2.来自 事实3.来自 事实4.来自 整理上述事实 1.每一次”最短“最优涂色,要么在其他颜色的基础上涂,这称之为融入一个整体;要么另辟蹊径单独找一块地涂,这称为
阅读全文
摘要:原题链接 前情提要 题目不难看懂,即求a->b过程中的所有点的延迟和。显然可以暴力遍历一遍完成,但是时间复杂度太高了。 改进算法 想象这个图是由点和线组成的,把其中一个点提起来,这样就变成了一个树(n叉树),任意两点(a,b)间的延迟和等于a->lca->b,其中lca为ab两点的最近公共祖先 这样
阅读全文
摘要:原题链接 洛谷题解很详细,自己写了些理解在代码注释里 代码 #include<bits/stdc++.h> using namespace std; int atch[50005]={0}; int vis[50005]={0}; vector<int> G[505]; int weiy(int n
阅读全文
摘要:原题链接 题解说的很详细,我来讲讲我对为什么要用异或判断的想法 异或为零是先手必败状态的一个属性,我们通过属性来判断类别。 代码 #include<bits/stdc++.h> using namespace std; int main() { int t; cin>>t; while(t--) {
阅读全文
摘要:原题链接 总结 1.搜索其实就是全部遍历一遍,只不过可以把遍历过的,以及接下来一看就知道不用遍历的不去遍历,也就是剪枝 2.一定要明确自己所设的搜索函数各个变量的含义!! 代码 #include<bits/stdc++.h> using namespace std; int n,k; int a[3
阅读全文
摘要:原题链接 思路 找到所有入度为零的点,然后消除其子节点的入度,再把入度为零的点塞入队列中 为什么可以这么做呢? 一个点能弹出队列,其父节点一定比他先入队,以此类推。。 代码 #include<bits/stdc++.h> using namespace std; vector<int> G[1000
阅读全文
摘要:原题链接 题解 1.在处理最短路的时候,我们采用优先队列的方法,即第一个出现的点一定是最小的,之后出现的点都是在其他点的基础上叠加的值,肯定不小于第一个。那么依然是这个思路,第二个出现的点一定是次短的。 代码 #include<bits/stdc++.h> using namespace std;
阅读全文
摘要:原题链接 首次尝试用chatgpt帮我写注释 code #include<bits/stdc++.h> using namespace std; int main() { int n; // 声明整数变量 n,用于存储输入序列的长度 cin >> n; // 读入序列长度 // 定义两个优先队列,q
阅读全文
摘要:原题链接 方法1: 有点像剪枝。 从 ~ 循环, 同理,如果 放不进去,那么 也放不进去 code #include<bits/stdc++.h> using namespace std; int a[100005
阅读全文