模板
爱打酱油的剑姬
这个作者很懒,什么都没留下…
展开
-
阶乘分解
给定整数 N,试把阶乘N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pi和 ci 即可。输入格式一个整数 N。输出格式N! 分解质因数后的结果,共若干行,每行一对 pi,ci,表示含有 pici 项。按照 pi 从小到大的顺序输出。数据范围3≤N≤1e6输入样例:5输出样例:2 33 15 1递归写法(但是1e6的数据范围超时了)#include "bits/stdc++.h"using namespace std;cons...原创 2022-03-15 23:34:55 · 850 阅读 · 0 评论 -
Bracket Sequence
题目意思: 给你一个 n 和 k , k是种类 ,n*2 是括号的数量 ,问你最多有多少种不同的排序可以参考一下卡特兰数_百度百科#include <bits/stdc++.h>#define ll long longusing namespace std;const int mod = 1e9 + 7;const int N = 2e5 + 10;ll s[N], v[N];ll qi(ll a) { ll ans = 1; int p = ...原创 2022-03-15 12:31:02 · 340 阅读 · 0 评论 -
线段树模板
#include <bits/stdc++.h>using namespace std;const int MAXN = 100005;int node[MAXN<<2], lazy[MAXN<<2];//为什么空间要开节点的4倍 请移步至:https://blog.csdn.net/liqiming100/article/details/82319686int num[MAXN];//线段树模板(以区间和为例)//更新数据inline void Push.原创 2022-03-08 16:08:25 · 99 阅读 · 0 评论 -
背包模板 (01 ,多重 ,完全) 模板
#include "bits/stdc++.h"using namespace std;int t,n,m;int c[1005],v[1005];int dp[1005][1005];int main(){ cin >> t; while (t--){ cin >> n >> m; for(int i=1;i<=n;i++){ cin >> c[i]; .原创 2022-03-06 17:02:02 · 145 阅读 · 0 评论 -
树状数组
使用的对象 (区间更新 和 区间求和)lowbit 函数作用是找 c[i] 是由多少个数组组成int lowbit(int x){ return x & -x;}例:C[1]=A[1];C[2]=A[1]+A[2];C[3]=A[3];C[4]=A[1]+A[2]+A[3]+A[4];C[5]=A[5];C[6]=A[5]+A[6];C[7]=A[7];C[8]=A[1]+A[2]+A[3]+A[4]+A[5]+A[6]+A[7]+A[8];.原创 2022-03-03 15:26:25 · 111 阅读 · 0 评论 -
导弹拦截
题目就是让你找出一个 最长子序列 , 一个是递增的 一个是递减的#include "bits/stdc++.h"#define ll long longusing namespace std;const int N = 1e5+5;int n;int a[N],b[N],c[N];bool cmp(int x, int y){ return x>y;}int main(){ while (cin >> n){ memset(...原创 2022-03-03 11:11:26 · 69 阅读 · 0 评论 -
最大连续子序列
题目:给定K个整数的序列{ N1, N2, ..., NK },其任意连续子序列可表示为{ Ni, Ni+1, ..., Nj },其中 1 <= i <= j <= K。最大连续子序列是所有连续子序列中元素和最大的一个, 例如给定序列{ -2, 11, -4, 13, -5, -2 },其最大连续子序列为{ 11, -4, 13 },最大和 为20。 在今年的数据结构考卷中,要求编写程序得到最大和,现在增加一个要求,即还需要输出该 子序列的第一个和最后一个元素。输入:测试输入包含若干原创 2022-03-02 20:32:06 · 80 阅读 · 0 评论 -
最长公共子序列
#include"bits/stdc++.h"#define ll long long#define pi pair<int,int>#define inf 0x3f3f3f3f#define _for(i,a,b) for(int i=a;i<=b;i++)#define for_(i,a,b) for(int i=a;i<b;i++)#define _fr(i,a,b) for(int i=a;i>=b;i--)#define fr_(i,a,b) fo.原创 2022-02-28 19:31:25 · 173 阅读 · 0 评论 -
二叉树理论 (先、中、后序)
先序 (根左右): A B D H E I C F J K G中序 (左根右): D H B E I A J F K C G后序 (左右根): H D I E B J K F G C A思路就是 找根 然后按照 规则插入原创 2022-02-28 13:10:18 · 260 阅读 · 0 评论 -
数字加法模拟
给你一个数字(2^50000)例:12251 + 12 + 122 + 1225#include "bits/stdc++.h"using namespace std;string s;int main(){ cin >> s; int res = 0; for(int i=0;i<s.size();i++){ res += s[i]-'0'; } int ans = 0; vector<int&原创 2022-01-17 12:53:42 · 545 阅读 · 0 评论 -
加减乘除模板
A+Bstring add(string a,string b){ string c; int len1=a.length(); int len2=b.length(); int len=max(len1,len2); for(int i=len1;i<len;i++) a="0"+a; for(int i=len2;i<len;i++) b="0"+b; int ok=0; for(int.原创 2022-01-16 16:18:48 · 96 阅读 · 0 评论 -
动态规划(一维数组)
给你一串一维数组 假如取a1就不能取 a2 , 如果取a2 , 就不能取a1, a3 ,不能取相邻的数字#include "bits/stdc++.h"#define ll long longusing namespace std;int s[100005];int dp[100005];int n;int main(){ while (cin >> n) { memset(s,0,sizeof s); for(int i...原创 2021-12-27 18:58:27 · 485 阅读 · 0 评论 -
博弈基本介绍
这是一个很简单的博弈举个例子1、本游戏是一个二人游戏;2、有一堆石子一共有n个;3、两人轮流进行;4、每走一步可以取走1…m个石子;5、最先取光石子的一方为胜必败点:下一个选手将取胜的位置称为必败点必胜点:下一个选手将必败的位置称为必胜点first人 可以去 1~m个,那m+1个 second人必胜那么如果second想要胜利必须是m+1的倍数,只有这样second人才能保证自己胜利#include"bits/stdc++.h"using nam...原创 2021-11-25 21:00:46 · 3239 阅读 · 0 评论 -
单调栈(仅限于理解)
给你一个n数组 让你找出 (m以内)子序列 的最大值;我们选择前缀和先来处理一波最暴力写法o(nm)ans = s[1];for(int i=1 ;i<=n;i++){ int mi = 99999999; for( int j=i-m;j<i;j++) if(j>=0) mi = min(mi,s[j]); ans = max(ans,s[i]-mi);}printf("ans=%d\n",ans);优化 单调队列 时间复杂度o(n..原创 2021-11-04 16:43:09 · 86 阅读 · 0 评论 -
字典树基础模板
#include"bits/stdc++.h"using namespace std;int s[100000][30];int sum[100000];int k=1;string str;void insert(string &str){ // 创建字典树 int p = 0; for(int i=0 ; i < str.length() ; i ++){ if(!s[p][str[i]-'a']){ s[p][str[i]-'a']=k++;.原创 2021-09-24 16:48:52 · 86 阅读 · 0 评论 -
二分模板 = - =
#include"bits/stdc++.h"using namespace std;int s[105];int n,a;//ss函数 返回的是查找数等于或者大于的第一个数int ss(int x){ int l = 1 , r = n; int mid = (l+r)/2; while(l<=r) { if(s[mid] < x){ l=mid+1; }else if(s[mid] > x){ r=mid-1; }else{ re.原创 2021-09-26 15:58:49 · 61 阅读 · 0 评论