- 博客(53)
- 收藏
- 关注
原创 AT4168
AT4168多位前缀和+二进制好题#include <algorithm>#include <cstring>using namespace std;const int N=20;struct Node{ int f,s;}a[1<<N];int n;int main(){ cin>>n; for(int i=0;i<1<<n;i++){ int x; cin>>x; a[i].f=x; }
2021-11-23 15:29:49
111
原创 p2151
#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int mod=45989;const int N=200;struct mat{ int m[N][N]; int r,c; mat(){ memset(m,0,sizeof m); } mat operator * (const mat &t)const{ ma
2021-11-20 19:33:37
532
原创 p3216
#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=110;typedef long long ll;struct mat{ ll a[3][3];}c,ans;ll n,m,t[N];mat operator *(mat a,mat b){ mat c; memset(c.a,0,sizeof c.a); for(int
2021-11-11 11:17:57
246
原创 P1531 I Hate It
P1531 I Hate It树状数组求区间最大值#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=2e5+10;int n,m;int tr[N*4],a[N];int lowbit(int x){ return x&-x;}void change(int x,int y){ for(int i=x;i<
2021-10-31 17:07:35
80
原创 Monochromatic Triangles SCU - 2090
Monochromatic Triangles SCU - 2090#include <iostream>#include <algorithm>#include <cstring>#include <vector>using namespace std;const int N=1010;typedef long long ll;int t,n,m;ll d[N];int main(){ cin>>t; while(t--
2021-10-24 17:55:03
79
原创 p1537
P1537#include <iostream>#include <algorithm>#include <cstring>using namespace std;const int N=6e4+10;bool f[N];int n,s;int a[10];bool read(){ s=0; for(int i=1;i<=6;i++){ scanf("%d",&a[i]); s+=a[i]*i; } return s;}
2021-10-17 21:14:13
87
原创 2021-10-17
P1045 麦森数(高精)#include <iostream>#include <algorithm>#include <cstring>#include <cmath>using namespace std;const int N=1010;int p;int f[N],res[N],sav[N];void mul(int a[],int b[],int c[]){ memset(sav,0,sizeof sav); for(int
2021-10-17 16:46:23
61
原创 染色法判别二分图
大雪菜的课(笔记)搜索与图论(三)3.染色法判别二分图(1).模板(染色法判别二分图 —— 模板题 AcWing 860. 染色法判定二分图)时间复杂度是 O(n+m)O(n+m), nn 表示点数,mm 表示边数int n; // n表示点数int h[N], e[M], ne[M], idx; // 邻接表存储图int color[N]; // 表示每个点的颜色,-1表示未染色,0表示白色,1表示黑色// 参数:u表示当前节点,c表示当前点的颜色bo
2020-07-19 16:58:35
205
原创 Kruskal算法
大雪菜的课(笔记)搜索与图论(三)2.Kruskal算法(1)模板(Kruskal算法 —— 模板题 AcWing 859. Kruskal算法求最小生成树)时间复杂度是 O(mlogm)O(mlogm), nn 表示点数,mm 表示边数int n, m; // n是点数,m是边数int p[N]; // 并查集的父节点数组struct Edge // 存储边{ int a, b, w; bool operator< (const
2020-07-19 16:54:24
205
原创 匈牙利算法
大雪菜的课(笔记)搜索与图论(三)4.匈牙利算法(1).模板(匈牙利算法 —— 模板题 AcWing 861. 二分图的最大匹配)时间复杂度是 O(nm), n 表示点数,m 表示边数int n1, n2; // n1表示第一个集合中的点数,n2表示第二个集合中的点数int h[N], e[M], ne[M], idx; // 邻接表存储所有边,匈牙利算法中只会用到从第一个集合指向第二个集合的边,所以这里只用存一个方向的边int match[N]; // 存储第
2020-07-19 16:50:32
99
原创 Prim算法
大雪菜的课(笔记)搜索与图论(三)1.Prim算法(1).模板(朴素版prim算法 —— 模板题 AcWing 858. Prim算法求最小生成树)时间复杂度是 O(n2+m)O(n2+m), nn 表示点数,mm 表示边数int n; // n表示点数int g[N][N]; // 邻接矩阵,存储所有边int dist[N]; // 存储其他点到当前最小生成树的距离bool st[N]; // 存储每个点是否已经在生成树中// 如果图
2020-07-19 16:46:26
148
1
原创 floyd
大雪菜的课(笔记)搜索与图论(二)1.最短路(6).floyd模板(floyd算法 —— 模板题 AcWing 854. Floyd求最短路)时间复杂度是 O(n3), n 表示点数初始化: for (int i = 1; i <= n; i ++ ) for (int j = 1; j <= n; j ++ ) if (i == j) d[i][j] = 0; else d[i][j] = INF;//
2020-07-18 11:53:51
97
原创 spfa判负环
大雪菜的课(笔记)搜索与图论(二)1.最短路(5).spfa判负环模板(spfa判断图中是否存在负环 —— 模板题 AcWing 852. spfa判断负环)时间复杂度是 O(nm)O(nm), nn 表示点数,mm 表示边数int n; // 总点数int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边int dist[N], cnt[N]; // dist[x]存储1号点到x的最短距离,cnt[x]存储1到x的最
2020-07-18 11:18:35
179
原创 spfa求最短路
大雪菜的课(笔记)搜索与图论(二)1.最短路(4).spfa求最短路模板spfa 算法(队列优化的Bellman-Ford算法) —— 模板题 AcWing 851. spfa求最短路时间复杂度 平均情况下 O(m),最坏情况下 O(nm), n 表示点数,m 表示边数int n; // 总点数int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边int dist[N]; // 存储每个点到1号点的最短距离boo
2020-07-18 10:43:45
381
原创 Bellman_ford
大雪菜的课(笔记)搜索与图论(二)1.最短路(3).Bellman_ford模板()时间复杂度 O(nm)O(nm), n 表示点数,m表示边数注意在模板题中需要对下面的模板稍作修改,加上备份数组,详情见模板题。int n, m; // n表示点数,m表示边数int dist[N]; // dist[x]存储1到x的最短路距离struct Edge // 边,a表示出点,b表示入点,w表示边的权重{ int a, b, w;}edges[M]
2020-07-17 17:10:45
131
原创 堆优化Dijkstra
大雪菜的课(笔记)搜索与图论(二)1.最短路(2).堆优化Dijkstra模板(堆优化版dijkstra —— 模板题 AcWing 850. Dijkstra求最短路 II)时间复杂度 O(mlogn)O(mlogn), n表示点数,m表示边数typedef pair<int, int> PII;int n; // 点的数量int h[N], w[N], e[N], ne[N], idx; // 邻接表存储所有边int dist[N];
2020-07-17 10:47:35
147
原创 朴素Dijkstra
大雪菜的课(笔记)搜索与图论(二)1.最短路(1).朴素Dijkstra模板(朴素dijkstra算法 —— 模板题 AcWing 849. Dijkstra求最短路 I)时间复杂是 O(n2+m)O(n2+m), nn 表示点数,mm 表示边数int g[N][N]; // 存储每条边int dist[N]; // 存储1号点到每个点的最短距离bool st[N]; // 存储每个点的最短路是否已经确定// 求1号点到n号点的最短路,如果不存在则返回-1int dijkstr
2020-07-16 17:20:44
114
原创 拓扑排序
大雪菜的课(笔记)搜索与图论(一)4.拓扑排序(1).模板(拓扑排序 —— 模板题 AcWing 848. 有向图的拓扑序列)时间复杂度 O(n+m), nn 表示点数,mm 表示边数bool topsort(){ int hh = 0, tt = -1; // d[i] 存储点i的入度 for (int i = 1; i <= n; i ++ ) if (!d[i]) q[ ++ tt] = i; while (
2020-07-16 12:37:52
82
原创 树与图的遍历·BFS
大雪菜的课(笔记)搜索与图论(一)3.树与图的遍历(2).BFS模板(宽度优先遍历 —— 模板题 AcWing 847. 图中点的层次)queue<int> q;st[1] = true; // 表示1号点已经被遍历过q.push(1);while (q.size()){ int t = q.front(); q.pop(); for (int i = h[t]; i != -1; i = ne[i]) { int j = e
2020-07-16 11:30:35
216
原创 树与图的储存
大雪菜的课(笔记)搜索与图论树与图的存储模板树与图的存储树是一种特殊的图,与图的存储方式相同。对于无向图中的边ab,存储两条有向边a->b, b->a。因此我们可以只考虑有向图的存储。(1) 邻接矩阵:g[a][b] 存储边a->b(2) 邻接表:// 对于每个点k,开一个单链表,存储k所有可以走到的点。h[k]存储这个单链表的头结点int h[N], e[N], ne[N], idx;// 添加一条边a->bvoid add(int a, int b)
2020-07-16 10:50:56
86
原创 树与图的遍历·DFS
大雪菜的课(笔记)搜索与图论(一)3.树与图的遍历(1).DFS模板(深度优先遍历 —— 模板题 AcWing 846. 树的重心)int dfs(int u){ st[u] = true; // st[u] 表示点u已经被遍历过 for (int i = h[u]; i != -1; i = ne[i]) { int j = e[i]; if (!st[j]) dfs(j); }}AcWing846. 树的重心给定一颗树
2020-07-16 10:48:15
189
原创 BFS
大雪菜的课(笔记)搜索与图论(一)2.BFS(1).AcWing844. 走迷宫给定一个n*m的二维整数数组,用来表示一个迷宫,数组中只包含0或1,其中0表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于左上角(1, 1)处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角(n, m)处,至少需要移动多少次。数据保证(1, 1)处和(n, m)处的数字为0,且一定至少存在一条通路。输入格式第一行包含两个整数n和m。接下来n行,每行包含m个整数
2020-07-15 23:04:51
73
原创 DFS
大雪菜的课(笔记)搜索与图论(一)1.DFS(1).回溯AcWing842. 排列数字给定一个整数n,将数字1~n排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。输入格式共一行,包含一个整数n。输出格式按字典序输出所有排列方案,每个方案占一行。数据范围1≤n≤7输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1#include <iostream>using namespace std;co
2020-07-15 14:19:57
244
原创 字符串哈希
大雪菜的课(笔记)数据结构(三)1.哈希(1).字符串哈希模板(字符串哈希 —— 模板题 AcWing 841. 字符串哈希)核心思想:将字符串看成P进制数,P的经验值是131或13331,取这两个值的冲突概率低小技巧:取模的数用2^64,这样直接用unsigned long long存储,溢出的结果就是取模的结果typedef unsigned long long ULL;ULL h[N], p[N]; // h[k]存储字符串前k个字母的哈希值, p[k]存储 P^k mod 2^64
2020-07-14 16:18:26
115
原创 一般哈希·开放选址法
大雪菜的课(笔记)数据结构(三)1.哈希(2).开放选址法(茅坑法)模板(一般哈希 —— 模板题 AcWing 840. 模拟散列表)const int N,null=0x3f3f3f3f;int h[N];// 如果x在哈希表中,返回x的下标;如果x不在哈希表中,返回x应该插入的位置int find(int x){ int t=(x%N+N)%N; while(h[t]!=x&&h[t]!=null){ t++; if(t==N) t=0; } return
2020-07-14 15:24:27
165
原创 一般哈希·拉链法
大雪菜的课(笔记)数据结构(三)1.哈希(1).拉链法模板(一般哈希 —— 模板题 AcWing 840. 模拟散列表)int e[N],ne[N],h[N],idx;// 向哈希表中插入一个数void insert(int x){ int k=(k%N+N)%N; e[idx]=x; ne[idx]=h[k]; he[k]=idx++;}// 在哈希表中查询某个数是否存在bool find(int x){ int x=(k%N+N)%N;
2020-07-14 13:25:13
139
原创 堆
大雪菜的课(笔记)数据结构(二)3.堆(1).模板(堆 —— 模板题 AcWing 838. 堆排序, AcWing 839. 模拟堆)// h[N]存储堆中的值, h[1]是堆顶,x的左儿子是2x, 右儿子是2x + 1// ph[k]存储第k个插入的点在堆中的位置// hp[k]存储堆中下标是k的点是第几个插入的int h[N], ph[N], hp[N], size;// 交换两个点,及其映射关系void heap_swap(int a, int b){ swap(ph[
2020-07-13 14:25:39
110
原创 维护size()的并查集
大雪菜的课(笔记)数据结构(二)2.并查集(2).维护size()的并查集模板 int p[N], size[N]; //p[]存储每个点的祖宗节点, size[]只有祖宗节点的有意义,表示祖宗节点所在集合中的点的数量 // 返回x的祖宗节点 int find(int x) { if (p[x] != x) p[x] = find(p[x]); return p[x]; } // 初始化,假定节点编号是1~n
2020-07-13 10:44:12
590
原创 朴素并查集
大雪菜的课(笔记)数据结构(二)2.并查集(1).朴素并查集模板(并查集 —— 模板题 AcWing 836. 合并集合) int p[N]; //存储每个点的祖宗节点 // 返回x的祖宗节点 int find(int x) { if (p[x] != x) p[x] = find(p[x]); return p[x]; } // 初始化,假定节点编号是1~n for (int i = 1; i <=
2020-07-12 23:03:36
247
原创 trie
大雪菜的课(笔记)数据结构(二)1.trie(1).模板()int son[N][26], cnt[N], idx;// 0号点既是根节点,又是空节点// son[][]存储树中每个节点的子节点// cnt[]存储以每个节点结尾的单词数量// 插入一个字符串void insert(char *str){ int p = 0; for (int i = 0; str[i]; i ++ ) { int u = str[i] - 'a';
2020-07-12 17:04:36
132
原创 kmp字符串
大雪菜的课(笔记)数据结构(一)4.kmp字符串(1).模板(KMP —— 模板题 AcWing 831. KMP字符串)for(int i=2,j=0;i<=n;i++){ while(j&&p[i]!=p[j+1]) j=ne[j]; if(p[i]==p[j+1]) j++; ne[i]=j;}for(int i=1,j=0;i<=m;i++){ while(j&&s[i]!=p[j+1]) j=ne[j]; if(s[i]==p[j+
2020-07-12 12:40:16
125
原创 模拟队列
大雪菜的课(笔记)数据结构(一)3.队列(1).模拟队列模板(队列 —— 模板题 AcWing 829. 模拟队列)int hh=0,tt=-1,q[N];//插入q[++tt]=x;//删除hh++;//判空tt>=hh?"NO":"YES";//取出队尾元素q[hh]AcWing829. 模拟队列实现一个队列,队列初始为空,支持四种操作:(1) “push x” – 向队尾插入一个数x;(2) “pop” – 从队头弹出一个数;(3) “empty” – 判断
2020-07-12 10:42:09
199
原创 单调队列
大雪菜的课(笔记)数据结构(一)3.队列(1).单调队列模板(单调队列 —— 模板题 AcWing 154. 滑动窗口)常见模型:找出滑动窗口中的最大值/最小值int hh = 0, tt = -1;for (int i = 0; i < n; i ++ ){ if(hh <= tt && check_out(q[hh])) hh ++ ; // 判断队头是否滑出窗口 while (hh <= tt && check(q[t
2020-07-11 16:57:39
96
原创 模拟栈
大雪菜的课(笔记)数据结构(一)3.栈(1).模拟栈模板(栈 —— 模板题 AcWing 828. 模拟栈)int tt,stk[N];//入栈stk[++tt]=x;//出栈tt--;//判空if(tt){ ...}//取出栈顶元素printf("%d ",stk[tt]);AcWing828. 模拟栈实现一个栈,栈初始为空,支持四种操作:(1) “push x” – 向栈顶插入一个数x;(2) “pop” – 从栈顶弹出一个数;(3) “empty” – 判断栈
2020-07-11 13:43:39
247
原创 单调栈
大雪菜的课(笔记)数据结构(一)3.栈(2).单调栈模板(单调栈 —— 模板题 AcWing 830. 单调栈)//常见模型:找出比左边离它最近比它大/小的数int tt,stk[N];while(tt&&stk[tt]>=x) tt--;if(tt) printf("%d ",stk[tt]);else printf("-1 ");stk[++tt]=x;AcWing830. 单调栈给定一个长度为N的整数数列,输出每个数左边第一个比它小的数,如果不存在则输出
2020-07-11 13:12:13
252
原创 双链表
大雪菜的课数据结构(一)2.双链表(1).模版(双链表 —— 模板题 AcWing 827. 双链表)int idx,l[N],r[N],e[N];void init(){ r[0]=1,l[1]=0; idx=2;}//在k右边插入一个数,如果在k左边插入,add(l[k],x)即可void add(int k,int x){ r[idx]=r[k],l[idx]=k; l[r[k]]=idx,r[k]=idx++;}void remove(int k){ l[r[k]]=l
2020-07-10 23:23:45
99
原创 单链表
大雪菜的课(笔记)数据结构(一)1.单链表(1).模板(单链表 —— 模板题 AcWing 826. 单链表)int idx,head ,e[n],ne[n];void init(){ head=-1; idx=0;}void add_to_head(int x){ e[idx]=x; ne[idx]=head; head=idx; idx++;}void add(int x,int k){ e[idx]=x; ne[idx]=ne[k]; ne[k]=idx; idx
2020-07-10 22:14:56
110
原创 区间合并
大雪菜的课(笔记)基础算法(三)4.区间合并(1).模板(区间合并 —— 模板题 AcWing 803. 区间合并)typedef pair<int,int> PII;void merge(vector<PII> &seg){ vector<PII> res; int st=-2e9,ed=-2e9; sort(seg.begin(),seg.end()); for(auto item:seg){ if(item.first>ed){
2020-07-08 18:44:04
132
原创 离散化
大雪菜的课(笔记)基础算法(三)3.离散化(1).模板(离散化 —— 模板题 AcWing 802. 区间和)vector<int> alls;sort(alls.begin(),alls.end());alls.erase(unique(alls.begin(),alls.end()),alls.end());int find(int x){ int l=0,r=alls.size()-1; while(l<r){ int mid=l+r>>1; i
2020-07-08 13:45:29
197
原创 位运算
大雪菜的课(笔记)基础算法(三)2.位运算(1).模板(位运算 —— 模板题 AcWing 801. 二进制中1的个数)//求n的第k位数字:n>>k&1;//求n的最后一位1:lowbit(x)=n&-n(-n=~n+1);题目1求x的二进制表示#include <iostream>using namespace std;int main(){ int x; scanf("%d",&x); for(int i=31;i>=
2020-07-08 09:55:00
93
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人