
知识点及模板整理
各类知识点及模板整理
Sankkl1
这个作者很懒,什么都没留下…
展开
-
构建笛卡尔树的两种方法
摘自:https://www.cnblogs.com/LiuRunky/p/Cartesian_Tree.html利用单调栈O(n)O(n)O(n):#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N=100005;int n;int a[N];int root;int ls[N转载 2021-10-18 20:46:47 · 390 阅读 · 0 评论 -
【CF1437】E. Make It Increasing(最长上升子序列好题)
题目链接:https://codeforces.com/problemset/problem/1437/E分析简单地说,就是求被几个确定的数分成的每个区间内的最长上升子序列,我们可以对每个区间求一遍最长上升子序列。题目中会有约束:区间的两边是已经确定的数。可以先去除已经在这两个数范围之外的数,因为这样的数是一定要进行操作来修改的。那么如何求最长上升子序列呢,可以参考文章,时间复杂度为O(nlogn)O(nlogn)O(nlogn)。但是要将一个数列修改成严格单调是不能仅仅看最长上升子序列的,例如[原创 2021-10-09 14:04:54 · 205 阅读 · 0 评论 -
求最长上升子序列O(nlogn)
摘自:https://blog.youkuaiyun.com/qq_37774171/article/details/81203890假设存在一个序列d[1…9] ={ 2,1 ,5 ,3 ,6,4, 8 ,9, 7},可以看出来它的LIS长度为5。下面一步一步试着找出它。我们定义一个序列B,然后令 i = 1 to 9 逐个考察这个序列。此外,我们用一个变量Len来记录现在最长算到多少了首先,把d[1]有序地放到B里,令B[1] = 2,就是说当只有1一个数字2的时候,长度为1的LIS的最小末尾是2。这时L转载 2021-10-09 11:52:40 · 134 阅读 · 0 评论 -
求较大组合数对P取模的两种方法(Lucas定理)
摘自百度百科:https://baike.baidu.com/item/lucas/4326261?fr=aladdinint Lucas (ll n , ll m , int p) { return m == 0 ? 1 : 1ll*comb (n%p , m%p , p) * Lucas (n/p,m/p,p)%p ;}//comb()函数中,因为q , r < p , 所以这部分暴力完成即可。//C++求C(n, m) mod 10007 版本二 要求p z在100000左右转载 2021-10-06 14:33:53 · 293 阅读 · 0 评论 -
【CF1430】E. String Reversal(树状数组区间修改)
题目链接:https://codeforces.com/problemset/problem/1430/E分析先将字符串reverse一下,然后从后往前遍历,每次遍历一个字符,找到这个字符在原串中的最后一个位置,将其移动过来即可。简化一下,相当于每次将某个字符的最右边一个移动到最右边(用过以后要去掉),先记录每个字符的位置pospospos,然后记录这个字符前面有xxx个字符已经被移走了,答案就加上n−pos−xn-pos-xn−pos−x。每个位置的xxx值可以用树状数组来维护,维护区间修改。代原创 2021-10-01 20:12:24 · 204 阅读 · 0 评论 -
欧拉函数学习记录
欧拉函数及其性质:https://blog.youkuaiyun.com/qq_37493070/article/details/81988725原创 2021-09-26 18:59:09 · 119 阅读 · 0 评论 -
2021杭电多校10 1008.Pty loves string(next数组+主席树)
题目链接:https://acm.hdu.edu.cn/showproblem.php?pid=7084代码#include<bits/stdc++.h>using namespace std;const int N = 3e5 + 10;int q, len;char s[N];int ne[N];vector<int> g1[N], g2[N];int dfn1[N], dfn2[N], cnt1, cnt2, rr1[N], rr2[N], re[N], h原创 2021-08-25 00:41:45 · 227 阅读 · 0 评论 -
kmp模板
#include<bits/stdc++.h>using namespace std;const int N = 1e5;char s[N], t[N];int ne[N], len;void getnext(){ int j = 0, k = -1; ne[0] = -1; len = strlen(t); while(j < len) { if(k == -1 || t[j] == t[k]) { j++; k++; ne[j] =原创 2021-08-24 21:25:44 · 90 阅读 · 0 评论 -
欧拉函数及莫比乌斯函数学习记录
关系:https://www.cnblogs.com/Milkor/p/4464515.html相关应用:https://www.cnblogs.com/Milkor/p/4474835.html原创 2021-08-18 18:14:59 · 137 阅读 · 0 评论 -
2021杭电多校9 1008.Integers Have Friends 2.0(随机数)
题目链接:https://acm.hdu.edu.cn/showproblem.php?pid=7073主要是为了学习一下mt随机的用法代码#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N=2000000;const int maxn=2e6+10;const int K=30;mt19937_64 gen(time(0));int tot,prime[maxn],_,n,a原创 2021-08-18 15:28:16 · 215 阅读 · 0 评论 -
可持久化线段树模板
维护可持久化数组题目链接:https://www.luogu.com.cn/problem/P3919#include <bits/stdc++.h>using namespace std;typedef long long ll;const int N = 1000005;int n,m;int a[N];int val[N*20], ls[N * 20], rs[N * 20], cnt, t[N * 20];void build(int &rt, int l,原创 2021-08-15 16:30:59 · 181 阅读 · 0 评论 -
2021牛客暑期多校训练营9 E.Eyjafjalla(树状数组/主席树)
题目链接:https://ac.nowcoder.com/acm/contest/11260/E分析先跑一边dfs处理出每个点的dfs序就能得到以每个点为根节点的子树所拥有的点的dfs序的区间,如图由于是dfs序,每个点的子树所包含的所有点的dfs序是连续的。我们先根据每个查询的lll和rrr,向上找到距离开始点最远的在区间内的点,答案就是以该点为根的子树大小减去该点的dfs序区间内温度小于等于x−1x-1x−1的点的数量。由于查询次数较多,我们可以记录每次要查询的dfs序区间以及x−1x-1x原创 2021-08-15 15:16:29 · 154 阅读 · 0 评论 -
求斐波那契数列前缀和(矩阵乘法)
设斐波那契数列f1=1,f2=1,f3=2...f1=1,f2=1,f3=2...f1=1,f2=1,f3=2... 求Sn mod mS_n \ mod\ mSn mod m的值#include<bits/stdc++.h>using namespace std;typedef long long ll;const int N = 3;int n,m;void mul(int c[], int a[], int b[][N]){原创 2021-08-13 22:45:38 · 373 阅读 · 0 评论 -
矩阵乘法模板
摘自:https://blog.youkuaiyun.com/weixin_41162823/article/details/83990051#include<iostream>#include<cstdio>#include<cstring>using namespace std;const int maxn = 105;struct Matrix{ int n,m; int v[maxn][maxn]; Matrix(int n,int m):n(n),m(m)转载 2021-08-13 22:01:32 · 237 阅读 · 0 评论 -
求两圆相交面积模板
题目链接:https://acm.hdu.edu.cn/showproblem.php?pid=7063#include<iostream>#include<cstdio>#include<cstring>#include<cstdio>#include<cmath>#include<algorithm>#define esp 1e-8const double pi=acos(-1.0);using namespac原创 2021-08-13 20:29:57 · 162 阅读 · 0 评论 -
AC自动机模板
摘自:https://www.luogu.com.cn/problem/solution/P3808#include<cstdio>#include<cstring>#include<algorithm> #include<queue>#define maxn 5000000+10using namespace std;char str[maxn*2];struct node{ int fail;//失配指针; int cnt;//单词出现转载 2021-08-12 23:51:51 · 127 阅读 · 0 评论 -
等差乘等比数列求和公式
设数列y=(an+b)qn−1y=(an+b)q^{n-1}y=(an+b)qn−1那么∑1ny=(An+B)qn−B\sum_1^ny=(An+B)q^n-B∑1ny=(An+B)qn−B其中A=aq−1A=\frac{a}{q-1}A=q−1aB=b−Aq−1B=\frac{b-A}{q-1}B=q−1b−A原创 2021-08-11 13:50:39 · 5688 阅读 · 0 评论 -
2021牛客暑期多校训练营5 1009.Array(线段树/树状数组)
题目链接:https://acm.hdu.edu.cn/showproblem.php?pid=7020分析如果用线段树会超时,可以用树状数组,参考:https://www.luogu.com.cn/problem/solution/P4062线段树代码(超时):#include<bits/stdc++.h>using namespace std;const int N=1e6+10;vector<int>g[N];int a[N],ans[N];struct no原创 2021-08-04 15:06:54 · 380 阅读 · 0 评论 -
2021牛客暑期多校训练营6 H.Hopping Rabbit(扫描线)
题目链接:https://ac.nowcoder.com/acm/contest/11257/H分析每一行的全部扫描线都加入后,判断线段树总点的sum是否是小于d的,如果是则答案就在这一行中,递归去找答案即可。代码#include<bits/stdc++.h>using namespace std;//#define debug 1const int N=1e6+10;typedef long long LL;int lazy[N];struct node1{ i原创 2021-08-03 22:42:37 · 602 阅读 · 0 评论 -
对拍调试模板
摘至 OI Wiki#include <stdio.h>#include <stdlib.h>int main() { // For Windows //对拍时不开文件输入输出 //当然,这段程序也可以改写成批处理的形式 while (true) { system("gen > test.in"); //数据生成器将生成数据写入输入文件 system("test1.exe < test.in > a.out"); //获取程转载 2021-08-02 16:30:13 · 157 阅读 · 0 评论 -
排列组合数计算公式及性质
转自OI Wiki转载 2021-08-01 22:27:22 · 1409 阅读 · 0 评论 -
欧拉通路及欧拉回路的概念和判断
定义如果图G(有向图或者无向图)中所有边一次仅且一次行遍所有顶点的通路称作欧拉通路。如果图G中所有边一次仅且一次行遍所有顶点的回路称作欧拉回路。具有欧拉回路的图称为欧拉图(简称E图)。具有欧拉通路但不具有欧拉回路的图称为半欧拉图。存在的判断判断欧拉通路有向图:图连通,有一个顶点出度大入度1,有一个顶点入度大出度1,其余都是出度=入度。无向图:图连通,只有两个顶点是奇数度,其余都是偶数度的。判断欧拉回路有向图:图连通,所有的顶点出度=入度。无向图:图连通,所有顶点都是偶数度。转载 2021-08-01 17:59:49 · 7450 阅读 · 0 评论 -
2021杭电多校第4场 1004.Display Substring(后缀数组)
题目链接:https://acm.hdu.edu.cn/showproblem.php?pid=6988分析二分答案,再check答案:所有后缀的所有前缀即所有子串,利用前缀和二分找到小于等于当前答案的数量,去除重复的,即height[i],注意要取min代码#include <iostream>#include <cstring>#include <algorithm>using namespace std;typedef long long ll;原创 2021-07-30 15:35:37 · 161 阅读 · 0 评论 -
fft应用于字符串匹配模板
题目链接:https://www.luogu.com.cn/problem/P4173代码#include<bits/stdc++.h>#define MAXN 2000005#define reg register#define inl inline#define db double#define eps 1e-6using namespace std;const int Mod=998244353;const db Pi=acos(-1.0);struct Comple转载 2021-07-28 14:43:40 · 200 阅读 · 0 评论 -
fft模板
求多项式乘法#include<bits/stdc++.h>using namespace std;const int N=5e5+10,M=1<<20;const double PI=acos(-1);struct Complex{ double x,y; Complex operator+ (const Complex &t) const { return {x+t.x,y+t.y}; } Complex原创 2021-07-28 13:48:58 · 194 阅读 · 0 评论 -
bsgs模板
hash//POJ 2417//baby_step giant_step// a^x = b (mod n) n为素数,a,b < n// 求解上式 0 <= x < n的解#include <cmath>#include <cstdio>#include <cstring>#define MOD 76543using namespace std;int hs[MOD], head[MOD], next[MOD], id[MOD],原创 2021-07-21 16:24:07 · 186 阅读 · 0 评论 -
莫队操作模板
#include <bits/stdc++.h>using namespace std;#define fi first#define se second#define MP make_pair#define pb push_backtypedef long long ll;int n,m;int a[100005];int res[100005],cnt[100005],ans,unit;void add(int x){ x = a[x]; if(!cnt[x])原创 2021-07-21 14:16:28 · 121 阅读 · 0 评论 -
模拟退火算法(星星还是树)
题目链接:https://www.acwing.com/problem/content/description/3170/在二维平面上有 n 个点,第 i 个点的坐标为 (xi,yi)。请你找出一个点,使得该点到这 n 个点的距离之和最小。该点可以选择在平面中的任意位置,甚至与这 n 个点的位置重合。输入格式第一行包含一个整数 n。接下来 n 行,每行包含两个整数 xi,yi,表示其中一个点的位置坐标。输出格式输出最小距离和,答案四舍五入取整。数据范围1≤n≤100,0≤xi,yi≤1原创 2021-07-19 20:41:46 · 419 阅读 · 0 评论 -
两球相交体积计算模板
#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>#include<iostream>#define CLR(a,b) memset(a,b,sizeof(a));const int inf=0x3f3f3f3f;using namespace std;const double PI = acos(-1.0);typedef unsigned lo转载 2021-07-19 17:12:04 · 325 阅读 · 0 评论 -
欧拉筛求欧拉函数模板
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define N 10000006#define fi first#define se second#define pb push_backint vis[N],prime[N],cnt;int phi[N];void Euler_phi(int n){ phi[1] = 1; for(int i=2;i<=n;i++) {原创 2021-06-02 22:34:29 · 183 阅读 · 0 评论 -
扩展欧几里德算法应用(求解二元一次方程模板)
#include <bits/stdc++.h>using namespace std;typedef long long ll;#define N 10006#define fi first#define se second#define pb push_backint x,y;int exgcd(int a, int b){ if(b == 0) { x = 1; y = 0; return a; } int res =原创 2021-06-01 21:05:30 · 276 阅读 · 0 评论 -
大数运算模板
文章目录大数乘法大数加法大数减法大数除法大数乘法#include<bits/stdc++.h>using namespace std;char a[10005],b[10005];int x[10005],y[10005],z[20005];int main(){ int l1,l2,i,j,k; while(~scanf(" %s %s",a,b)) { memset(z,0,sizeof(z)); l1=strlen(a)转载 2021-05-27 21:15:30 · 138 阅读 · 0 评论 -
整除分块
∑i=1nni \sum_{i=1}^{n} \frac{n}{i} i=1∑nin当我们要求上面式子的时候,很自然想到 O(n) 复杂的解法,但是如果在多组输入的情况下,这样的复杂度可能不够优秀,这时我们就要用到整除分块的方法。for(int l=1,r;l<=n;l=r+1){ r=n/(n/l); ans+=(r-l+1)*(n/l);}...原创 2021-04-28 21:55:56 · 164 阅读 · 0 评论 -
单调队列操作
单调队列的元素保证是单调递增或者是单调递减的,即队头元素是最大值或最小值。#include <vector>#include <deque>using namespace std;class MonotonicQueue{ private: deque<int>data; public: void push(int n) { while(!data.empty()&&原创 2021-04-22 22:39:12 · 129 阅读 · 0 评论 -
多重背包问题解法整理
多重背包问题有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。基础解法include<iostream>#include<algorithm>using namespace std;const int array_size = 101;int f[array_size], N, V, v, w, s;struct Goods原创 2021-04-22 22:03:28 · 351 阅读 · 0 评论 -
主席树模板整理
#include<bits/stdc++.h>#define MAXN 200100using namespace std;int n,m,size_disc; int n_init[MAXN],n_disc[MAXN]; //n_init:原始数组; n_disc:离散化数组int rt[MAXN],lc[MAXN<<5],rc[MAXN<<5],sum[MAXN<<5]; //rt:不同版本的根节点; lc/rc:左儿子右儿子原创 2021-04-08 16:59:08 · 128 阅读 · 0 评论 -
Pollard-Rho算法模板(大数分解质因数),阶乘因式分解
复杂度:O(n^1/4)链接:https://blog.youkuaiyun.com/water_zero_saber/article/details/79901588#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<iostream>#include<queue>using namespace std; typedef lon转载 2021-03-17 21:13:38 · 504 阅读 · 0 评论 -
tarjan求割点(割),割边(桥)模板
#include<bits/stdc++.h>using namespace std;#define re register int#define ll long long#define INF 0x3f3f3f3f#define maxn 50005#define maxm 500005inline ll read(){ ll x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=原创 2021-03-11 15:33:26 · 185 阅读 · 0 评论 -
最小圆覆盖模板
https://www.cnblogs.com/nublity/p/11620792.htmlhttps://blog.youkuaiyun.com/wu_tongtong/article/details/79362339?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_utm_term-0&spm=1001.2101.3001.4242#pragma GCC optimize(2)#pragma GCC optimize(3, "Ofas转载 2021-03-07 15:08:48 · 172 阅读 · 0 评论 -
凸包算法模板
详解链接:https://blog.youkuaiyun.com/viafcccy/article/details/87483567#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define PI 3.1415926535using namespace std;struct node{ int x,y;};转载 2021-03-07 14:45:04 · 190 阅读 · 0 评论