占位 94
,
做一只大熊猫
让优秀成为一种习惯!
展开
-
昨天临时题解
J1001 gcd题解KaTeX parse error: Expected 'EOF', got '&' at position 253: …d(k, t) = 1] &̲ \text{if }t = …$\phi(n) = n * \prod(1 - \frac{1}{p_i}) = n * \prod{\frac{p_i - 1}{p_i}} & [\text{if }n = \prod{p_i^{a_i}}, p_i\text{为质因子}] \$时间复杂度:O原创 2022-02-27 12:39:12 · 987 阅读 · 0 评论 -
AcWing 135. 最大子序和(单调队列优化 dp)
思路这题与普通的最大子段和不同,这题的最大子段和的长度不超过:m,我们设 fif_ifi 表示 i 结尾的最大子段和,那么:fi=Max(sumi−sumj),(1<=i−j<=m)f_i=Max(sum_i-sum_j),(1<=i-j<=m)fi=Max(sumi−sumj),(1<=i−j<=m) 观察当我们在枚举第 i 个位置的时候:sumisum_isumi 是变量,所有我们将sumi sum_isumi 从上面的式子提出来,那么原式变成:.原创 2021-11-25 10:02:39 · 325 阅读 · 0 评论 -
AcWing 1073. 树的中心(两边 dfs)
代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#define pb push_back#define m_p make_pair#define inf 0x3f3f3f3f#define INF 0x3f3f3f3f.原创 2021-11-25 09:45:09 · 188 阅读 · 0 评论 -
AcWing 1072. 树的最长路径(两边 dfs)
代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#define pb push_back#define m_p make_pair#define inf 0x3f3f3f3f#define INF 0x3f3f3f3f.原创 2021-11-25 09:40:57 · 141 阅读 · 0 评论 -
AcWing 1069. 凸多边形的划分(区间 dp)
代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#define pb push_back#define m_p make_pair#define inf 0x3f3f3f3f#define INF 0x3f3f3f3f.原创 2021-11-25 09:36:08 · 456 阅读 · 0 评论 -
AcWing 479. 加分二叉树(区间 dp)
思路一道看着很像树形 dp 的题,但其实是区间 dp。代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#define pb push_back#define m_p make_pair#define inf 0x.原创 2021-11-25 09:31:57 · 289 阅读 · 0 评论 -
AcWing 1058. 股票买卖 V(状态机dp)
思路盗一张一位大佬的:状态机图。从题目中我们得知状态转移非常复杂,如果我们使用状态机的思想:引入三个状态:手中有票、手中无票、冷冻期,那么我们能思路清晰的进行状态转移了。注意状态机中的边表示对应的:花费。代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi firs.原创 2021-11-25 09:23:40 · 100 阅读 · 0 评论 -
AcWing 1057. 股票买卖 IV(状态机 dp)
思路盗用一张别人的图。在上图中:手中有货 与手中无货是两个状态,这两个状态之间相互转换。图中的入口和出口对应:初始化 和 答案。y 总的状态机模型,把一些复杂的状态表示,状态转移,变的生动。代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#defi.原创 2021-11-25 09:15:53 · 100 阅读 · 0 评论 -
AcWing 734. 能量石(贪心排序+01背包)
思虑对能量石排序排完序用 01 背包求解。代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#define pb push_back#define m_p make_pair#define inf 0x.原创 2021-11-25 09:08:07 · 140 阅读 · 0 评论 -
AcWing 187. 导弹防御系统(dfs)
题意直接 dfs,dp 不好 dp代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#define pb push_back#define m_p make_pair#define inf 0x3f3f3f3f#.原创 2021-11-24 21:04:22 · 169 阅读 · 0 评论 -
acwing907. 区间覆盖(贪心)
思路从左向右贪心遇到没覆盖的点就选选段。代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#define pb push_back#define m_p make_pair#define inf 0x3f3f3f3.原创 2021-11-24 20:23:23 · 111 阅读 · 1 评论 -
acwing148. 合并果子(贪心)
思路贪心合并的小的。代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#define pb push_back#define m_p make_pair#define inf 0x3f3f3f3f#define .原创 2021-11-24 20:12:15 · 109 阅读 · 0 评论 -
acwing838. 堆排序
思路代码#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int h[N], sz;void down(int u){ int v = u; if (u * 2 <= sz && h[v] > h[u * 2]) v = u * 2; if (u * 2 + 1 <= sz && h[v] > h[u * 2 + .原创 2021-11-23 15:29:11 · 259 阅读 · 0 评论 -
AcWing 835. Trie字符串统计(字典树 trie)
思路对每个字符串建立字典树即可快速查询。代码#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int son[N][26], cnt[N], idx;char ch, s[N];void insert(char s[]){ int u = 0; for (int i = 0; s[i]; i ++) { int v = s[i] - 'a'; .原创 2021-11-23 11:15:57 · 137 阅读 · 0 评论 -
acwing831. KMP字符串
思路kmp 求单个字符串在主串 s 中的出现的位置、次数,还要考虑能不能算法重叠算不算贡献。代码#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int n, m;char s[N], t[N];int nxt[N], mk[N];void get_nxt(){ int j = 0, k = -1; nxt[0] = -1; while (j < m) .原创 2021-11-23 11:12:28 · 185 阅读 · 0 评论 -
AcWing 154. 滑动窗口(单调队列)
思路利用单调维护递增或递减的序列,从而在队头得出我们想要的极值。代码#include <bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int a[N], q[N];int main(){ int n, k; scanf("%d %d", &n, &k); for (int i = 1; i <= n; i ++) scanf("%d", &a[i]).原创 2021-11-23 11:07:55 · 68 阅读 · 0 评论 -
acwing3302. 表达式求值(双栈模拟)
## 思路这题的思路核心就是通过使用两个栈,一个是存放操作数的栈,一个是存放 运算符的栈,通过这两个栈进行模拟。代码#include<iostream>#include<map>#include<stack>using namespace std;map<char, int> isp, icp;const char opers[6] = {'+', '-', '*', '/', '(', ')'};const int isps[6] =原创 2021-11-23 11:03:38 · 121 阅读 · 0 评论 -
acwing1126. 最小花费
题意思路从终点 e 向起点 s 倒着跑 spfa,把 spfa 在根据题意稍微改一改。代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#define pb push_back#define m_p make_pair原创 2021-11-06 19:09:37 · 103 阅读 · 0 评论 -
acwing1127. 香甜的黄油
题意思路暴力 spfa。。。。。代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#define se second#define pb push_back#define m_p make_pair#define inf 0x3f3f3f3f#de原创 2021-11-06 19:09:11 · 86 阅读 · 0 评论 -
acwing238. 银河英雄传说(带权并查集)
题意思路这题明显的是带权并查集,但是我们要多维护一个集合大小 num [] 数组,因为我们这题的带权并查集维护的不仅是节点之间的相互关系,而需要维护的是实际真实的距离。有 num 之后就方便我们维护实际距离了。带权并查集核心维护真实边权的核心:代码/* #include <iostream> */#include <cstdio>#include <algorithm>using namespace std;const int原创 2021-11-05 11:18:51 · 120 阅读 · 0 评论 -
acwing239. 奇偶游戏(权值并查集 或 种类并查集)
题意思路权值并查集#include <bits/stdc++.h>using namespace std;const int N = 1e4 + 10;int n, m;unordered_map<int, int> mp;int f[N], d[N];int get(int x){ if (mp.count(x) == 0) mp[x] = ++ n; return mp[x];}int find(int x){ if (f[原创 2021-11-05 10:10:02 · 2507 阅读 · 2 评论 -
acwing1252. 搭配购买(并查集+简单完全背包)
题意思路先用并查集预处理,那么物品是在一个集合里面,然后完全背包求解最大能购买的价值。代码#include <bits/stdc++.h>using namespace std;const int N = 10005;int n, m, w;int f[N], c[N], d[N];int dp[N];int find(int x){ if (f[x] == x) return x; return f[x] = find(f[x]);}i原创 2021-11-05 10:08:53 · 143 阅读 · 0 评论 -
acwing 242. 一个简单的整数问题
题意思路这题要实现区间修改和单点查询,但是树状数组,是没法实现区间修改,但是我们可以通过相邻两个数的差分的值建立树状数组,这样把区间 [l, r] 修改变成了变成了两个单点修改:c [l]+=d, c [r+1] -= d; 单点查询就是求:就是树状数组求前缀和。代码#include <bits/stdc++.h>using namespace std;#define ll long longconst int N = 1e5 + 10;int n, m;int a[原创 2021-11-05 10:06:53 · 112 阅读 · 0 评论 -
acwing237. 程序自动分析(并查集应用)
题意有 n 个变量:x1, x2, x3,…,xn , 现在我们要为每个变量赋一个值,使他们同时满足 m 个约束条件,约束条件有两种形式:xi = xjx_i~~~=~~~x_jxi = xjxi != xjux_i~~~!=~~~x_juxi !=&nb原创 2021-11-05 10:09:14 · 161 阅读 · 0 评论 -
acwing 1250. 格子游戏(并查集维护集合连通性)
题意两个人在一个 n*n 的方格上选边,谁先形成在选择一条边之后形成封闭的圈谁就输。现在给出两个人的选边 m 次操作,问谁输。如果到最后都无法判断谁输,就输出 draw思路并查集维护集合连通性。代码#include <bits/stdc++.h>using namespace std;int n, m;const int N = 4e4 + 250;int fa[N];int find(int x){ if (fa[x] == x) return x原创 2021-11-05 10:08:24 · 218 阅读 · 0 评论 -
acwing244. 谜一样的牛(思维+树状数组)
题意给我们一个数组 a, a [i] 表示在 1~i 之间有 ai 头牛比他低。一直每头牛的身高各不相同,切实 1~n 之间的一个数字。思路从后往前考虑,如果当前有 k 头牛比自己低,那么我们就在剩余的数字里找第 k+1 小的数字是那个,然后把这个数组删掉,然后继续考虑前一个位置。代码#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int n;int h[N], c[N], ans[原创 2021-11-05 10:08:03 · 109 阅读 · 0 评论 -
acwing 243. 一个简单的整数问题2(树状数组区间修改、区间求和)
题意代码#include <bits/stdc++.h>using namespace std;#define ls (k << 1)#define rs (k << 1 | 1)#define ll long longconst int N = 1e5 + 10;int n, m;int a[N];struct Tree{ int l, r; ll sum, add;} tr[N * 4];void push_up(int k)原创 2021-11-05 10:07:30 · 119 阅读 · 0 评论 -
acwing 241. 楼兰图腾(树状数组)
题意思路树状数组,我们通过枚举顺序进行插入,然后对树状数组进行区间查询可以了。代码#include <bits/stdc++.h>using namespace std;#define ll long longconst int N = 200005;int n, a[N], c[N], great[N], lower[N];int lowbit(int x){ return x & -x;}void insert(int x, int y)原创 2021-11-04 15:54:34 · 139 阅读 · 0 评论 -
acwing1277. 维护序列(维护区间乘法、区间加法、区间和)
题意思路这题我们既要维护区间加法,又要维护区间乘法,也就是我们要维护两个懒标:add、mul。这题给我的启发就是当我有多个懒标的时候,我们要考虑懒标之间的优先级变化。这题为了方便懒标更新,我们应该:先更新乘懒标 mul,再更新加懒标 add。代码#include <iostream>#include <cstring>#include <algorithm>using namespace std;#define ls (k << 1原创 2021-11-04 15:45:07 · 184 阅读 · 0 评论 -
acwing247. 亚特兰蒂斯(线段树扫描线)
题意代码#include <iostream>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 100010;struct segment// 用来存线段信息{ double x, y1,y2; int d; // 区分它是该矩阵前面的线段还是后面的线段 bool operator &原创 2021-11-04 15:27:36 · 221 阅读 · 0 评论 -
243. 一个简单的整数问题(带懒标区间修改)
题意代码#include <bits/stdc++.h>using namespace std;#define ls (k << 1)#define rs (k << 1 | 1)#define ll long longconst int N = 1e5 + 10;int n, m;int a[N];struct Tree{ int l, r; ll sum, add;} tr[N * 4];void push_up(int k)原创 2021-11-04 15:22:27 · 79 阅读 · 0 评论 -
acwing246. 区间最大公约数(差分建树维护区间最大 gcd)
题意给我们一个长度为 n 数组 A,m 次操作,两种操作如下:把一个区间 [l, r] 中的数都加上 d 询问区间 [l, r] 中所有数的最大公因数是多少?思路由于区间 gcd 是满足结合行的,可以比较容易的维护区间 gcd ,可以用 rmq,线段树等,但是这题又有区间修改操作,当一个区间被加上一个数之后,好像已经无法维护区间 gcd 了,因此我们需要曲线救国间接求解答案。我们由辗转相除法可以知道:gcd (a,b)=gcd (a,b-a), 那么同理:(a+d, c+原创 2021-11-04 15:17:21 · 190 阅读 · 0 评论 -
acwing245. 你能回答这些问题吗(线段树维护组大连续子段和)
题意思路单点修改比较好维护,但是区间连续子段和就比较难维护了,我们需要在结构提供维护一些间接条件,在这些间接条件的帮助下我们才能维护出最大连续字段和,我们需要在结构体中维护的条件如下 :当前区间最大连续子段和:mx 当前区间的和:sum 当前区间的前缀最大值: lmx 当前区间的后缀最大值:rmx 维护关系如下图。3. 注意区间最大连续子段和 mx 的产生有三种情况:最大子段和只在左子区间中产生:l.mx 最大子段和只在有子区间中产生:r.mx 最大子段和横跨两个子区间原创 2021-11-04 14:41:37 · 109 阅读 · 0 评论 -
acwing1275. 最大数(线段树维护区间最大值)
题意代码#include<iostream>#include<cstring>#include<algorithm>using namespace std;#define ls (k << 1)#define rs (k << 1 | 1)const int N = 2e5 + 10;const int inf = 0x3f3f3f3f;int n, m, p;struct Tree{ int l, r, mx;原创 2021-11-04 11:24:35 · 120 阅读 · 0 评论 -
acwing255. 第K小数(可持久化权值线段树)
题意给我们一个长度为 n 的数组 a [],每次询问区间 [l, r] 中的第 k 小数字是几。思路主席树经典应用,这一题我们可以对 a 建立权值线段树,每个线段树中每个区间维护的是在这个区间中已经出现的数字的数量。每插入第 i 个数字我们就建立一个编号为 i 的新的历史版本,这样我们对于一次,一次查询操作我们就在 l~r 之间的历史版本进行二分操作,但是 l~ r 直接的历史版本是受 1~l-1 之间的历史版本所影响的,为了消除影响我们可以同时二分第 l-1 个历史版本和第 md 的个历史原创 2021-11-04 11:13:17 · 133 阅读 · 0 评论 -
acwing 256. 最大异或和(可持久化 trie 树)
题意思路代码#include <cstdio>#include <cstring>#include <algorithm>using namespace std;// 30w初始数据和30w新增, 而10的7次方小于2的24次方, 再加上根节点, 就是说每个数最多需要25位;const int N = 600010, M = N * 25;int n, m;int s[N]; // 前缀和序列int tr[M][2];int max_id[M原创 2021-11-04 10:35:43 · 142 阅读 · 0 评论 -
acwing1053. 修复DNA(AC 自动机+dp)
题意给定 n 个子串 ti 四个字符,和一个主串 s,所有字符串仅包含 A,G,C,T,问最少需要修改几个字符,才使 s 中不包含任意一个 ti 字符串。n < 50, |s|<=1000, |ti<=20|.思路这是 y 总讲的状态机模型代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<in原创 2021-11-03 11:55:46 · 194 阅读 · 0 评论