算法
Y.IU.
悄悄努力,然后惊艳所有人。
展开
-
乘积最大子数组(动态规划)
力扣大意:给定一个整数数组,求连续子数组乘积最大是多少。思路:前言:求子串的题目一般将每个数作为子串的结尾来看。先将题目转变一下,求和最大的子数组,问和最大是多少。按前言所说的,我们让表示以第i个数结尾的子串的最大和是多少,要么第i个数接到第i-1个数后面,要么第i-1个数单独作为一个子串看待,两者取,也就是:。 现在是求乘积,因为负乘负数等于正数,如果还是按求和最大的思路去求的话,会出问题。比如[-6,2,3,-2],按之前的思路我们会选择[2,3]得到6,但实际上我们...原创 2021-09-12 16:25:54 · 184 阅读 · 0 评论 -
HDU3038 LCIS
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3308大意:思路:Code#include <bits/stdc++.h>#define ll long long#define pir pair<int, int>#define pirl pair<ll, ll>#define debug(x) cout << #x << ":" << x << "\原创 2021-09-07 21:02:10 · 111 阅读 · 0 评论 -
牛妹游历城市(建立虚点跑最短路)
题目链接:https://ac.nowcoder.com/acm/contest/6885/E大意:给出n个点,第i个点有个权值,如果两个点i,j,权值,那么这两个点之间有一条无向边,边权值为,问从1-n的最短路径是多少。思路:暴力的思路:将每个数用二进制形式来看,统计每一位,将所有这一位为1的点两两连边,然后再跑最短路。 建立虚点优化:假设第i位为1的点有x个,那么要添加x*(x-1)/2条边,但是如果建立一个虚点j,让这x个点都连一条边权值为(1<<i)的边,再让j到x个点分别原创 2021-09-05 16:30:42 · 115 阅读 · 0 评论 -
7的意志(数位DP)
题目链接:https://ac.nowcoder.com/acm/contest/221/G大意:给定一个序列,包含7,77,777....777777...等无限长度的7,求[n,m]中有多少个数满足:该数能被序列中的某个数整除。 该数的数位之和是序列中的某个数的倍数。思路:假设这个数是x,x的数位和是xx,满足这两个条件,因为序列中其它数是7的倍数,所以如果x%777 == 0,那么x%7 == 0,同理如果xx%777 == 0,那么xx%7 == 0,所以问题就转化为了[n,m]中有原创 2021-09-02 21:41:19 · 188 阅读 · 0 评论 -
数学题(欧拉函数)
题目链接:https://ac.nowcoder.com/acm/contest/221/I前置知识:欧拉函数是1-n中与n互质的个数。 ,是1~n内与n互质的数的和。 大意:求1~n之间与n不互质的数的和思路:我们可以利用已有公式求出1~n内与n互质的数的和,然后用1~n的总和(总和为:)减去就是与n不互质的数的和。可以通过欧拉筛求,但是因为常数n太大,所以对n进行质因数分解,然后用公式来求。注意先对n取模再相乘。Code#include <bits/stdc..原创 2021-09-02 19:39:18 · 172 阅读 · 0 评论 -
郊区春游(状压DP)
题目链接:https://ac.nowcoder.com/acm/problem/16122大意:给出一个n个点和m条边带权的无向图,给出r个旅游景点,问游玩这r个景点的最小花费是多少。思路:r的范围很小,并且也不知道起始点和终点,所以可以枚举起点和终点。用二进制来表示01来表示这r个景点是否已经游玩,0表示未游玩,1表示已经游玩,然后枚举所有状态,总共(1~(1<<r)-1)种情况。定义状态:dp[mask][j] 表示当前游玩状态是mask,当前位置再点j的最小花费,现在要前原创 2021-08-31 12:41:32 · 111 阅读 · 0 评论 -
CCA的子树:树形dp
链接:https://ac.nowcoder.com/acm/contest/11168/C大意:给出一棵以1为根节点的树,在树中任取两个不是对方祖先节点的节点,使得这两个节点的子树点权和最大,如果不存在则输出Error。思路:当一棵树是一条链的时候,是找不到合法的点的。 对数进行DFS处理出每个节点的子树点权和,记为sum[v],每个节点子树中的最大点权和,记为msum[v]。 如果要两个点不是对方的祖先节点,那么这两个点就一定存在祖先节点是兄弟关系,所以我们对每个节点找到其孩子节点中第1原创 2021-08-26 12:13:40 · 72 阅读 · 0 评论 -
小G的LY数对:bitset优化
https://ac.nowcoder.com/acm/contest/11160/D大意:给定两组数,分别从两组数中取一个数,两个数异或后得到的数的二进制形式中的1的个数刚好是两个,问有多少对这样的数。思路:枚举异或后的数的所有情况,因为只有俩个位置是1,所以总共有种情况。假设是x,异或满足交换性,,先桶出每个b的个数,然后开始枚举。bitset优化:用bitset标记b是否出现,这样就不用每次在map中找了。时间复杂度:Code#include <bits/stdc++.原创 2021-08-25 18:07:52 · 96 阅读 · 0 评论 -
最长递增子序列(贪心+二分)
#include <bits/stdc++.h>#define ll long long#define pir pair<int,int>#define pirl pair<ll,ll>#define debug(x) cout << #x << ":" << x << "\n"const int N = 2e5+7;const ll mod = 1e9+7;const ll ds = 1e18;con...原创 2021-07-27 11:14:03 · 150 阅读 · 0 评论 -
力扣第 250 场周赛
https://leetcode-cn.com/contest/weekly-contest-250/扣分后的最大得分:DP优化大意:给出一个n*m的矩阵,矩阵中的每个格子中有一个分数,在每行中选一个格子并得到它的分数,但是要减去相邻行选中格子的列差值的绝对值。问分数最多是多少。思路:很容易想到用dp来做.定义状态:表示第i行选第j个数时前i行能得到的最大分数。状态转移:其中初始化:在第0行时自己就是最大分数如果不优化的话,在当前行要枚举j列,而从上一状态转移过来时又要枚举j列.原创 2021-07-22 19:40:10 · 103 阅读 · 0 评论 -
分段打表
什么是分段打表:分段打表结合了前缀和的知识。比如我们要求1-n的和,但是n到了1e8,不能开到1e8的数组,然后我们就可以考虑没100个数记录和,sum[1]表示前100个数的和,sum[2]表示前200个数的和,依次类推,sum[1000000]就表示前1e8的和。所有如果我们要求1-123的和,那么就是sum[1]+101+...+123,前一段O(1)求,后一段暴力求,后一段暴力复杂度在O(100)内,所以要恰当的选择段大小。这下就不用怕数组存不下了。题目:https://ac.nowco原创 2021-04-01 12:53:06 · 499 阅读 · 0 评论 -
求区间[L,R]内某个数出现的次数(二分/分块)
https://ac.nowcoder.com/acm/contest/13504/E大意给出n个贝壳,每个贝壳上有一个编号,q次询问,每次询问在区间[L,R]内有多少个是x的倍数。思路用vector保存每个数的下标,枚举所有小于等于最大编号并且是x的倍数的编号,二分枚举这个数的所有满足在[L,R]内数有多少个。code#include <bits/stdc++.h>#define ull unsigned long long#define ll long long原创 2021-03-28 16:15:42 · 1278 阅读 · 0 评论 -
最长公共子串模板
#include <bits/stdc++.h>#define ull unsigned long long#define ll long longconst int inf = 0x3f3f3f3f;const int mod = 10007;const int N = 2e3+7;const int ds = 1e8+7;const double PI = 3.141592653589793238462643383; using namespace std; i...原创 2021-03-26 09:16:40 · 67 阅读 · 0 评论 -
牛客IOI普及组-D小L的数列
D小L的数列素因子建图+记忆化搜索大意:数组a中保存的是好数,数组b是好数列满足bi<b(i+1),gcd(bi,b(i+1)) > 1, 且b中的元素是a中的数,问b最长是多少。思路:先将a排序,将a中的所有元素按质因子分解,如果有两个数的https://ac.nowcoder.com/acm/contest/11164/D#include <bits/stdc++.h>#define ull unsigned long long#define ll long lon原创 2021-03-05 22:14:41 · 161 阅读 · 0 评论 -
Educational Codeforces Round 105(Rated for div2)
本场链接:https://codeforces.com/contest/1494A. ABC Stringhttps://codeforces.com/contest/1494/problem/A大意:给出只含有A,B,C的字符串,其中A,B,C可以转换成’(‘或‘)’,并且相同字符只能转换成相同的括号,问全部转换后得到的括号匹配是否合法。思路:首先第一个必须是’(’,最后一个必须是‘)’,否则不可能。求出对应的字符后,那么考虑剩下的字符转换成’(’,还是’)’,转换完后就是括号匹配问题了(可以用栈原创 2021-03-04 11:22:20 · 220 阅读 · 1 评论 -
Codeforces Global Round 13
本场链接:https://codeforces.ml/contest/1491A. K-th Largest Valuehttps://codeforces.ml/contest/1491/problem/A#include <bits/stdc++.h>#define ull unsigned long long#define ll long longconst int inf = 0x3f3f3f3f;const int mod = 998244353;const int N原创 2021-03-01 16:51:08 · 64 阅读 · 0 评论 -
最短路例题
Floyd求最短路例题:http://acm.hdu.edu.cn/showproblem.php?pid=1874#include <bits/stdc++.h>#define ull unsigned long long#define ll long longconst int inf = 0x3f3f3f3f;const int mod = 998244353;const int N = 5000005;const ll ds = 1e15+7;//const doubl原创 2021-02-26 22:29:35 · 62 阅读 · 0 评论 -
最小生成树例题
题目链接:https://ac.nowcoder.com/acm/problem/19964代码:#include <bits/stdc++.h>#define ull unsigned long long#define ll long longconst int inf = 0x3f3f3f3f;const int mod = 998244353;const int N = 5000005;const ll ds = 1e15+7;//const double p1 = 3.原创 2021-02-26 17:51:38 · 97 阅读 · 0 评论 -
状压dp
例题:http://acm.hdu.edu.cn/showproblem.php?pid=1074题目大意:按作业名升序给出n个作业,每个作业有对应的名字,完成期限,完成所需要的时间,超过完成期限,超过多少天就扣多少分。问如何安排完成作业的顺序使得扣的分最少。如果有相同的顺序就按字典序升序输出。思路:一般这种安排顺序的,数据范围在20左右的一般考虑用状压dp来求解。状压dp的下标是二进制形式,比如11001,那么就是dp[25],表示选了第1,4,5个的扣分最少是多少,那这个状态可以由选了第1,4个后再原创 2021-02-26 15:35:01 · 85 阅读 · 0 评论 -
2021牛客寒假算法基础集训营6
G-机器人:排序+高精度https://ac.nowcoder.com/acm/contest/9986/G思路:k1排k2前面满足k1.a*(k2.ax+k2.b)+k1.b<k2.a(k1.ax+k1.b)+k2.bk2.ak1.b+k2.b>k1.a*k2.a+k1.b#include <bits/stdc++.h>#define ull unsigned long long#define ll long longconst int inf = 0x3f3f3原创 2021-02-25 20:43:06 · 63 阅读 · 0 评论 -
Codeforces Round #704(Div.2)
D-Genius’s Gambit:位运算https://codeforces.ml/contest/1492/problem/D大意:给定a,b,k 能否找到x,y使得x和y的二进制中有a个1,b个1,x-y的二进制中有k个1。思路:100-001 = 011,1000-0001 = 0111,还有1100-0101 = 0111,11100-01101 = 01111 从中我们可以发现当减数的最低为是零,被减数的最低位是1的时候,如果两者的其它位相同,那么相减后对应位是1,直到遇到某位(我称它为关原创 2021-02-24 22:42:48 · 102 阅读 · 0 评论