- 博客(38)
- 收藏
- 关注
原创 AcWing 348. 沙漠之王(0/1分数规划)
0/1分数规划从该题可以归纳出的0/1分数规划的一般模型:给定正整数a1,a2...ana_{1},a_{2}...a_{n}a1,a2...an以及b1,b2...bnb_{1}, b_{2}...b_{n}b1,b2...bn从中选出若干对的a和b的和的商,求商的最大值Max或者最小值Min,即:∑a[i]∑b[i]∈[Min, Max]\frac{\sum_{}a[i]}{\sum_{}b[i]}∈[Min, \ Max]∑b[i]∑a[i]∈[Min, Ma
2022-05-10 22:58:27
275
原创 杨辉三角形(二分 + 组合数)
杨辉三角杨辉三角思路:1.由于左右对称可以直接看左半边2. 组合数和杨辉三角:第i行第j列的数都是组合数C(i, j) (i,j从0开始)C(n, 1) = n --> 对应从左向右看斜着的第二列! —> 一定有解由于杨辉三角左右对称(C(a, b) == C(a, a-b)),又由于找第一次出现,因此一定在左边,右边可以直接删掉! 1 ---> C(0, 0) 1 1 2 ---> C(2,
2022-04-06 22:56:40
214
原创 网络分析(并查集 + 差分)
2069. 网络分析网络分析题意:动态维护集合的合并和集合内元素的查询 思路:1.类似区间合并单点查询,可以构造子节点和父节点直接的差分,即子节点真实值为该节点的值加上父节点的值,。2.由于并查集的路径压缩,每一次路径压缩都需要加上当前父节点的值例如如图1.当将集合4合并到集合1之下时候,为满足差分保证5,6不变,w[4]−=w[1]w[4] -= w[1]w[4]−=w[1].2.当将5-4-1的路径压缩程5-1时,w[5]+=w[4]w[5] += w[4]w[5]+=w[4]
2022-04-05 20:32:11
295
原创 整数拼接(取模->哈希表)
2068. 整数拼接整数拼接思路:取模操作大多都可以打表对于每个AiAjA_{i}A_{j}AiAj 都可以拆分为 Ai∗10cnt[j]+AjA_{i} * 10^{cnt[j]} + A_{j}Ai∗10cnt[j]+Aj, cnt[j]cnt[j]cnt[j]记为AjA_{j}Aj的位数由此可以先哈希打表每个Ai∗10jA_{i} * 10^{j}Ai∗10j,每次查询有多少个AjA_{j}Aj的可拼接数,查表即可!判重 样例输入:4 21 2 3 4 样例输
2022-04-05 16:25:56
233
原创 倍数问题(dp + 贪心优化)
1234. 倍数问题倍数问题思路:类似01背包思想状态转移不难推出贪心策略优化: 由于只选三个数所以每次只需要枚举所有元素中取膜相同的最大的三个元素即可 样例输入:4 31 2 3 4 样例输出:9TLEO(3∗n∗kO(3 * n * kO(3∗n∗k) 代码:#include <iostream>#include <vector>#include <cstring>#include <algorithm>using n
2022-04-04 22:51:51
252
原创 修改数组(并查集)
1242. 修改数组(并查集)修改数组 样例输入:52 1 1 3 4 样例输出:2 1 3 4 5 代码:#include <cstdio>const int N = 1100010;int p[N];int find(int x){ if (p[x] != x) p[x] = find(p[x]); return p[x];}int main(){ int n; scanf("%d", &n); f
2022-04-04 19:58:42
101
原创 斐波那契前 n 项和 || 垒骰子(矩阵乘法)
1303. 斐波那契前 n 项和斐波那契前n项和附赠y总保姆级分析 样例输入:5 1000 样例输出:12 代码://矩阵乘法d... ... 这他妈是人能想出来的?#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;typedef long long LL;const int N = 3
2022-04-04 19:29:39
118
原创 旅游规划(树的直径树形dp做法)
1078. 旅游规划旅游规划思路1、先通过树形dp求出每个点往下走的最大长度和次大长度,并且更新整棵树的最大路径2、枚举每一个结点i,设该点的最大长度是d1[i],次大长度是d2[i],若d1[i] + d2[i] ==ans,表示最大路径是从该点得出的,通过dfs2找到最大长度的路径,dfs3找到次大长度的路径,并对路径的点进行标记 样例输入:100 10 20 40 60 71 32 54 86 9 样例输出:012345689 代码://
2022-04-03 15:18:27
353
原创 鸣人的影分身(完全背包求方案数)
1050. 鸣人的影分身母题鸣人的影分身思路:f[i,j]f[i, j]f[i,j] : 前 iii 个数的和为 jjj 的方案数选0的情况: f[i−1,j]f[i - 1, j]f[i−1,j] 前i−1i - 1i−1个数和为 jjj 的方案数不选第i个:f[i−1,j]f[i - 1, j]f[i−1,j] 前i−1i - 1i−1 个数和为jjj的方案数选第i个:f[i][j−i]f[i][j -i]f[i][j−i]前iii个数的和为j−ij - ij−i的方案数 样例
2022-04-03 01:16:05
304
原创 糖果(经典重复覆盖问题)
糖果(状态压缩dp)当M较小时可以用状压DP,当M较大时可以用IDA*。糖果 样例输入:6 5 31 1 21 2 31 1 32 3 55 4 25 1 2 样例输出:2思路状态压缩dp:状态压缩O(n * 2^m) = 1e8勉强能过 代码:#include <iostream>#include <algorithm>#include <cstring>#include <cstdio>using names
2022-04-02 14:54:40
973
原创 聪明的燕姿
AcWing 1296. 聪明的燕姿聪明的燕姿思路:1.假设这个时候有一个约数和S满足(1+2)(1+2+22)(1+2+22+…+2k)(1+2)(1+2+2^2)(1+2+2^2+…+2^k)(1+2)(1+2+22)(1+2+22+…+2k),3∗5∗9∗17∗33∗65∗129=6350379753*5*9*17*33*65*129 = 6350379753∗5∗9∗17∗33∗65∗129=635037975 就已经接近1e9的量级了,大概满足条件的不会超过9或者10个质数,可见符合条件
2022-04-02 01:25:37
853
原创 等差数列||等比数列(最大公约数)
1246. 等差数列等差数列思路题意:知道若干项等差数列,求最短的等差数列项数即可行性最大公差 要使得an−a1d+1\frac{a_{n} - a_{1}}{d} + 1dan−a1+1即ana_{n}an为最大项,a1a_{1}a1为最小项,d为各项之间得最大公约数 样例输入:52 6 4 10 20 样例输出:10 代码O(nlogn):#include<iostream>#include<cstdio>#include<alg
2022-03-31 19:27:45
381
原创 后缀表达式(贪心)
1247. 后缀表达式后缀表达式思路 样例输入:1 11 2 3 样例输出:4 代码://符号可任意选择 -- core#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 2e5 + 10;typedef long long LL;int a[N];int n
2022-03-31 00:02:30
75
原创 乘积最大(贪心)
乘积最大乘积最大思路:首先我们知道 如果 k == n ,那么就证明所有的数字是全部都选,如果 k < n , 那么就要思考怎样去选择了:1.k 如果是偶数的话,选出来的结果一定是非负数 , 原因如下:(1) 负数的个数是偶数个的话,负负得正,那么一定是非负数(2) 负数的个数如果是奇数个的话,那么我们就只选偶数个绝对值最大的负数2.k 如果是奇数个的话,(1) 所有的数字如果都是负数,那么选出来的结果也一定都是负数(2) 否则的话,则一定至少有 1个非负数, 那么我们将最
2022-03-30 23:50:36
257
原创 灵能传输(前缀和 + 贪心)
1248. 灵能传输灵能传输思路1.观察发现每次对一个圣堂武士aia_{i}ai一次灵能传输都是对前缀和Si−1S_{i - 1}Si−1,SiS_{i}Si得一次交换2.问题转换为max(Si−Si−1)max(S_{i} - S_{i - 1})max(Si−Si−1)的最小值3.贪心策略可知只有当SSS单调时才能使得max(Si−Si−1)max(S_{i} - S_{i - 1})max(Si−Si−1)最小4.由于题目条件使得S0S_{0}S0 和 SnS_{n}Sn
2022-03-30 23:41:16
905
原创 翻转树边(树形dp)
4381. 翻转树边翻转树边思路即可以推出 up[ j ] = up[ fa ](父节点往上走需要翻的边) + down[ fa ](父节点往下走需要翻的边) - down[ j ](当前节点需要翻的边) ± 1(需要纠正的边) 样例输入:81 23 24 34 56 56 78 7 样例输出:34 6 8 代码:#include <iostream>#include <cstring>#include <algorithm&
2022-03-28 20:25:03
356
原创 牛的旅行(acwing和洛谷)
由于洛谷和acwing所求描述不同,题意有所改变1125. 牛的旅行(acwing)1125. 牛的旅行思路生成的新牧场和原牧场的最大直径1.floyd算法求出任意两个连通点之间的距离2.求出所有连通集合中的点到该点最远的距离3.枚举所有非连通点**maxd[i] + maxd[j] + dist[i,j] **即i点在该连通集合中最远的距离 + j点在该连通集合中最远的距离 + i两点的j的实际距离4.在原牧场和新牧场取最大值即可 样例输入:810 1015 1020 10
2022-03-25 21:44:23
537
原创 通往奥格瑞玛的道路(二分 + Dijkstra)
通往奥格瑞玛的道路(二分 + 最短路)思路:1.二分可解决最大最小或者最小最大一类的问题2.题目意思可以说我根本看不懂,其实题意:从1到n所有可行路径中,每个路径都有某个城市收费最大,求所有城市收费最大在所有路径的最小值3.用二分查找该最小值,每次设置一个可行最大费用若dijkstra过程中某城市的收费大于设置的值则不走这该城市。4.堆优化dijkstra堆维护消耗的血量,最后返回血量是否为正(是否走的到终点) 样例输入:4 4 8856102 1 22 4 11 3 4
2022-03-25 20:27:09
346
原创 P1119灾后重建(Flody应用)
灾后重建(Flody应用)思路:Q访问次数50000如果每次访问都求一次最短路毫无疑问会超时 N <= 200 可以看出Flody算法巧妙利用条件,每个村庄重建完成时间是单调递增的,访问的时间同是单调递增,每当访问的时间大于当前村庄最大修复时间,即可把小于访问时间的所有村庄作为Flody中转点k,做一次Flody最短路。 样例输入:4 51 2 3 40 2 12 3 13 1 22 1 40 3 542 0 20 1 20 1 30 1 4 样例输出:-
2022-03-25 19:58:20
353
原创 P2392 考前临时抱佛脚
P2392 考前临时抱佛脚P2392 考前临时抱佛脚以为是贪心问题结果全wa思路我们需要使耗时尽可能接近 t / 2, 其实就是一个0-1背包问题,体积和价值都是时间,背包的体积为t / 2,可求出在t / 2的时间内最短的耗时时间,那么总耗时即为max(v, t - v); 样例输入:1 2 1 3 54 362 4 3 样例输出:20 代码:#include <iostream>#include <cstring>using namespa
2022-03-24 09:27:19
308
原创 波动数列(组合问题求方案数)
波动数列1214. 波动数列思路O(n^2)设第一个数为x,则第二个数为x+d1x+d1x+d1,第三个数为x+d1+d2…x+d1+d2 …x+d1+d2…。这里的d1,d2表示a或者−b,所以这个数列为:x,x+d1,x+d1+d2,x+d1+d2+d3,......,x+d1+d2+...+dn−1x,x + d_{1}, x + d_{1} + d_{2}, x + d_{1} + d_{2} + d_{3},... ...,x + d_{1} + d_{2} + ... + d_{n -
2022-03-24 08:39:19
1538
原创 合适数对(树状数组 + 离散化)
合适数对(树状数组 + 离散化)4316. 合适数对.求区间和不超过T得个数思路求区间和可以想到前缀和,数据范围大且个数少用离散化离散前缀和为O(n^2)时间复杂度TLEs[i] - s[i - k] < t , 移项可得 s[ i - k ] > s[ i ] - t用树状数组动态维护s[ i ]的排名, 访问查询下标比 i 小的数(树状数组)小于s[ i ] - t 的个数, 并用总个数 i - query就是大于 s[ i ] - t的个数 样例输入:5 45 -1
2022-03-23 23:53:55
357
原创 简单深度搜索
1.DFS排列数字输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1模板:#include<iostream>#include<cstdio>using namespace std;const int N = 133;int n;int path[N];bool st[N];void dfs(int u){ if(u==n){ for(int i=0;i<n;i++) printf("%d ",
2022-03-21 23:31:02
86
原创 acwing-KMP字符串
7.KMPKMP字符串输入样例:3aba5ababa输出样例:0 2模板://KMP 算法 #include<iostream>using namespace std;const int N = 100010;int n,m;char p[N],s[N];int ne[N];int main(){ cin>>n>>p+1>>m>>s+1; // 求 next 的 过 程 ---->前缀==后
2022-03-21 11:10:56
117
原创 acwing食物链(带权并查集)
食物链输入样例:100 71 101 1 2 1 22 2 3 2 3 3 1 1 3 2 3 1 1 5 5输出样例:3模板:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int N = 50005;int n, m;int p[N], d[N];//0 表示与根
2022-03-21 11:05:28
137
原创 acwing连通块中点得数量
连通块中点的数量输入样例:5 5C 1 2Q1 1 2Q2 1C 2 5Q2 5输出样例:Yes23模板://连通块中点的数量#include<iostream>using namespace std;const int N = 100010;int p[N],size[N];int n,m; int find(int x){ if(p[x]!=x) p[x]=find(p[x]); return p[x];}int main(){ scan
2022-03-21 11:04:08
152
原创 acwing合并集合
合并集合输入样例:4 5M 1 2M 3 4Q 1 2Q 1 3Q 3 4输出样例:YesNoYes模板://并查集//1.讲两个集合合并 2.询问两个元素是否再一个集合当中 // 如何判断树根// 如何求x的集合编号// 如何合并两个集合 px是x的集合编号 py是y的集合编号 。 #include<iostream>using namespace std;const int N = 100010;int n,m;int p[N];int f
2022-03-21 11:02:41
107
原创 acwing搜索
文章目录最小步数模型1107. 魔板最小步数模型1107. 魔板 样例输入:2 6 8 4 5 7 3 1 样例输出:7BCABCCB 代码模板:#include <cstring>#include <iostream>#include <algorithm>#include <unordered_map>#include <queue>using namespace std;char g[2][4];un
2021-11-06 13:33:06
381
原创 kuangbin
文章目录Max Sum Plus PlusMax Sum Plus Plus 样例输入:1 3 1 2 32 6 -1 4 -2 3 -2 3 样例输出:68 代码模板:#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int maxn = 1e6+10;const int I
2021-11-04 17:27:33
162
原创 树状数组(区间、单点的修改和查询)
树状数组(区间、单点的修改和查询)文章目录树状数组(区间、单点的修改和查询)一、单点修改、区间查询二、区间修改、单点查询三、区间修改、区间查询一、单点修改、区间查询 样例输入:5 51 5 4 2 31 1 32 2 51 3 -11 4 22 1 4 样例输出:610 代码模板:#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>
2021-10-24 14:23:15
391
原创 LIS(最长上升序列)
LIS的三种做法文章目录LIS的三种做法题目描述一、动态规划二、贪心+二分三、树状数组题目描述 输入样例:73 1 2 1 8 5 6 输出样例:4 一、动态规划#include<iostream>using namespace std;const int INF = 1e9;const int N = 1005;int n,g[N],f[N];int main(){ cin>>n; for(int i=0;i<n
2021-09-15 23:21:34
209
原创 acwing数学知识
数学知识板子文章目录数学知识板子1.质数试除法判定质数分解质因数筛质数2.约数试除法求约数约数个数约数之和最大公约数(欧几里得算法)3.欧拉函数欧拉函数筛法求欧拉函数4.快速幂快速幂快速幂求逆元5.扩展欧几里得算法扩展欧几里得算法线性同余方程6.中国剩余定理表达整数的奇怪方式7.高斯消元高斯消元解线性方程组高斯消元解异或线性方程组8.求组合数求组合数I求组合数II求组合数III满足条件的01序列9.容斥原理能被整除的数10.博弈论NIM游戏1.质数试除法判定质数分解质因数筛质数模板://质数
2021-05-18 22:10:33
775
原创 基础数据结构
数据结构板子文章目录数据结构板子1.单链表单链表2.双链表双链表模拟栈3.栈模拟栈4.队列模拟队列5.单调栈单调栈6.单调队列滑动窗口7.KMPKMP字符串8.TrieTrie字符串统计最大异或对9.并查集合并集合连通块中点的数量食物链10.堆堆排序模拟堆11.哈希表模拟散列表字符串哈希12.STL1.单链表单链表模板:// head存储链表头,e[]存储节点的值,ne[]存储节点的next指针,idx表示当前用到了哪个节点int head, e[N], ne[N], idx;// 初始化
2021-05-18 19:49:19
105
原创 acwing基础算法
基础算法板子文章目录基础算法板子1.快速排序快速排序第K个数2.归并排序快速排序数的范围3.二分数的范围数的三次方根4.高精度高精度加法高精度减法高精度乘法高精度除法5.前缀和与差分前缀和子矩阵的和差分差分矩阵6.双指针算法最长连续不重复子序列数组元素的目标和7.位运算二进制中1的个数8.离散化区间和9.区间合并区间合并10.二分数的范围数的三次方根1.快速排序快速排序输入样例:53 1 2 4 5输出样例:1 2 3 4 5模板:#include<iostream>
2021-05-18 17:44:58
282
原创 背包问题(单调队列优化)
多重背包问题III传送门Acwing提示 本题考查多重背包的单调队列优化方法。输入样例4 51 2 32 4 13 4 34 5 2输出样例:10一、传统的多种背包问题for(int i = 1; i <= n; i ++) //枚举背包 for(int j = 1; j <= m; j ++) //枚举体积 for(int k = 0; k <= s[i]; k ++)
2021-04-17 14:08:05
166
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人