模板
to cling
Everything negative - pressure, challenges - is all an opportunity for me to rise.
展开
-
可持久化线段树(主席树模板)
可持久化线段树(主席树模板)原创 2022-09-22 23:02:31 · 135 阅读 · 0 评论 -
珂朵莉树(模板)
①②。原创 2022-09-20 10:44:25 · 156 阅读 · 0 评论 -
你能回答这些问题吗(线段树模板)
AcWing245#define ll long long int#define tp t[p]#define tl t[p << 1]#define tr t[p << 1 | 1]const int inf = 0x3f3f3f3f;const int N = 5e5 + 3, M = N * 4;int n, m;int a[N];struct node{ int l, r; int sum, lm, rm, date; node()//初始化 {原创 2022-05-07 17:24:49 · 280 阅读 · 0 评论 -
合并果子(O(n)加强版)(桶排序+队列模拟堆+快读)
传送门这道题目让我受益匪浅啊!更让我认识到快读的 牛逼!!!acm生涯第一次用快读。整整快了一倍!!!Solution对于简单版本的解法,就是利用优先队列求解。(可以先学习一下简单版本)本题中由于数据量较大,需要O(n)的算法才可以。于是我们可以利用两个队列来模拟大根堆即可。如何模拟呢?首先利用桶排序对读入的数据排序,存入一个队列中(还有一个队列用来存放合并的数据)每次取出两个队列中最小的两个数,然后合并放入第二个队列第一个队列是有序的,第二个队列也一定是有序的嘛?是的,一定是有序的。原创 2022-04-30 17:27:37 · 441 阅读 · 0 评论 -
AcWing 190. 字串变换(双向广搜)
传送门Codeconst int N = 5e5 + 3;int n;string s, ss, a[10], b[10];queue<string> q, qq;unordered_map<string, int> ma, mb;int extend(queue<string>& q, unordered_map<string, int>& ma, unordered_map<string, int>&原创 2022-05-05 20:21:43 · 125 阅读 · 0 评论 -
第k短路(A*算法)
AcWing 178. 第K短路Codeint n, m, S, T, k;vector<int> a[1003][1003], b[1003][1003];int vis[1003], f[1004];//最短路,从T到x的最短路f[x]作为从 x到T的估价函数值void dfs(){ priority_queue<pii, vector<pii>, greater<pii> > q; mt(f, 0x3f); mt(vis, 0);原创 2022-05-05 15:45:45 · 187 阅读 · 0 评论 -
01背包(求具体方案的最小字典序)
acwing12直接上题解,后面写有一般的对于方案没有限制的题解。若不懂如何求出最优解的具体方案,可以先看下面的一般题解。字典序最小的方案状态表示:dp[i][j]表示第i个物品到第n个物品体积为j时的最优解dp[i][j]表示第i个物品到第n个物品体积为j时的最优解dp[i][j]表示第i个物品到第n个物品体积为j时的最优解因此状态转移方程变为:dp[i][j]={dp[i+1][j]j<v[i]max(dp[i+1][j],dp[i+1][j−v[i]]+w[i])elsedp[i][原创 2022-01-22 00:26:37 · 671 阅读 · 2 评论 -
多重背包(单调队列优化)
AcWing 6参考题解题意输入n个物品,背包体积为m。输入顺序是,Vi,wi,siV_i, w_i, s_iVi,wi,si。分别代表第i件物品的体积,价值,和数量。理解可以先看上面蓝色字体的“题解”。单调队列优化相较于二进制优化,单调队列优化需要对多重背包有着更深入的了解。其更难更抽象。且需要熟练“滑动窗口”该题的数组模拟方法。单调队列中存的是数据的下标,而不是数据本身,主要是为了起到“限制窗口的大小”的作用。下面给出的模板中的单调队列中,当头指针(head)大于尾指针(tail原创 2022-01-18 21:27:54 · 741 阅读 · 0 评论 -
单调栈 与 单调队列
单调栈给定一个长度为 N 的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出 −1。#include<bits/stdc++.h>using namespace std;const int N = 1e6 + 10;int a[N];int main(){ int n, k; cin >> n; for (int i = 0; i < n; i++) cin >> a[i]; stack<int> s; for (in原创 2022-01-15 15:46:46 · 140 阅读 · 0 评论 -
模拟队列(模板)
#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int a[N], tt = -1, hh = 0;int main(){ ios::sync_with_stdio(0); int m; cin >> m; while (m--) { string s; int k, x; cin >> s; if (s == "push") { cin原创 2022-01-14 22:34:45 · 65 阅读 · 0 评论 -
模拟栈(模板)
#include<bits/stdc++.h>using namespace std;const int N = 1e5 + 10;int a[N], t = -1;void push(int x){ a[++t] = x;}void pop(){ t--;}int empty(){ if (t < 0) return 1; return 0;}int query(){ return a[t];}int main(){ ios::sy原创 2022-01-14 22:33:55 · 74 阅读 · 0 评论 -
单链表 与 双链表
H x,表示向链表头插入一个数c。D k,表示删除第k个插入的数后面的数(当k为0时,表示删除头结点)。I k x,表示在第k个插入的数后面插入一个数c (此操作中k均大于0)。注意:题目中第 k 个插入的数并不是指当前链表的第 k 个数。例如操作过程中一共插入了 n 个数,则按照插入的时间顺序,这 n 个数依次为:第 1 个插入的数,第 2 个插入的数,…第 n 个插入的数。#include<bits/stdc++.h>using namespace std;const in.原创 2022-01-14 22:29:48 · 142 阅读 · 0 评论 -
数据离散化
本质,是“映射”,将间隔很大的点,映射到相邻的数组元素中。减少对空间的需求,也减少计算量。操作:需要开两个数组,一个数组存“数据”,另一个数组存“数据下标”,“数据”所在数组的下标与“数据下标”所在数组的下标对应(相等)特点:数据分散较大,但是数据数量较少#include<bits/stdc++.h>using namespace std;#define ft first#define sd secondconst int N = 300010;int a[N];#def.原创 2022-01-14 22:27:47 · 233 阅读 · 0 评论 -
差分(一维和二维)
一维#include<bits/stdc++.h>using namespace std;const int N = 100007;int a[N], b[N];void insert(int l, int r, int c) //核心函数!!!{ b[l] += c; b[r + 1] -= c;}int main(){ ios::sync_with_stdio(0); int m, n; cin >> n >>原创 2022-01-14 22:23:30 · 151 阅读 · 0 评论 -
前缀和与子矩阵和
前缀和#include <iostream>using namespace std;const int N = 100010;int n, m;int a[N], s[N];int main(){ scanf("%d%d", &n, &m); for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);//注意从1开始存数据,为了后续操作的方便 for (int i = 1; i &原创 2022-01-14 22:21:23 · 82 阅读 · 0 评论 -
大整数与高精度
加法#include <iostream>#include <vector>using namespace std;vector<int> add(vector<int> &A, vector<int> &B){ if (A.size() < B.size()) return add(B, A); vector<int> C; int t = 0; for (int原创 2022-01-14 22:17:42 · 154 阅读 · 0 评论 -
二分(多种写法)
对于一个有序数列查找该序列中x第一次出现时的下标int l = 0, r = n - 1;while (l < r){ int mid = l + r >> 1; if (a[mid] >= x) r = mid; else l = mid + 1;}查找该序列中x最后次出现时的下标其他写法详解int l = 0, r = n - 1;while (l < r){ int mid = l + r + 1 >&g原创 2022-01-14 22:11:48 · 174 阅读 · 0 评论 -
快排 + 归并排序
#include<bits/stdc++.h>using namespace std;const int N = 1000007;int a[N], temp[N];void quick_sort(int a[], int l, int r){ if (l >= r) return; int x = a[l+r>>1], i = l - 1, j = r + 1; while (i < j) { do i++; while (a[i] < x)原创 2022-01-14 22:05:56 · 85 阅读 · 0 评论 -
马拉车算法(判断回文字符串)(模板)
原创 2022-01-06 23:31:24 · 295 阅读 · 0 评论 -
最短路径算法——Bellman-Ford算法(模板)
acwing-853收获该算法的第k次循环的意义:路径总数不超过k条的最短路径时间复杂度O(mn)O(mn)O(mn)#include<bits/stdc++.h>const int inf = 0x3f3f3f3f;using namespace std;const int N = 2e5 + 7, M = 1e6 + 7;int d[N], backup[N];int k, n, m;struct Edges{ int x, y, w;}edge[N];in原创 2021-10-25 21:03:40 · 143 阅读 · 0 评论 -
Mobius函数(模板)
AcWing215. 破译密码题意对于给定的整数a,b和d,有多少正整数对x,y,满足x≤a,y≤b,并且gcd(x,y)=d。(1≤n≤50000,1≤d≤a,b≤50000)对于给定的整数 a,b 和 d,有多少正整数对 x,y,满足 x≤a,y≤b,并且 gcd(x,y)=d。(1≤n≤50000,1≤d≤a,b≤50000)对于给定的整数a,b和d,有多少正整数对x,y,满足x≤a,y≤b,并且gcd(x,y)=d。(1≤n≤50000,1≤d≤a,b≤50000)证明:见acwing题解原创 2021-09-23 21:54:41 · 461 阅读 · 0 评论 -
Co-prime(容斥原理求互素数个数)(模板)
HUD4135题意求a~b之间与n互素的个数思路求出 1~b 之间与n互素的个数减去 1~a-1之间与n互素的的个数即为所求。#include<cstdio>#include<queue>#include<set>#include<cstdlib>#include<string.h>#include<string>#include<iostream>#include<cmath>#inc原创 2021-09-19 21:25:58 · 620 阅读 · 0 评论 -
矩阵快速幂(模板)
#include<stdio.h>#include<string.h>#define LL long long #define maxn 109 const LL mod = 1e9 + 7;const int SIZE=5; struct matrix{ LL mat[SIZE][SIZE]; matrix(){memset(mat,0,sizeof mat);} matrix operator * (const matrix & x)const原创 2021-09-18 15:53:29 · 80 阅读 · 0 评论