自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

做一只熊猫不好吗?

山登绝顶我为峰!

  • 博客(488)
  • 收藏
  • 关注

原创 acwing1128. 信使( 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#define INF 0x3f3f3

2021-11-06 19:10:18 108

原创 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

原创 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 87

原创 acwing1129. 热浪(dijkstra 模板题)

题意给一个无向图,让我们找到一个从 s 到 e 的一条单源最短路。代码#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 i

2021-11-05 11:23:59 331

原创 acwing238. 银河英雄传说(带权并查集)

题意思路这题明显的是带权并查集,但是我们要多维护一个集合大小 num [] 数组,因为我们这题的带权并查集维护的不仅是节点之间的相互关系,而需要维护的是实际真实的距离。有 num 之后就方便我们维护实际距离了。带权并查集核心维护真实边权的核心:代码/* #include <iostream> */#include <cstdio>#include <algorithm>using namespace std;const int

2021-11-05 11:18:51 121

原创 Codeforces Round #752 (Div. 2)(A~D)

题目链接A. Era题意给我们一个长度为 n 的序列 ai,我可以向 ai 中插入一些数字,然后使 ai >= i。思路找到所有 ai - i 的最大值 mx 就可以了,我们在 a 数组前边插入 mx 个 1 就可以了。代码#include <bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int n, m;int a[N];int main(){ int T; scanf(

2021-11-05 10:13:55 151

原创 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 2511 2

原创 acwing237. 程序自动分析(并查集应用)

题意有 n 个变量:x1, x2, x3,…,xn , 现在我们要为每个变量赋一个值,使他们同时满足 m 个约束条件,约束条件有两种形式:xi   =   xjx_i~~~=~~~x_jxi​   =   xj​xi   !=   xjux_i~~~!=~~~x_juxi​   !=&nb

2021-11-05 10:09:14 162

原创 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

原创 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 223

原创 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 110

原创 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

原创 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 115

原创 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 140

原创 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

原创 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 224

原创 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

原创 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 192

原创 acwing245. 你能回答这些问题吗(线段树维护组大连续子段和)

题意思路单点修改比较好维护,但是区间连续子段和就比较难维护了,我们需要在结构提供维护一些间接条件,在这些间接条件的帮助下我们才能维护出最大连续字段和,我们需要在结构体中维护的条件如下 :当前区间最大连续子段和:mx 当前区间的和:sum 当前区间的前缀最大值: lmx 当前区间的后缀最大值:rmx 维护关系如下图。3. 注意区间最大连续子段和 mx 的产生有三种情况:最大子段和只在左子区间中产生:l.mx 最大子段和只在有子区间中产生:r.mx 最大子段和横跨两个子区间

2021-11-04 14:41:37 110

原创 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 121

原创 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

原创 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

原创 2021-11-04

题意给我们一颗 n 个节点之间的树,要求我们在这棵树上选择 2 个不同的节点,使其他节点到这 2 个节点中的一个的距离尽可能的小,输出所有点的最小最大值。思路我们在树的直径上二分二分一个距离。在直径上找到两个对称点,这两个对称点到对应的叶子节点的距离为我们二分的距离:md。然后对这两个对称点出发,暴力跑深度为 md 的距离,并标记走过的点,最后判读所有的点是否都被标记。代码#include <bits/stdc++.h>using namespace std;const

2021-11-04 10:17:11 86

原创 Domination Gym - 100554D(概率dp 求期望)

题意给我们一个 n*m 的棋盘,每天我们会在棋盘上放一个棋子,问使每一行每一列至少有一个棋子所需要的期望天数是多少?思路直接求期望,不太好 dp 但是我们可以通过期望求解公式:E (X) = X1p(X1) + X2p (X2) + …… + Xn*p (Xn) 来求解。我们设状态转移方程:dp [i][j][k] 表示棋子 i 行 j 列已经有棋子占领了,在摆放 k 个棋子的时候的概率。初始状态:dp [1][1][1] = 1.0 我们通过递推进行状态转移对于 dp [i][j][k

2021-11-03 21:22:52 150 1

原创 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

原创 Codeforces Round #749 (Div. 1 + Div. 2, based on Technocup 2022 Elimination Round 1)(A~D)

题目链接A. Windblume Ode题意给我们一个长度为 n 的数组 a,a 中元素个不相同,让我们从中选择尽可能多的数,形成一个子集,要求这个子集中的所有数字和为一个非质数。输出这个最大尺寸。思路当 a 中所有的元素和不为质数时,选择 a 中的所有元素。当 a 中所有元素和为质数的时候,我们只需要去掉以一个奇数,就行了,因为质数一定是奇数,所有 a 中一定存在奇数。代码#include <iostream>#include <cstring>#inc

2021-11-02 21:39:00 262

原创 Strange Memory Gym - 102832F(树上启发式合并+二进制拆分算贡献)

题目链接题意给我们一颗 n 个节点的树,每个节点有一个权值 a [i], 现在让我们求:树上点对 i,j 满足下面的公式的个数思路我们考虑有树上启发合并去暴力求解答案 O (nlogn), 但是我们发现直接这样做难以维护异或和信息,这个时候我们需要维护可以考虑对每节点的编号设为 i,我们对 i 每一个二进制位统计贡献,复杂度变为 20*nlog (n) 我们需要一个数组 dp [val][0/1][0~20], 第一维表示当 ai 异或 alca(i,j)=val==ajai 异或

2021-11-02 10:05:19 86

原创 acwing1285. 单词

题目链接题意给出 n 个单词,询问每个单词 i(i>=1 && i <= n), 在 n 个单词中出现的次数是多少?思路建立 ac 自动机,代码#include <bits/stdc++.h>using namespace std;const int N = 3e6 + 5;char s[N];int tr[N][26], ne[N], idx;int f[N], id[N];vector<int> v;void i

2021-10-30 20:47:22 116

原创 acwing1282. 搜索关键词(AC 自动机)

题目链接题意给定 n 个单词,和一个字符串 s,问 n 个单词中有多少个在 s 中出现了。思路明细 ac 自动机模板题,我们先把 n 个单词建立 ac 自动机树,然后统计每个单词在每个单词在相应的结尾上出现的次数(在单词结尾的位置打上标记)。然后用 s 在自动机树上进行匹配,对于每配到一个位置节点,我们都沿着这个节点,while 循环跳这个点的 fail 指针,如果每跳到一个点就就加上一个这个点结尾的单词的个数。代码#include <bits/stdc++.h>usin

2021-10-30 19:36:08 197

原创 A. Luntik and Concerts(水题)

题目链接#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N = 1e5 + 10;int n, m;int a[N];int main(){ int T; scanf("%d", &T); while (T --) { long long a, b, c, d;

2021-10-24 20:52:29 344 1

原创 Sequence Gym - 103104I (dp + 单调栈优化)

题意现在有一个长度为 n 的数组 p,数组元素的取值为 1~n,给我们 m 个限制条件 <x, y> ,每个限制为 p [x] != y. 现在让我求出四元组的 <A,B,L,R> 的数量,四元组的意思是在 p 数组中 [A,B] 子区间的任意数字可以取值为 [L, R] 中的任意一个数字。(A、B、L、R 可以均 <= n)。思路设状态转移数组:f [i][j] 表示以 i 位置为结尾的所有子区间中,以 j 数字结尾所能产生的答案的贡献数量。可以用单调栈去维

2021-10-07 10:13:06 200

转载 ACM OJ常见错误以及解决方法

不同 OJ 有不同的错误代码,有些 OJ 没有 PE,SE 啥的,甚至有没有 TLE,RE 的 OJ,具体的要根据 OJ 分析,最好比赛前要测试下错误代码的种类,方便赛时找 bug。Wrong Answer :答案错误输出的答案错误,具体问题各不相同,大概有这几种情况1. 代码哪里写出 bug 了,代码功能与自己想实现的功能相异。2. 解题逻辑和思路错误。3. 特殊情况没有处理,比如 0,1,2 和最大值这种边界值没有考虑。4. 空间开的不够大,造成越界,但越界并没有进行修改,或者修改的数据不是

2021-10-06 10:40:21 5618

原创 二维单调队列——模板

acwing 1091. 理想的正方形算法思想我们求一个二维区间的时候的最值,可以先对每一行求最值(对行跑单点队列),并把最值存到对应的列上,然后对列上之前求求出来的最值再跑一遍单调队列。#include <bits/stdc++.h>using namespace std;const int N = 1005;const int inf = 0x3f3f3f3f;int n, m, k;int w[N][N], a[N], b[N], c[N];int mx[N][N]

2021-09-24 09:48:00 842

原创 背包问题求具体方案——模板

题目:acwing 12.#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

2021-09-15 16:54:16 194

原创 背包问题求解方案数(千万要注意初始化方案数啊!!!)

思路这题唯一需要注意的地方就是:这提初始化方案数组 wa [] 的时候要把 0~m 都初始化为 1,因为我们求的背包的最优值不一定是要把背包给完全填满,有就行!!!代码#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#de.

2021-09-15 16:02:20 121

原创 有依赖的背包问题(树形 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 0x3f3f3f3..

2021-09-15 15:39:48 173

原创 多重背包单调队列优化——模板

时间复杂度 O(n*m)代码#include <bits/stdc++.h>using namespace std;const int N = 2e4 + 10;int n, m;int f[N], g[N], q[N], tt, hh; //f、g 互为滚动数组int main(){ scanf("%d %d", &n, &m); int v, w, s; for (int i = 1; i <= n; i ++.

2021-09-14 10:33:32 148

原创 acwing 1012. 友好城市(树状数组求最长升序序列)

思路这个树状数组求最长升序子序列,真是完美体现了 树状数组 维护 和 修改前缀最大值的性质: 即 c 数组中的每个节点都掌控了一些子节点,而这些子节点是能够拼凑出前缀最大值的. 具体实现看代码。。。。。 代码#include <bits/stdc++.h>using namespace std;#define db double#define ll long long#define Pir pair<int, int>#define fi first#.

2021-09-10 18:55:39 119

原创 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'; if (son[u][v]

2021-09-05 12:37:42 90

原创 【AtCoder】Small Multiple 思维题+最短路

题意给我们一个 n(1<=n<=1e5), 让我们找到一个 k,k 是 n 的正整数倍 , 要求这个 k 的十进制下的,位数和最小是多少?请输出这个值。思路不得不说,这题真的很思路,很棒!!!先说做法吧,我们知道任何一个自然数取余 n 必然在 0~n-1 之间,那么 n 的倍数 k 取余 n 必然为 0,又因为是正整数倍,我们对于某个数 x 来说,我们可以同两种操作建边:令 x+=1 操作,我们可以建一条费用为 1 的边:x -> (x+1)% n

2021-09-05 10:29:40 253

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除