合集-算法模板

摘要:bool op[2]={false,true}; void dfs(int a,int b) { if(.....)return; for(int i=0;i<2;i++) { if(op[i])..... dfs(a,b+1); } } 阅读全文
posted @ 2025-01-05 14:36 Marinaco 阅读(40) 评论(0) 推荐(0)
摘要:单调栈 用于求解数组每个位置上左边/右边离自己最近的且严格小于/大于自己位置上的数的位置 时间复杂度O(N)(每个元素下标进栈一次出栈一次) 元素下标能表示的含义比元素本身要多 (ps:注意数组长度,过大就要开到全局变量中,否则异常退出orz) 方法(求每个位置上离自己最近且严格小于自己的元素位置( 阅读全文
posted @ 2025-01-10 19:31 Marinaco 阅读(50) 评论(0) 推荐(0)
摘要:#include <iostream> #include<vector> using namespace std; const int maxn=2e5+5; vector<int>graph[maxn];//邻接表 void addedge(int u,int v) { graph[u].empl 阅读全文
posted @ 2025-01-11 19:22 Marinaco 阅读(44) 评论(0) 推荐(0)
摘要:测试链接:https://leetcode.cn/problems/sort-an-array/ 堆结构: 是一颗完全二叉树 分为大根堆和小根堆 大根堆:每一颗子树最大值都在子树的根部 小根堆:每一颗子树最小值都在子树的根部 每一位父亲i的两个孩子的节点位置(若存在)分别为:i*2+1,i*2+2 阅读全文
posted @ 2025-01-14 10:12 Marinaco 阅读(26) 评论(0) 推荐(0)
摘要:题目链接: https://leetcode.cn/problems/longest-common-subsequence/ TLE 暴力递归+记忆化版本(基于字符串长度无优化版本)//注意text1[i1-1]==text2[i2-1] class Solution { public: int d 阅读全文
posted @ 2025-01-18 14:01 Marinaco 阅读(32) 评论(0) 推荐(0)
摘要:用于解决 范围数字和 与 单点增加 问题(复杂度O(logn)) build 方法(构造树状数组) void build(){ for(int i=1,v;i<=n;i++){ cin>>v; add(i,v); } } lowbit方法 (获取一个二进制数最低位的1的状态) int lowbit( 阅读全文
posted @ 2025-01-20 13:05 Marinaco 阅读(23) 评论(0) 推荐(0)
摘要:按位异或运算:相当于二进制不进位加法 按位和运算:二进制 进位处为1 按位或运算:二进制 进位处为1且不进位 (a|b)+(a&b)==a+b (a^b)+(a&b)*2==a+b a^a==0 a^b=c => a^c=b (a^b^a=a^c => b=a^c )按位异或运算的自反性 由于位运算 阅读全文
posted @ 2025-01-24 15:14 Marinaco 阅读(37) 评论(0) 推荐(0)
摘要:节点结构(维护区间和与最大值,最小值) struct node{ int l; int r; int sum; int maxn; int minn; }; const int maxn=1e5+5; int arr[maxn]; node tree[maxn]; build方法 void buil 阅读全文
posted @ 2025-01-25 19:48 Marinaco 阅读(33) 评论(0) 推荐(0)
摘要:build方法(注意将节点编号cnt初始化为1) int cnt; const int maxn=1e6+5; int trie[maxn][26]; int pass[maxn]; int last[maxn]; void build(){ cnt=1; } insert方法(向字典树中插入一个单 阅读全文
posted @ 2025-01-26 23:46 Marinaco 阅读(28) 评论(0) 推荐(0)
摘要:两种操作时间复杂度O(logn),空间复杂度O(n) build方法 const int maxn=5e5+5; int n,m; int s[maxn]; void build(){ rep(i,1,n){ int x;cin>>x;change(i,x); } } lowbit方法(求x的最低位 阅读全文
posted @ 2025-02-16 09:56 Marinaco 阅读(23) 评论(0) 推荐(0)
摘要:![](https://img2024.cnblogs.com/blog/3577970/202502/3577970-20250219195952722-1408030443.jpg) 阅读全文
posted @ 2025-02-19 20:00 Marinaco 阅读(17) 评论(0) 推荐(0)
摘要:ST 表用于 查询 静态数组 区间最大值,最小值 f[i][j]代表以i开头,区间长度为pow(2,j)的区间最大值/最小值 其左端点为i,右端点为i+ (1<<j) -1 运用倍增的思想,转移方程 f[i][j]=max(f[i][j-1],f[i + (1<<j-1)] [j-1]) 将该区间 阅读全文
posted @ 2025-02-22 16:25 Marinaco 阅读(37) 评论(0) 推荐(0)
摘要:扩欧: 用于求 不定方程 的 一组 整数解 通解形式: x=x0+b/gcd(a,b) y=y0-a/gcd(a,b) ax+by=gcd(a,b)时 求特解的方法 int gcd(int a,int b){ if(b==0)return a; return gcd(b,a%b); } int ex 阅读全文
posted @ 2025-02-23 20:12 Marinaco 阅读(38) 评论(0) 推荐(0)
摘要:求 a^b (modp) 时间复杂度O(logn) 符合结合律 (一个整数n,二进制位数为 logn+1) int quickpow(ll a,int b,int p){ int res=1; while(b){ if(b&1) res=res*a%p; a=a*a%p; b>>=1; } retu 阅读全文
posted @ 2025-02-23 21:08 Marinaco 阅读(40) 评论(0) 推荐(0)
摘要:同余式 若 a%m = b%m 则 表示为 a 模等于(三条杠latex不会打) b (mod p) 乘法逆元 若a,b互质,且 a*x 模等于 1 (mod b) 那么称x为a 模 b 的乘法逆元 费马小引理 若p为质数,且a,p互质,那么 a^(p-1) 模等于 1 (mod p) 即a^(p- 阅读全文
posted @ 2025-02-23 21:13 Marinaco 阅读(42) 评论(0) 推荐(0)
摘要:用于求 矩阵A^k 的问题(其中A为n行n列的矩阵) 1.快速求解fibonacci第n项 (n>3时,[f[n],f[n-1]]=[f[2],f[1]]*A 其中矩阵A.c[1][1]=A.c[1][2]=A.c[2][1]=1,A.c[2][2]=0) matrix结构体 int n; stru 阅读全文
posted @ 2025-02-24 12:32 Marinaco 阅读(29) 评论(0) 推荐(0)
摘要:1.整数唯一分解定理 任意正整数都可以表示为其质因子的乘积 注意1不是质数,因此一定不是质因子 一个数本身也不是其质因子,除非它是质数 发现一个数的约数个数有以下公式 s=(a1+1)(a2+1)····(ak+1) 其中ai为第i个质因子的幂次 然而质因数和约数是不同的概念,约数可以是合数 2.任 阅读全文
posted @ 2025-02-24 13:22 Marinaco 阅读(83) 评论(0) 推荐(0)
摘要:素数筛:筛取1~n范围内的素数 埃氏筛 时间复杂度O(nloglogn) vector<int>prim; bool vis[maxn]; void e(int n){ rep(i,2,n){ if(!vis[i]){ prim.pb(i); for(int j=i*i;j<=n;j+=i)vis[ 阅读全文
posted @ 2025-02-24 15:42 Marinaco 阅读(56) 评论(0) 推荐(0)
摘要:欧拉定理: 若a与m互质,那么a^phi(m) 与 1 在模m的意义下 同余 其中phi(m)为欧拉函数; 表达式phi(m)=m*(求和)((pi-1)/pi)(pi为m的因数) 扩展欧拉定理: 用于降幂 当b<phi(m)时 ,a^b 与 a^b 在 模m意义下 同余 当b>=phi(m)时,a 阅读全文
posted @ 2025-02-25 13:05 Marinaco 阅读(20) 评论(0) 推荐(0)
摘要:Kahn算法 (判环,输出拓补序列) 时间复杂度O(n+e) int n,m; vector<int>e[105];//邻接表 vector<int>tp;//拓扑数组 int din[105];//入度表 bool toposort(){ queue<int>q; rep(i,1,n) if(di 阅读全文
posted @ 2025-02-25 18:11 Marinaco 阅读(34) 评论(0) 推荐(0)
摘要:用于求解有向带非负权图每个点到源点的最短路径问题 时间复杂度O(mlogm) int n,m,s; vector<pii>e[maxn];//pii:{去往的点,权值} int d[maxn],vis[maxn]; priority_queue<pii>q;//pii:{-与源点距离,点} void 阅读全文
posted @ 2025-02-25 19:01 Marinaco 阅读(44) 评论(0) 推荐(0)
摘要:增加动态数组vectorb 记录一个递增的子序列,如果当前遍历到的元素大于最后的元素,则往后插入,len++; 否则,查找第一个大于等于该元素的位置,替换,这样使数组元素值更小,会有更多机会插入更多元素 int n,len=1; int a[maxn]; vector<int>b; cin>>n; 阅读全文
posted @ 2025-02-25 19:41 Marinaco 阅读(86) 评论(0) 推荐(0)
摘要:LCS O(n^n)方法 遍历到第i行,j列时 状态转移方程 当a[i]=a[j],f[i][j]=f[i-1][j-1]+1; 当a[i]!=a[j],f[i][j]=max(f[i-1][j],f[i][j-1]) 特别地,当两个序列都是1~n的排列时 由于元素都相等 所以考虑映射一个序列,使其 阅读全文
posted @ 2025-02-25 20:13 Marinaco 阅读(20) 评论(0) 推荐(0)
摘要:时间复杂度最多O(n*m) 可用来判负环,以及带负边权的最短路 struct edge{ int v;int w; }; vector<edge>e[maxn]; int d[maxn],cnt[maxn],vis[maxn]; bool spfa(int s){ queue<int>q; mems 阅读全文
posted @ 2025-02-26 14:22 Marinaco 阅读(26) 评论(0) 推荐(0)
摘要:求最小生成树,(指的是在一个加权无向图中找到一个边的子集,使得这个子集构成的树包含图中的所有顶点,并且边的权重之和最小。) 用于稠密图,复杂度O(mlogm) int n,m,cnt,ans; vector<pii>e[maxn];//{点,权重} int d[maxn],vis[maxn]; pr 阅读全文
posted @ 2025-02-27 20:47 Marinaco 阅读(30) 评论(0) 推荐(0)
摘要:build方法 void build() { for(int i=1;i<=maxn;i++)father[i]=i; } find方法 int find(int x) { if(x!=father[x]) { father[x]=find(father[x]); } return father[x 阅读全文
posted @ 2025-01-04 14:51 Marinaco 阅读(43) 评论(0) 推荐(0)
摘要:使用并查集的思想求最小生成树 复杂度O(mlogm) int n,m; struct edge{ int u,v,w; bool operator<(const edge&t)const{ return w<t.w; } edge(int uu,int vv,int weight):u(uu),v( 阅读全文
posted @ 2025-02-27 21:18 Marinaco 阅读(22) 评论(0) 推荐(0)
摘要:再来! 发现参数传数组时,时间复杂度暴涨 结构体要规定在全局变量 否则空间不允许 query要pushdown 先pushdown在pushup const int maxn=1e5+5; int arr[maxn]; struct SGT{ struct node{ int l,r,sum; in 阅读全文
posted @ 2025-03-04 21:44 Marinaco 阅读(35) 评论(0) 推荐(0)
摘要:字符串哈希重点在于将字符串映射成一个P进制数字 P通常取131 ull p[maxn],h[maxn]; const int P=131; void init(){ p[0]=1,h[0]=0; for(int i=1;i<=n;i++){ p[i]=p[i-1]*P;// p[i] -> p^i 阅读全文
posted @ 2025-03-09 09:18 Marinaco 阅读(37) 评论(0) 推荐(0)
摘要:pi数组存储着以i位置为结尾的最长匹配真前后缀的长度 模式串:s2 主串:s1 str = s2 + "#" + s1 kmp算法能够快速找到模式串在主串中的位置(当pi的大小与模式串长度一致时,说明匹配。匹配位置:i-2*m(因为还要减去模式串在str中的长度))和数量! 时间复杂度O(n) 这个 阅读全文
posted @ 2025-03-09 09:56 Marinaco 阅读(70) 评论(0) 推荐(0)
摘要:生成子集 将是否选取记为0/1,那么组合的方案可以转化为一个二进制数 共有2^n个方案数 for(int i=0;i<(1<<n);i++){//i代表选取的方案 //初始化 for(int k=0;k<n;k++){//(1<<k从右往左匹配) if(i&(1<<k)){//选到第n-k个数,(从 阅读全文
posted @ 2025-03-09 19:31 Marinaco 阅读(22) 评论(0) 推荐(0)
摘要:int a[maxn],b[maxn]; int res; void merge(int l,int r){ if(l==r)return; int mid=l+r>>1; merge(l,mid);merge(mid+1,r); int i=l,j=mid+1,p=l; while(i<=mid& 阅读全文
posted @ 2025-03-09 15:51 Marinaco 阅读(20) 评论(0) 推荐(0)
摘要:离线算法:适用于无向图,(query建无向边) 利用并查集+DFS 时间复杂度O(n+m) vector<int>e[maxn]; vector<pii>query[maxn]; int fa[maxn],vis[maxn],ans[maxn]; int find(int u){ if(u==fa[ 阅读全文
posted @ 2025-03-12 20:03 Marinaco 阅读(24) 评论(0) 推荐(0)
摘要:时间复杂度O(n+mlogn) vector<int>e[maxn]; int fa[maxn],dep[maxn],son[maxn],sz[maxn]; // 存u的父节点,存u的深度,存u的重儿子,存以u为根的子树的节点数 int top[maxn]; // 存u所在重链的顶点 void df 阅读全文
posted @ 2025-03-12 20:34 Marinaco 阅读(19) 评论(0) 推荐(0)
摘要:记得每次输入样例时都要清空数组 此板子适用于求输入的字符串s有多少个(标准) struct trie{ int ch[maxn][80],cnt[maxn],idx; void build(){ for(int i=0;i<=idx;i++){ for(int j=0;j<79;j++){ ch[i 阅读全文
posted @ 2025-03-13 18:55 Marinaco 阅读(19) 评论(0) 推荐(0)
摘要:用于快速求出一个序列 其中两个值 的xor最大值 由于 从高位到低位 找与给定数 数位相反 的路径 所以底层逻辑是贪心,并且正确性显然 struct trie{ int ch[maxn*31][2],idx; void insert(int x){ int p=0; for(int i=31;i>= 阅读全文
posted @ 2025-03-13 19:31 Marinaco 阅读(24) 评论(0) 推荐(0)
摘要:int a[maxn]; vector<int>v; struct node{ int ch[2]; int s; }tr[maxn*22]; int root[maxn],idx; void build(int &x,int l,int r){ x=++idx; if(l==r)return; i 阅读全文
posted @ 2025-03-13 20:36 Marinaco 阅读(16) 评论(0) 推荐(0)
摘要:时间复杂度O(mlogn*logn) 用于解决u-v最短路径权值问题 解决u子树点权值和问题 可以将两点之间深度较深的那一个点的权值映射到这条边的权值 从而通过维护点权值间接维护边权值 每次只需要lca那一点的权值不动即可 int w[maxn]; vector<int>e[maxn]; int f 阅读全文
posted @ 2025-03-15 10:31 Marinaco 阅读(32) 评论(0) 推荐(0)
摘要:int dep[maxn];//存u的深度 int fa[maxn][50];//存从u向上跳pow(2,i)的祖先节点 //流程:1.dfs创建st表 //2.利用st表求LCA vector<int>e[maxn]; void dfs(int u,int father){ dep[u]=dep[ 阅读全文
posted @ 2025-03-15 17:16 Marinaco 阅读(39) 评论(0) 推荐(0)
摘要:用于查找主串中有多少个模式串 int ne[maxn];//存节点u回跳边的节点 int ch[maxn][80],cnt[maxn],idx; void buildtrie(){ for(int i=0;i<=idx;i++){ for(int j=0;j<79;j++){ ch[i][j]=0; 阅读全文
posted @ 2025-03-16 16:34 Marinaco 阅读(17) 评论(0) 推荐(0)
摘要:集合A的点染色成1,集合B的点染色成2 注意dfs返回bool vector<int>e[maxn]; int color[maxn]; bool dfs(int u,int res){ color[u]=res; for(int v:e[u]){ if(!color[v]){ if(dfs(v,3 阅读全文
posted @ 2025-03-16 17:07 Marinaco 阅读(9) 评论(0) 推荐(0)
摘要:时间复杂度O(nm) vector<int>e[maxn]; int match[maxn]; int ans; int vis[maxn]; set<pii>st; bool dfs(int u){ for(int v:e[u]){ if(vis[v])continue; vis[v]=1; if 阅读全文
posted @ 2025-03-16 17:42 Marinaco 阅读(22) 评论(0) 推荐(0)
摘要:树的直径:树上最长的路径 即每个节点上 最长路径+次长路径 取max vector<int>e[maxn]; int ans; int dfs(int u,int fa){ int d1=0,d2=0; for(int v:e[u]){ if(v==fa)continue; int d=dfs(v, 阅读全文
posted @ 2025-03-17 21:44 Marinaco 阅读(18) 评论(0) 推荐(0)
摘要:01背包 for(int i=1;i<=n;i++){ for(int j=s;j>=w[i];j--){ f[j]=max(f[j],f[j-w[i]]+c[i]); } } //时间复杂度O(N*M) 多重背包 //多重背包 int cnt=1; for(int i=1;i<=n;i++){ / 阅读全文
posted @ 2025-03-26 15:08 Marinaco 阅读(45) 评论(0) 推荐(0)
摘要:@echo off :loop mk.exe>data.txt zhengjie.exe<data.txt>zhengjie.txt baoli.exe<data.txt>baoli.txt fc zhengjie.txt baoli.txt if not errorlevel 1 goto loo 阅读全文
posted @ 2025-03-26 21:15 Marinaco 阅读(47) 评论(0) 推荐(0)
摘要:莫比乌斯函数:1(n=1) 0 (n有相同的质因子) (-1)^s (s为n中不同质因子个数) vector<int>prime; int vis[maxn],mu[maxn]; void getmu(int n){ mu[1]=1; for(int i=2;i<=n;i++){ if(!vis[i 阅读全文
posted @ 2025-03-29 10:47 Marinaco 阅读(26) 评论(0) 推荐(0)
摘要:用于求类似在n组水果,每组水果只能拿[ai,bi]个,最后一共拿m个的方案 或者拥有几枚1,2,5分硬币不能表示的最小分 //用x^m项的系数表示组合数 int n,m; int c[200],d[200],a[200],b[200]; //第i个多项式:x^ai+x^(ai+1)......x^b 阅读全文
posted @ 2025-03-30 17:04 Marinaco 阅读(22) 评论(0) 推荐(0)
摘要:树的重心:删除这样的一个点以及其对应的边,能使得最大连通块节点个数最少 树的重心的性质: 1、树上所有的点到树的重心的距离之和是最短的,如果有多个重心,那么总距离相等。 2、插入或删除一个点,树的重心的位置最多移动一个单位。 3、若添加一条边连接2棵树,那么新树的重心一定在原来两棵树的重心的路径上。 阅读全文
posted @ 2025-03-31 21:19 Marinaco 阅读(24) 评论(0) 推荐(0)
摘要:题目链接: https://www.luogu.com.cn/problem/P1352 题意: 给定一棵职员树,父节点为子节点的直接上司,每个员工有其快乐值。 每个员工不会与其直接上司同时参加舞会 求该场舞会邀请人员的最大快乐值 思路: 树形dp 定义状态:dp[i][0]表示不选第i个人,邀请到 阅读全文
posted @ 2025-02-28 16:55 Marinaco 阅读(12) 评论(0) 推荐(0)
摘要:题目链接:https://www.luogu.com.cn/problem/P2607 题意: 略 思路: 图为外向树,(n个节点,n个边) 对于每一个连通块,先找环(每个连通块都有一个环)然后断环成树,跑树形dp板子 vector<int>e[maxn]; int vis[maxn],w[maxn 阅读全文
posted @ 2025-04-01 21:29 Marinaco 阅读(21) 评论(0) 推荐(0)
摘要:题目链接:https://www.luogu.com.cn/problem/P1229 题意: 给定一颗二叉树的前序遍历和后序遍历,由于无法确定中序遍历,求这颗二叉树有多少种画法? 二叉树的前序,中序,后序遍历: 前序遍历:先遍历根,再递归遍历左子树,再递归遍历右子树 中序遍历:先遍历左子树,再遍历 阅读全文
posted @ 2025-04-02 11:02 Marinaco 阅读(56) 评论(0) 推荐(0)
摘要:int n,m; int a[maxn]; int cnt[maxn]; struct node{ int l,r,id; }q[maxn]; int k; bool cmp(node a,node b){ if(a.l/k!=b.l/k)return a.l/k < b.l/k; if((a.l/ 阅读全文
posted @ 2025-04-04 17:35 Marinaco 阅读(19) 评论(0) 推荐(0)
摘要:求欧拉路 欧拉路:只经过所有边一次的道路 欧拉回路:只经过所有边一次且回到起点的道路 类似于一笔画 前提条件:如果图是连通的(同属于一个集合) 1 无向图: 欧拉路径存在条件:恰好有两个度数为奇数的点(其他点度数都为偶数),路径从一个度数为奇的点到另一个度数为奇的点 欧拉回路存在条件:所有点的度数为 阅读全文
posted @ 2025-04-05 16:12 Marinaco 阅读(61) 评论(0) 推荐(0)
摘要:欧拉函数:phi[n]:[1,n]与n互质(gcd=1)的数的个数 欧拉函数性质: 1.若n为质数,则phi[n]=n-1 2.若n为质数,则phi[nk]=(n-1)(n(k-1)) 3.积性函数:phi[nxm]=phi[n]xphi[m] 以下为O(n)复杂度求欧拉函数板子 vector<in 阅读全文
posted @ 2025-04-09 19:02 Marinaco 阅读(25) 评论(0) 推荐(0)
摘要:struct edge{ int v;//这条边指向的点 int w;//该边的权值 int ne;//下一条边 }e[maxn]; int h[maxn];//存节点i的头边编号 int idx;//边的编号 void add(int a,int b,int c){ e[idx]={b,c,h[a 阅读全文
posted @ 2025-04-15 21:30 Marinaco 阅读(26) 评论(0) 推荐(0)
摘要:源点S,汇点T 通过bfs找到增广路,并逆序构建残留网 累加可行流即为答案 链式前向星存图 注意边的编号从2开始,这是为了让编号^1时,是我们构建的退流管道边(即2的退流管道为3,4的退流管道为5...) 时间复杂度O(n*m^2) int S,T; struct edge{ int v,w,ne; 阅读全文
posted @ 2025-04-17 18:53 Marinaco 阅读(21) 评论(0) 推荐(0)
摘要:单调栈: 用于求解一个数组上所有数左边/右边第一个比它小/大的数 实现思路(求这个数右边的第一个比它大/小的数为例): 求比它大的: 维护栈从底至顶单调递增 当遍历到一个元素时,当栈非空且栈顶元素小于该遍历元素时,不断出栈(并记录出栈元素答案) 求比它小的: 维护栈从底至顶单调递减 当遍历到一个元素 阅读全文
posted @ 2025-04-24 19:06 Marinaco 阅读(22) 评论(0) 推荐(0)
摘要:逆序对本质是(一个数和在它前面且大于它的数的序偶)的集合 对于求逆序对的树状数组,我们将它视为一个桶 用于快速统计一个数前面比它小的有多少个 (因为树状数组能够快速求和) 由于已经知道它前面有多少个数了(i-1个) 那么(前面数的总数-前面比它小的数)=前面比它大的数 = 该元素为第一关键字的逆序对 阅读全文
posted @ 2025-05-01 17:42 Marinaco 阅读(53) 评论(0) 推荐(0)
摘要:lcm(a,b)=axb/(__gcd(a,b)) 根据整数唯一分解定理 任意整数a和b可以拆为一些质数的乘积 那么gcd(a,b)为它们每个质数最小次的乘积 而lcm(a,b)为它们每个质数最大次的乘积 阅读全文
posted @ 2025-05-07 20:16 Marinaco 阅读(29) 评论(0) 推荐(0)
摘要:链接:https://www.luogu.com.cn/problem/P2602 int len; int f[15][15]; int a[15]; int ans=0; int dfs(int pos,int lead,int limit,int sum,int d){ if(pos>len) 阅读全文
posted @ 2025-05-19 14:57 Marinaco 阅读(27) 评论(0) 推荐(0)
摘要:题目链接:https://www.luogu.com.cn/problem/P4568 题意: 给定n个节点,m条边的无向带权图,可以最多免费经过k条边。给定起点和终点,求最短路。 建分层图跑最短路: 建立分层图,相当于再建立相同的另外k个图,然后上面图的节点可以以0边权转移到下面图的对应节点 re 阅读全文
posted @ 2025-05-21 10:31 Marinaco 阅读(12) 评论(0) 推荐(0)
摘要:题目链接:https://codeforces.com/contest/600/problem/E int c[maxn]; int dfn[maxn]; int siz[maxn]; int rk[maxn]; int son[maxn]; int l[maxn];int r[maxn]; int 阅读全文
posted @ 2025-05-23 18:17 Marinaco 阅读(33) 评论(0) 推荐(0)
摘要:树的中心:相当于树上一点,使得其他节点到该点的最大距离最小 实际上在直径中点 求法:求得子树内最长链和次长链,再求得父方向子树的最长链,这三者的最大值最小时,即为树的中点 阅读全文
posted @ 2025-06-03 21:10 Marinaco 阅读(17) 评论(0) 推荐(0)
摘要:int f[maxn]; int val[maxn]; int find(int x){ if(f[x]!=x){ int p=f[x]; f[x]=find(f[x]); val[x]+=val[p]; } return f[x]; } int merge(int x,int y,int c){ 阅读全文
posted @ 2025-06-10 19:01 Marinaco 阅读(25) 评论(0) 推荐(0)
摘要:[小红的区间修改(二)](https://ac.nowcoder.com/acm/contest/111159/F) 题意: q次查询,每次[l,r,x]进行区间推平并覆盖的操作,每次操作后输出数组元素种类数 思路: 珂朵莉树板子 用区间set维护,按左端点排序 map维护数组元素种类数,当右键为0 阅读全文
posted @ 2025-06-15 15:45 Marinaco 阅读(35) 评论(0) 推荐(0)
摘要:int d[maxn]; int f; void insert(int x){ for(int i=63;i>=0;i--){ if(x&(1ll<<i)){ if(!d[i]){ d[i]=x;break; }else x^=d[i]; } } f=1; } int check(int x){ f 阅读全文
posted @ 2025-06-16 19:50 Marinaco 阅读(16) 评论(0) 推荐(0)
摘要:这一份代码能够判断线性方程组是否有解,无法判断是否有无穷多解 int gauss(){ for(int i=1;i<=n;i++){ int r=i; for(int k=i;k<=n;k++){ if(fabs(a[k][i])>fabs(a[r][i])){ r=k; } } if(r!=i)s 阅读全文
posted @ 2025-06-18 16:31 Marinaco 阅读(12) 评论(0) 推荐(0)
摘要:struct SuffixAutomaton { static constexpr int N = 1e6; struct node { int len, link, nxt[26]; int siz; } t[N << 1]; int cntNodes; SuffixAutomaton() { c 阅读全文
posted @ 2025-07-23 19:43 Marinaco 阅读(12) 评论(0) 推荐(0)
摘要:struct PT{ static constexpr int N=2e5+5; //值域 int up; vector<int>b; map<int,int>mp; int cntNodes,root[N]; struct node{ int l,r; int cnt; }tr[4*N+17*N] 阅读全文
posted @ 2025-07-23 20:06 Marinaco 阅读(17) 评论(0) 推荐(0)
摘要:template<class Info , class Tag> struct LazySegmentTree{ int n; vector<Info> info; vector<Tag> tag; LazySegmentTree(vector<int>init){ n = init.size(); 阅读全文
posted @ 2025-08-05 18:24 Marinaco 阅读(12) 评论(0) 推荐(0)
摘要:笛卡尔树性质: 每个结点存储 (k,w) ,即一个序偶 对于k而言,是一个二叉搜索树(满足条件:根节点大于左节点,小于右节点) 对于w而言,是一个小根堆/大根堆(满足条件:根节点值小于/大于左,右节点值) 笛卡尔树不是平衡的 笛卡尔树的构建: 如何使一个数组->笛卡尔树? 单调栈O(n),处理出每一 阅读全文
posted @ 2025-08-12 21:06 Marinaco 阅读(28) 评论(0) 推荐(0)
摘要:引入头文件 #include<bits/extc++.h> using namespace __gnu_pbds; 内置平衡树 tree<pii,null_type,less<pii>,rb_tree_tag,tree_order_statistics_node_update>T; T.insert 阅读全文
posted @ 2025-08-12 21:40 Marinaco 阅读(13) 评论(0) 推荐(0)
摘要:利用欧拉序序列来确定询问L,R 具体地,当查询u,v。 若lca(u,v)u||lca(u,v)v,[min(in[u],in[v]),max(in[u],in[v])] 否则 [out[u],in[v]] (满足out[u]<in[v]) 模板题[https://ac.nowcoder.com/a 阅读全文
posted @ 2025-08-14 21:51 Marinaco 阅读(6) 评论(0) 推荐(0)
摘要:需设置初始温度T0,终止温度T1,降温系数delta 以P的概率接受新答案 #define delta 0.995 int ans=0; int cal(){...} void sa(){ int bt=3000,et=1e-15; while(bt>et){ ... int res=cal(); 阅读全文
posted @ 2025-08-16 17:46 Marinaco 阅读(18) 评论(0) 推荐(0)
摘要:const int sz=26; struct mat{ ll m[sz+2][sz+2]; mat(){ memset(m,0,sizeof m); rep(i,1,sz)m[i][i]=1; } mat friend operator*(const mat&a,const mat&b){ mat 阅读全文
posted @ 2025-08-16 19:40 Marinaco 阅读(7) 评论(0) 推荐(0)
摘要:while((double)clock()/CLOCKS_PER_SEC<=0.965)continue; 阅读全文
posted @ 2025-08-20 13:45 Marinaco 阅读(15) 评论(0) 推荐(0)
摘要:用于防止大数乘法溢出 //龟速乘O(logn) int gsc(int a,int b,int p){ int res=0; while(b){ if(b&1)res=(res%p+a%p)%p; a=(a<<1)%p; b>>=1; } return res; } //快速乘O(1) ll ksc 阅读全文
posted @ 2025-08-21 18:53 Marinaco 阅读(24) 评论(0) 推荐(0)
摘要:用来快速判断一个数是否为素数 期望时间复杂度O(logn),单次最坏时间复杂度O(lognxlogn) ll ksc(int a,int b,int p){ ll z = (long double)a/p*b; ll res =(ull)a*b -(ull)(z*p); return (res+p) 阅读全文
posted @ 2025-08-21 18:56 Marinaco 阅读(11) 评论(0) 推荐(0)
摘要:以O(n^(1/4))的复杂度对一个数进行质因子分解 无敌了已经 ll ksc(int a,int b,int p){ ll z = (long double)a/p*b; ll res =(ull)a*b -(ull)(z*p); return (res+p)%p; } int ksm(int a 阅读全文
posted @ 2025-08-21 20:10 Marinaco 阅读(37) 评论(0) 推荐(0)
摘要:char *p1,*p2,buf[100000]; #define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++) int read() { int x=0,f=1; char ch=nc(); wh 阅读全文
posted @ 2025-09-01 20:59 Marinaco 阅读(13) 评论(0) 推荐(0)
摘要:用于无向图 先对每一个连通块建立搜索树 对于搜索树的根节点,判断它是否是割点的条件是:其子树数量大于等于2 对于搜索树的非根节点,判断它是否是割点的条件是:它的子树连通块可以通过非树边到达它的祖先节点,这一过程使用low数组的树形dp解决 vector<int>e[maxn]; int dfn[ma 阅读全文
posted @ 2025-09-02 13:26 Marinaco 阅读(18) 评论(0) 推荐(0)
摘要:适用于有向图 一个图的一个强连通分量必定是它的搜索树的一个子树 当dfn[u]=low[u]时,表示u点是该强连通分量的根节点 主要在DFS的过程中维护一个栈,存储节点。 int n,m; vector<int>e[maxn]; vector<int>Scc[maxn]; int dfn[maxn] 阅读全文
posted @ 2025-09-02 14:24 Marinaco 阅读(16) 评论(0) 推荐(0)
摘要:求点双连通分量 int n,m; vector<int>e[maxn]; int low[maxn]; int dfn[maxn]; int tot,cnt; vector<int>ds[maxn]; int stk[maxn]; int top; void dfs(int u,int fa){ l 阅读全文
posted @ 2025-09-02 16:15 Marinaco 阅读(9) 评论(0) 推荐(0)
摘要:vector<int>e[maxn]; int n,m; int inscc[maxn]; int low[maxn],dfn[maxn]; stack<int>stk; int instk[maxn]; int tot,cnt; vector<int>scc[maxn]; void dfs(int 阅读全文
posted @ 2025-09-18 17:08 Marinaco 阅读(6) 评论(0) 推荐(0)
摘要:int dif[1005][1005]; void solve(){ int n,m,a,b;cin>>n>>m>>a>>b; rep(i,0,n+1)rep(j,0,m+1)dif[i][j]=0; vector<vector<int>>g(n+1,vector<int>(m+1)); rep(i 阅读全文
posted @ 2025-09-23 13:21 Marinaco 阅读(10) 评论(0) 推荐(0)
摘要:const int M=1e6; #define ls p<<1 #define rs p<<1|1 int a[M]; int b[M]; struct node{ int l,r; int cnt; }tr[M<<2]; void pull(int p){tr[p].cnt=tr[ls].cnt 阅读全文
posted @ 2025-09-23 20:50 Marinaco 阅读(22) 评论(0) 推荐(0)
摘要:#include<ext/rope> using namespace __gnu_cxx; ABC_D vector<rope<char>>px; rope<char>st; void solve(){ int n,q;cin>>n>>q; px.resize(n+1); while(q--){ i 阅读全文
posted @ 2025-09-28 18:59 Marinaco 阅读(9) 评论(0) 推荐(0)
摘要:1.选取树的重心p 2.从p出发进行DFS,求得所需的数组 3.执行cal(p) 4.删除p结点,对p的每颗子树(无根树)递归执行1~4步 此算法在蓝书中亦有记载 vector<pii>e[maxn]; int sz[maxn]; int vis[maxn]; int dp[maxn]; int k 阅读全文
posted @ 2025-09-30 20:40 Marinaco 阅读(24) 评论(0) 推荐(0)
摘要:void work(vector<int>&a,int cnt){ //a表示需要排序的数组,cnt表示数组中元素最高多少位 //复杂度O(n*cnt)! for(int i=1,t=1;i<=cnt;i++,t*=10){ vector<int>pre(10,0); vector<int>tmp( 阅读全文
posted @ 2025-10-10 16:49 Marinaco 阅读(6) 评论(0) 推荐(0)
摘要:可以直接用C++的system函数执行对拍脚本 把造数据的mk.out文件和两个版本的代码文件放在一个文件夹下 void duipai() { //Linux系统下可执行文件后缀为.out while (true) { system("./mk > data.in"); system("./zhen 阅读全文
posted @ 2025-10-15 23:15 Marinaco 阅读(42) 评论(0) 推荐(0)
摘要:prufer: 一种将带标号的树用一个唯一的长度为\(n-2\)整数序列表示的方法。 Prüfer 是这样建立的: 每次选择一个编号最小的叶结点并删掉它,然后在序列中记录下它连接到的那个结点。重复 𝑛 −2 rep(i,1,n-1){ cin>>f[i]; deg[i]++; deg[f[i]]+ 阅读全文
posted @ 2025-10-21 12:44 Marinaco 阅读(10) 评论(0) 推荐(0)
摘要:void exgcd(int &x,int &y,int a,int b) { if(!b) { x=1; y=0; return; } exgcd(x,y,b,a%b); int t=x; x=y; y=t-a/b*y; } 求a在模b意义下的乘法逆元 void exgcd(int &x,int 阅读全文
posted @ 2025-10-23 23:01 Marinaco 阅读(7) 评论(0) 推荐(0)
摘要:结构体内不能直接初始化,否则CE #include<bits/stdc++.h> using namespace std; int n,q; int tot; struct node{ int l,r; int sum; int la; }tr[15000010]; int rt; void pul 阅读全文
posted @ 2025-10-24 13:42 Marinaco 阅读(17) 评论(0) 推荐(0)
摘要:\(1\) ~ \(n\)的\(lcm\)是\(p^{log_pN}\)的乘积(\(p\)是\(1\) ~ \(n\)的所有质数) 求\(log_ba\) int Log(int a,int b){ return (ll)floor(log(b)/log(a)); } 线性求逆元(模数是质数) in 阅读全文
posted @ 2025-10-28 19:36 Marinaco 阅读(11) 评论(0) 推荐(0)
摘要:从网上当的 //__int128的这个板子要关同步流 #define int __int128 #define gc getchar() #define cin(a) a=read() int read(){ int x=0;bool fl=0;char s=gc; while(!isdigit(s 阅读全文
posted @ 2025-11-06 16:20 Marinaco 阅读(14) 评论(0) 推荐(0)
摘要:严格次小生成树: 性质: 边权之和比最小生成树大,比其他生成树小 由最小生成树删除一条树边,加入一条非树边得到 解法: 枚举非树边(u,v):此时能删除的是(u,v)最小路径上的边 使用倍增法维护最小路径上的最大值和次大值(防止操作后生成树权值和最小生成树权值一样) const int M =3e5 阅读全文
posted @ 2025-11-13 14:11 Marinaco 阅读(10) 评论(0) 推荐(0)
摘要:#include <iostream> #include <vector> #include <numeric> #include <algorithm> #include <cmath> using namespace std; using ll = long long; const int MA 阅读全文
posted @ 2025-11-18 10:16 Marinaco 阅读(9) 评论(0) 推荐(0)
摘要:int rt[M]; int cnt[M<<5]; int ch[M<<5][2]; int pre[M]; int tot=0; int n,m; void ins(int a,int b,int t,int x){ if(t<0)return; int i = (x>>t)&1; ch[a][! 阅读全文
posted @ 2025-11-25 21:37 Marinaco 阅读(5) 评论(0) 推荐(0)
摘要:void exgcd(int &x,int &y,int a,int b) { if(!b) { x=1; y=0; return; } exgcd(x,y,b,a%b); int t=x; x=y; y=t-a/b*y; } void solve(){ //求解 ax+by =c 的不定方程 in 阅读全文
posted @ 2025-12-01 12:51 Marinaco 阅读(7) 评论(0) 推荐(0)
摘要:void spfa(int s)//spfa跑最长路 { memset(dis, -1, sizeof(dis)); memset(V, 0, sizeof(V)); dis[s] = sum[s]; V[s] = 1; q.push(s); while (!q.empty()) { int u = 阅读全文
posted @ 2025-12-01 20:56 Marinaco 阅读(5) 评论(0) 推荐(0)

//雪花飘落效果