笔记
漆黑之翼²
何以解忧,唯有AC~
展开
-
博弈论基础
巴什博弈。题目:只有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个。最后取完者得胜。结论,如果n%(m+1)==0,则后手赢,否则先手赢。斐波那契博弈。题目:有一堆个数为n(n>=2)的石子,游戏双方轮流取石子,规则如下:(1)先手不能在第一次把所有的石子取完,至少取1颗;(2)之后每次可以取的石子数至少为1,至多为对手刚取的石子数的2倍。约定取走最后一个石子的人为赢家,求必败态。结论:如果n是一个斐波那契数,那么必败。威佐夫博弈。有两堆各若干个物品,两个原创 2021-02-18 22:02:33 · 71 阅读 · 0 评论 -
POJ - 1741(点分治入门)
tree其实关于时间复杂度我也似懂非懂,大概就是把一颗树分层,然后每一层的操作大概是(n log N),然后我们每次找树的重心,就可以分logN层,所以总时间复杂度大概是就是N log² N关于路径,我们先算出到根的距离,然后分成两种,一种关于经过n节点,这是合法的,一种是不经过根节点,就是在一根子树下的,我们可以先算根节点的所有情况,再计算孩子节点的情况,然后减掉就好了。然后计算路径用尺取就好了。#define _CRT_SECURE_NO_WARNINGS#include<stdio.h原创 2020-12-18 23:33:16 · 226 阅读 · 1 评论 -
P3384 【模板】轻重链剖分
#include<stdio.h>#include<iostream>#include<algorithm>using namespace std;const int maxn=2e5+10;int arr[maxn],w[maxn],n,p;struct node{ int v,nxt;}e[maxn<<1];int head[maxn],cnt;int dep[maxn],fa[maxn],siz[maxn],son[maxn],id原创 2020-12-15 23:53:02 · 59 阅读 · 0 评论 -
割点(割边)
割点void targan(int u, int fa){ dfn[u] = low[u] = ++ti; int flag = 0; for (int i = head[u]; i; i = e[i].nxt) { int v = e[i].v;//最小回溯点 if (!dfn[v]) { targan(v, fa); low[u] = min(low[u], low[v]); if (low[v] >= dfn[u] && u != fa)原创 2020-10-27 13:01:33 · 90 阅读 · 0 评论 -
记。稀奇古怪
大佬写的实数相加的模板(爱了爱了)找个时间学学string吧#include <iostream>#include <string>using namespace std;string add1(string s1, string s2) { int len1 = s1.length(), len2 = s2.length(); if (len1 < len2) { string t(len2 - len1, '0');原创 2020-10-14 15:28:49 · 45 阅读 · 0 评论 -
背包(01,多重,完全)
这几天在写dp入门,就随便写点记录下吧。。。01背包,物品只能使用一次。 for(int i=1;i<=n;i++) { scanf("%d%d",&w,&v); for(int j=m;j>=w;j--)//从最大开始枚举,保证每样物品只用了一次 { dp[j]=max(dp[j],dp[j-w]+v); } }多重背包,二进制拆分后,按01背包处理 for (int k = 1; k <= v[i]; k <<= 1)原创 2020-09-23 23:26:05 · 80 阅读 · 0 评论 -
manacher&&最小表示法(字符串)
manacher#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>#include<map>#include<queue>#include<stack>#include<math.h>#incl原创 2020-09-20 23:24:08 · 59 阅读 · 0 评论 -
扩展kmp算法
char t[N], s[N];int nxt[N], extend[N];int tlen, slen;void getnxt(){ nxt[0] = tlen; int now = 0; while (t[now] == t[now + 1] && now + 1 < tlen) now++; nxt[1] = now; int p0 = 1; for (int i = 2; i < tlen; i++) { if (i + nxt[i - p0]原创 2020-09-19 01:13:16 · 56 阅读 · 0 评论 -
Lis&Lcs
lis#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>#include<map>#include<queue>#include<stack>#include<math.h>#include&l原创 2020-09-14 12:45:40 · 89 阅读 · 0 评论 -
网络流
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>#include<map>#include<queue>#include<stack>#include<math.h>#include<se原创 2020-09-10 11:51:01 · 42 阅读 · 0 评论 -
字典树&&AC自动机
int k = 1;void insert(char* w){ int len = strlen(w); int p = 0; for (int i = 0; i < len; i++) { int c = w[i] - 'a'; if (!trie[p][c]) { trie[p][c] = k; k++; } p = trie[p][c]; } f[p] = 1;}int sur(char* w){ int len = strlen(w);原创 2020-08-01 23:27:45 · 90 阅读 · 0 评论 -
主席树
洛谷模板题#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>#include<map>#include<queue>#include<stack>#include<math.h>#include<set>using namespace std;原创 2020-06-12 00:17:58 · 74 阅读 · 0 评论 -
堆排序
#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>#include<map>#include<queue>#include<stack>#include<math.h>#include<set>using namespace std;int t原创 2020-06-10 16:06:43 · 77 阅读 · 0 评论 -
线段树
#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>#include<map>#include<queue>#include<stack>#include<math.h>#include<set>using namespace std;typed原创 2020-06-10 00:54:40 · 84 阅读 · 0 评论 -
map
#include<map>int main(){ int t; cin >> t; while (t--) { map<string, map<string, int>>cp; map<string, map<string, int>>::iterator t1; map<string, int>::iterator t2; int n, i; cin >> n; string原创 2020-06-04 23:31:52 · 96 阅读 · 0 评论 -
尺取
int main(){ int n, max; cin >> n >> max; for (int i = 0; i < n; i++) { cin >> a[i]; } int i = 0, j = 0, sum = 0, ans = n + 1; while (1) { while (j < n && sum <= max) { sum += a[j++]; } if (sum < m原创 2020-06-04 00:08:49 · 116 阅读 · 0 评论 -
最小生成树(Prim和Kruskal)
Primvoid add(int u, int v, int w){ e[++cnt].v = v; e[cnt].w = w; e[cnt].next = head[u]; head[u] = cnt;}int prim(){ for (int i = 2; i <= n; ++i) { dis[i] = inf; } for(int i=1;i<=n;i++) { int minn = inf; for (int i = 1; i <= n; +原创 2020-06-03 00:14:23 · 107 阅读 · 0 评论 -
数论
素数线性筛int Prime(){ int index = 0; for(int i = 2; i <= n; i++) { //如果未标记则得到一个素数 if(f[i] == 0){ prime[index++] = i; } //标记目前得到的素数的i倍为非素数 for(int j = 1; j < index &&am原创 2020-06-01 23:48:22 · 157 阅读 · 0 评论 -
dijkstra算法和spfa算法
void dijkstra(){ for (int i = 1; i <= n; i++) dist[i] = c[v][i];//找到与源点直接相连接的点,并且更新dist dist[v] = 0;//源点到自己本身距离为0 s[v] = 1;//首先把源点标记 for (int i = 2; i <= n; i++) { int temp = INF; int u = v; for (int j = 1; j <= n; j++)//找到与源点直接相连,并且距离原创 2020-05-31 01:33:20 · 595 阅读 · 0 评论 -
kmp算法
给出两个字符串 s 1和 s 2,其中 s 2为 s 1 的子串,求出 s 2在 s 1 中所有出现的位置。#include<stdio.h>#include<iostream>#include<algorithm>#include<string.h>#include<vector>#include<map>#include<queue>#include<stack>#include<m原创 2020-05-30 02:32:34 · 70 阅读 · 0 评论 -
洛谷P1440求m区间内的最小值(单调队列)
一个含有n项的数列(n<=2000000),求出每一项的前m个数到它这个区间内的最小值。若前面的数不足m项则从第1个数开始,若前面没有数则输出0。#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<map>#include<queue>#include<sta原创 2020-05-27 21:57:01 · 183 阅读 · 0 评论 -
快速排序
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<math.h>int a[100001];void mysort(int l, int r){ int temp; int mid = a[(l + r) / 2]; int i = l, j = r; do { while (a[i] < mid) i++; while (a[j] > mid) j--; if (原创 2020-05-26 16:31:22 · 74 阅读 · 0 评论 -
大数运算
求 1到 10^n 的数字中有 3 的数字的数量。对于 100% 的数据,n≤1000之前没做过类似的题,根据题意我们很容易推出公式,但你会发现n的值非常大,所以直接算肯定wa,所以我们要用数组来存数然后计算。#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<map>#inclu原创 2020-05-25 22:37:45 · 92 阅读 · 0 评论 -
普通莫队
洛谷P2709小B的询问#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<map>#include<queue>#include<stack>#include<math.h>#include<set>using namespac原创 2020-05-25 13:32:52 · 86 阅读 · 0 评论 -
链式前向星
struct z { int t, nex;}e[1000010];void add(int x, int y) { e[++tot].t = y; e[tot].nex = head[x]; head[x] = tot;}for(int i=head[x]; i; i=e[i].nex) //相当于从后往前遍历,不影响答案2 3 ,2 4e[1].t=1,e[1].nex=0,head[2]=1;e[2].t=4,e[2].nex=1,head[2]=2;for(int i=he原创 2020-05-25 00:15:41 · 119 阅读 · 0 评论 -
洛谷P3379最近公共祖先(LCA)
给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<map>#include<queue>#include<stack>#include<math.h>#include<set>原创 2020-05-24 00:05:12 · 137 阅读 · 0 评论 -
静态区间最值问题(ST表)
洛谷P3865 【模板】ST表给定一个长度为 NN 的数列,和 MM 次询问,求出每一次询问的区间内数字的最大值。#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<map>#include<queue>#include<stack>#include<原创 2020-05-22 21:43:49 · 332 阅读 · 0 评论 -
差分与前缀和
#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<map>#include<queue>#include<stack>#include<math.h>#include<set>using namespace std;int a[原创 2020-05-21 22:54:33 · 77 阅读 · 0 评论 -
P2863The Cow Prom S(tarjan算法)
有一个 n 个点,m 条边的有向图,请求出这个图点数大于 1 的强联通分量个数。#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<map>#include<queue>#include<stack>#include<math.h>#inclu原创 2020-05-21 01:05:56 · 117 阅读 · 0 评论 -
P5136村村通(并查集)
某市调查城镇交通状况,得到现有城镇道路统计表。表中列出了每条道路直接连通的城镇。市政府 “村村通工程” 的目标是使全市任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要相互之间可达即可)。请你计算出最少还需要建设多少条道路?#include<stdio.h>#include<iostream>#include<algorithm>#include<cstring>#include<vector>#include<map&原创 2020-05-20 17:59:52 · 144 阅读 · 0 评论 -
P5318查找文献(深搜与广搜)
小K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小K 求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献(如果他之前已经看过这篇参考文献的话就不用再看它了)。文献 X → Y 表示文章 X 有参考文献 Y。保证编号为 1 的文章没有被其他文章引用。深搜,顾名思义就是往深了搜。每次,只要你发现下一个点可以走,你马上走上去,就这样不断递归,直到遇到你的边界条件,走不了就退一步,能走就继续走,不能就继续退,走到不能走,退到不能退。广搜就是先原创 2020-05-20 00:01:56 · 354 阅读 · 0 评论 -
二分查找
#include<stdio.h>int a[100100];int find(int star,int end,int x){ int min; if (star >= end) { if (a[star] == x) { return star; } else { return -1; } } min = (star + end) / 2; if (x > a[min]) { find(min+1, end, x);原创 2020-05-19 16:05:11 · 65 阅读 · 0 评论 -
求逆序对(归并排序)
void Merge(int start, int mid, int end) //归并排序的合并部分{ int i = start, j = mid + 1, k = start; while (i <= mid && j <= end) { if (a[i] <= a[j]) { b[k++] = a[i++]; } else { c += j - k; //存入后部分时计算逆序数 b[k++] = a[j++];原创 2020-05-18 22:42:44 · 105 阅读 · 0 评论 -
简单dp笔记
1.背包问题有n件物品和一个容量是v的背包,物品使用一次。核心代码for (int i = 1; i <= n; i++){ for (int j = 0; j <= m; j++) { f[i][j] = f[i - 1][j]; //表示第i件物品不选 if (v[i] <= j) { f[i][j] = max(f原创 2020-05-18 01:12:56 · 128 阅读 · 0 评论