- 博客(23)
- 收藏
- 关注
原创 线段树板子
#include<bits/stdc++.h> using namespace std; using ll = long long; const int N = 1e6 + 10; int b[N], n, m; struct vv{ ll l, r, sum, lazy; }; vv tree[N*4]; //建树 inline void build(ll i, ll l, ll r){ tree[i].l = l, tree[i].r = r; if(l == r){ tree[i].sum
2022-04-08 21:57:35
209
2
原创 树状数组板子
#include<bits/stdc++.h> using namespace std; const int N = 5e5 + 10; #define lowbit(x) ((x) & (-x)) int tree[N], n, m; inline void update(int i, int x){ for(int pos = i; pos < N; pos += lowbit(pos)){ tree[pos] += x; } } inline int query(int n)
2022-04-08 21:56:18
144
原创 tarjan板子
#include<bits/stdc++.h> using namespace std; using ll = long long; const int N = 1e6 + 10; //存图 struct vv{ int to, next; }G[N]; int head[N], cnt; inline void add(int from, int to){ G[++cnt].to = to; G[cnt].next = head[from]; head[from] = cnt; } //tar
2022-04-08 21:55:00
186
原创 kmp板子
#include<iostream> #include<vector> using namespace std; const int N = 1e6 + 10; int Next[N]; string s1, s2; void get(string s) { int j = 0, k = -1; Next[0] = -1; while(j < s.size()) { if(k == -1 || s[j] == s[k]) { ++j; k++;
2022-04-08 21:53:30
288
原创 数据结构实验
文章目录实验1:线性表代码:实验2 : 链表实现实验1思路:代码:实验3:表达式求值思路:代码:实验四:字符串匹配思路:代码:实验5.二叉树思路:代码:实验6:赫夫曼树思路:代码实验7.1邻接矩阵代码:实验7.2 邻接表代码:实验8 最小生成树代码:实验9 最短路代码:实验10 拓补排序与关键路径思路:代码:实验11.查找思路:代码:实验12代码:实验13,简单排序思路:代码:实验14 堆排序思路:代码:实验14 堆排序思路:代码: 实验1:线性表 基本就是按照思路直接写 代码: #include<
2021-12-06 16:44:40
1161
原创 数据结构实验
文章目录实验1:线性表代码:实验2 : 链表实现实验1思路:代码:实验3:表达式求值思路:代码:实验四:字符串匹配思路:代码:实验5.二叉树思路:代码:实验6:赫夫曼树思路:代码实验7.1邻接矩阵代码:实验7.2 邻接表代码: 实验1:线性表 基本就是按照思路直接写 代码: #include<iostream> #include<fstream> #include<cstring> #include<iomanip> using namespace std
2021-11-04 22:47:02
537
原创 二分的记录
发现二分里面if表示else的那个 在升序找>= int l = 1, r = len2; while(l <= r){ int mid = (l + r) >> 1; f(d2[mid] >= target){ r = mid-1; }else{ l = mid+1; } } ans = l; 此时l代表了第一个>=target的下标 找第一个>target的数就是换成if(… > …) 降序找< int l = 1, r
2021-10-22 20:51:12
84
原创 最小生成树prim算法板子
最小生成树,也就是求图里面用n-1条边使得整个图连接起来的算法。 两种算法,一种是kusual, 另一种是prim。 两种算法都很简单。 kusual : 简单来说就是我们先把所有的边排序,然后从小到大选出n-1条边使得图相连。 那么就是用优先队列维护最小,用并查集维护是否在同一个集合就好。 prim:主要思想和迪杰斯特拉是一样的,每次找最小的,没有被找到过的那一个边对应的点,然后用这个点去更新其余边的最小值。只是这里记录的是最短路里面上一个点到当前点的值。 证明麻烦得很,总之应该是贪心。 总之前人发明的东
2021-09-02 23:44:40
283
原创 最短路迪杰斯特拉板子
这个算法是找单源最短路,思想就是找当前离起点最短的一条边去维护其余点的最短距离。 简单描述就是 a 能到b, b能到c, a能到c。那么对于a到c, 如果a到b再从b到c比a直接到c更短,那么就选则a-b-c,而不是直接选择a-c 。 算法就是不断找最小,然后维护。 模板: 邻接矩阵版本 #include<bits/stdc++.h> using namespace std; const int N = 1e4 + 10; const int inf = 0x3f3f3f3f; int G[N
2021-08-28 11:59:27
317
原创 2021牛客多校7(H,I),多校8(A,D,E,K).
多校7: H. xay loves count 题目:给了数组a, 求三元组(i, j, k)的数量,使得 ai_ii * aj_jj = ak_kk 思路:对于a * b = c来说,如果我们知道了c, 那么就可以从 1到c\sqrt{c}c找a, 然后通过a去判断b。 这里可以用一个map把数量存下来,然后遍历c\sqrt{c}c 就好。 #include<bits/stdc++.h> using namespace std; using ll = long long; const
2021-08-12 22:02:38
430
原创 2021暑期牛客6 F,I 补题
F. Hamburger Steak 题目:给一堆汉堡和要煎汉堡的时间,还有锅的数量。求最少时间,还要输出方案。 思路:其实本题有点像洛谷搜索题单第二题,我第一眼就看了出来。但是本题要更复杂,但是思想有点类似。就是这个最少时间要么是全部加起来除以锅的数量, 要么是最大的汉堡时间。我们依次就可以先把每个锅定一个容量。然后就放,直接放,不够就放到下一个里面。当时就是死脑筋非要在一个锅里面煎。 代码: #include<iostream> #include<algorithm> using
2021-08-12 20:30:47
101
原创 2021杭电多校5 :3,6,7; 多校6:1 5
多校5: 1003. VC Is All You Need 题目:能否用一条直线把n个点分成两部分,每一边的颜色是相同的。 思路:如果稍微了解过机器学习应该就会了。想一下对于四个点 你不能用一条直线直接分开。但是,如果你把右下角的红点翻折上来,这样就是一个三维平面,你就可以分开。而我们考虑最坏的情况,每次翻折只能使两个点变成一个点。那么四个点翻一次,五个点翻两次… 于是答案就呼之欲出了。 代码: #include<bits/stdc++.h> using namespace std; int
2021-08-11 14:41:39
368
原创 2021暑期牛客5,B,D,H,J,K 补题
B. Boxes 题意:箱子里有黑球和白球,你可以花费Vi 打开箱子,花费C询问裁判黑球数量。现在求你知道箱子里球的颜色的最少期望。 思路:首先对于询问黑球个数,我们只问第一次,后面的根据所开的球的数量可以得到。然后就是找规律。我们分析四个球,现在用0表示白,用1表示黑。 所有情况2n, 第一次就知道:0000, 1111。 2/16。 第二次就知道:(0)111, (1)000。 2/16。 第三次就知道:()011, ()100。 4/16。 第四次就知道:()()
2021-08-07 22:20:01
141
原创 2021暑期杭电多校4:1,2,9
1.Calculus 结论题 题目大意: 给你一个函数式,求他是否收敛。 思路: 第一眼想到的就是收敛的性质,收+收则收,收+发则发,发+发不确定。 然后发现给的函数只有一种可能是收的,就是C==0的时候。 代码: #include<iostream> #include<algorithm> #include<cstring> #include<vector> using namespace std; using ll = long long; int ma
2021-08-04 16:53:36
148
原创 2021暑期杭电多校3(4,7, 11)
Game on plane 理论上是水题,但是题目读错了… 题目大意: 爱丽丝和鲍勃在玩游戏。在这个游戏中,二维平面上有n条直线。 首先爱丽丝会在n条直线中选出确切的k条直线l1, l2, … , lk,鲍勃将会画一条直线L. Bob的惩罚被定义为在{l1、l2,…,lk}中与L至少有一个公共点的数量,注意两个重叠的线也有共同点。 Alice想要最大化Bob的惩罚而Bob想要最小化。 你会得到这n条线,请写一个程序来预测当k=1,2,3,…,n时,Bob的惩罚, 如果两个玩家都会做最优的方案 简单的描述就.
2021-08-04 16:36:56
311
原创 2021暑期牛客多校4
C. LCS 构造,我是暴力的… 题目:s1, s2, s3, 公共的字符长度是a,b,c。 思路:暴力… 代码: #include<bits/stdc++.h> using namespace std; struct vv{ int u, id; string s; }; bool cmp1(vv a, vv b){ return a.u < b.u; } bool cmp2(vv a, vv b){ return a.id < b.id;
2021-07-31 23:12:47
133
原创 2021牛客暑期多校3 BCEFJ题解
B.Black and white 思维题, 只要想出来就好做了. 题目大意: 把一个矩阵全涂黑, 问最少需要多少花费,对一个2*2的矩阵的时候,有三个被涂黑了,那么第四个就黑了.每个元素的值就是涂黑的花费. 思路: 我们把行和列都看成一个点, 每个格子看成点之间的连线, 然后就得到了一个图. 在图上求最小生成树, 使得整个图能联通. 那就是所求值. 代码: #include<bits/stdc++.h> using namespace std; using ll = long long; co
2021-07-31 21:51:35
171
原创 2021暑期杭电多校2: 1 5 8 11 12 题解。
I love cube 结论题推到一下就好。 题目大意:现在我们有一个长度l = n-1立方体,我们要在立方体的内部和边界上画等边三角形。其中等边三角形的顶点必须是整数,每条边必须与一个面平行。 思路:简单分析,发现长为1时8个,长为2时8 + 8 * 8。长为3时8 + 88 + 278。后面依次类推。就是一个立方和。可以自己去网上找公式。 代码: #include<bits/stdc++.h> using namespace std; using ll = long long; #def.
2021-07-27 16:53:32
366
原创 2021暑期杭电多校第一场1,5,8,9题解
1.Mod, Or and Everything 简单结论题,打表找规律。 题目大意:现在给你一个数,你要把(n%1) | (n%2) | … | (n%n)计算出来。 思路:首先我们打表找一下规律,发现就是从1到x做或操作,其中当n是奇数时x为(n/2),当n是偶数时x为(n/2 - 1)。观察数据我们会发现n是1e12,一半就是5e11,很明显暴力在1s的时间会爆。所以我们再观察一下。要注意的是这是二进制的运算,我们把目光投到二进制上,发现这样的一个运算得到的是1111这样的数。好的到这里就可以了。 代
2021-07-26 22:52:14
334
原创 简单快速排序板子
#include<iostream> #include<cstring> #include<algorithm> #include<cmath> #include<iomanip>; using namespace std; const int maxn = 1e5 + 10; int b[maxn]; int n; void qst(int l, int r) { if (l >= r) return; int tmp = b[l]
2021-07-25 12:56:41
154
原创 并查集板子
简单并查集板子 //并查集板子 const int maxn = 1e6 + 10; int fa[maxn]; inline void iit(int n) { for (int i = 0; i <= n; i++) fa[i] = i; } int findx(int x) { return (x == fa[x] ? x : (fa[x] = findx(fa[x]))); } void merge(int x, int y) { int f_x = findx(x), f
2021-07-23 18:51:30
148
原创 2021牛客暑期训练2 C,D,F,K题解
C. Draw Grids 结论题,直接找。 题目大意: 两个人玩一个游戏,在已知m,n的前提下一个给(a,b),一个给(c,d)。满足| a-c | + | b-d | = 1, 1<= a,c<= n, 1 <= b,d <= m。然后把(a,b)和(c,d)连起来。然后满足不能再连相同的边,不能封闭。有一个人不能走的时候就输了。问先手能不能赢 思路:建议多画几种情况,你会发现走法是走过的边数是n*m - 1。然后很明显,走奇数次就赢了,偶数次就输了。 代码: #include&
2021-07-21 22:12:15
124
原创 2021暑期牛客训练1A,B,D,F,G题解
A.Alice and Bob 博弈论题目,但是不会博弈论,也不会sg,暴力方法做。 题目描述:有两堆石头,现在A和B要比赛。他们对某个石头可以做这样的操作,在一堆里拿x个,在另一堆拿s*x个(s>=0)。 当某个人不能拿的时候就输了。而Alice是先手。 思路:我们先看(0,0)这种情况,这个时候A会输掉,也就是说(0,0)是后手胜。当我们有一个点能一次性到达(0,0)时,它就是先手胜的。然后我们就把所有(0,0)能到达的点存起来。然后又找到(0,0)不能到达的第一个点,这个时候这个点一定是后手胜的
2021-07-20 10:52:05
143
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人