c++数据结构与算法
c++数据结构与算法(笔记)
sweetheart7-7
技术源于热爱 ---------------------- 学习改变命运,知识改变未来 ---------------------- Architect-Road
展开
-
三分法(整数/浮点数 三分法)
说明:三分法可以用来查找凸函数的最大(小)值。如果 lmid 和 rmid 在最大(小)值的同一侧:由于单调性,一定是二者中较大(小)的那个离最值近一些,较远的那个点对应的区间不可能包含最值,所以可以舍弃。如果在两侧:由于最值在二者中间,我们舍弃两侧的一个区间后,也不会影响最值,所以可以舍弃。画图就可以看出来画图就可以看出来画图就可以看出来整数三分模板int l = 1,r = 100;while(l < r) { int lmid = l + (r - l) / 3; //原创 2021-08-29 23:25:23 · 2838 阅读 · 2 评论 -
【树上倍增】最近公共祖先(LCA)
模版题:https://www.luogu.com.cn/problem/P3379视频讲解1视频讲解2某佬题解思路:设当前节点为 xxx,fa[x][i]fa[x][i]fa[x][i] 代表 xxx 的第 2i2^i2i 个祖先节点,显然 fa[x][0]fa[x][0]fa[x][0] 代表 xxx 的直接父节点,而 fa[x][i]fa[x][i]fa[x][i] = fa[fa[x][i−1]][i−1]fa[fa[x][i-1]][i-1]fa[fa[x][i−1]][i−1]原创 2021-08-25 20:05:56 · 208 阅读 · 2 评论 -
扩展欧几里得求同余方程组
题目给定x三 mi (mod ai),求一个最小的非负整数 x即x 三 m1 (mod a1)x三 m2 (mod a2)…x三 mk (mod ak)对于线性同余方程组,可以用中国剩余定理来解,但是要求m1,m2,…,mk两两互质所以此题不能用中国剩余定理!先解第1、2个式子a1 * k1 + m1 = xa2 * k2 + m2 = x联立得:a1 * k1 - a2 * k2 = m2 - m1 (1)可以利用exgcd解方程 a1 * k1 - a2 * k2 = gc原创 2021-08-11 15:34:10 · 397 阅读 · 0 评论 -
线段树、树状数组、ST表
#include <iostream>using namespace std;const int n = 6;int arr[] = {1, 3, 5, 7, 9, 11};int tree[n * 4 + 1];/** * * @param node tree中的下标 * @param start arr中的下标 表示区间 [start, end] * @param end */void buildTree(int node, int start...原创 2021-07-23 12:01:35 · 346 阅读 · 1 评论 -
贪心/动归问题
快速渡河问题https://vjudge.net/problem/POJ-1700此问题可能有两种解,求这两个解的min即可第一种是前两个出发,1返回,最后两名出发,2返回第二种是1和最后一个出发,1返回,1又和当前最后一个出发,1返回。。。。(即每次由1带领)#include <cstdio>#include <algorithm>using namespace std;int a[1005];void fn(int n){ int left = n原创 2021-07-21 17:38:24 · 190 阅读 · 1 评论 -
单调栈与单调队列
单调栈板子题https://www.luogu.com.cn/problem/P5788#include <iostream>#include <stack>using namespace std;typedef long long ll;int a[3000100], f[3000100];stack<ll> st;int main(){ ll n; scanf("%lld", &n); for (int .原创 2021-07-21 12:49:41 · 166 阅读 · 0 评论 -
递推/递归问题
#include <cstdio>/* * 假设我们有8种不同面值的硬币{1,2,5,10,20,50,100,200},用这些硬币组合构成一个给定的数值n。 * 例如n=200,那么一种可能的组合方式为:200 = 3*1 + 1*2 + 1*5 + 2*20 + 1*50 + 1*100. * 问总共有多少种可能的组合方式? */int coins[4] = {1,5,10,15};// n是当前剩余金币数,cur是能取的最大额度的indexint fn(int n,in原创 2021-07-16 11:22:18 · 184 阅读 · 0 评论 -
——数论相关
扩展欧几里得#include <cstdio>typedef long long ll;ll x, y;// 扩展欧几里得// x,y 是ax + by = gcd(a, b)的解ll ext_gcd(ll a, ll b){ if(b == 0){ x = 1; y = 0; return a; } ll res = ext_gcd(b, a % b); ll x1 ...原创 2021-07-14 15:51:07 · 230 阅读 · 0 评论 -
Nim问题
将每堆的数表示为二进制形式,然后将所有数异或起来,如果先手时,异或的结果为非0,则必赢(调整某个二进制的某几位,使其变为0),为0时必输。#include <cstdio>int a[] = {5, 10, 15};// nim游戏bool solve(){ int res = 0; int n = sizeof(a) / sizeof(a[0]); for (int i = 0; i < n; ++i) { res ^= a[i]; .原创 2021-07-13 15:54:15 · 427 阅读 · 0 评论 -
三进制解决天平称重
#include <cstdio>#include <vector>#include <cmath>using namespace std;vector<char> s;vector<int> list;int n;void toThree(int n){ int m; while (n>0){ m = n % 3; n /= 3; s.push_back(m原创 2021-07-13 12:05:59 · 289 阅读 · 0 评论 -
next数组的应用
https://vjudge.net/problem/HDU-1358#include <cstdio>using namespace std;void nextArr(char * s1, int n, int next[]){ next[0] = -1; next[1] = 0; int j = 1; int k = next[j]; while (j < n){ if(k == -1 || s1[k]== s1[j原创 2021-07-12 18:01:54 · 220 阅读 · 0 评论 -
尺取法(字符串)
#include <cstdio>#include <cstring>const int inf = (1 << 30) - 1;// 尺取法// 求字符串的子串中恰好含有2个h,1个i,1个o的最短子串长度bool check(char w[], int i, int j){ int c1 = 0,c2 = 0,c3 = 0; for (int k = i; k <= j; ++k) { if(w[k] == 'h')原创 2021-07-12 17:11:40 · 200 阅读 · 0 评论 -
字符匹配之KMP
#include <cstdio>#include <string>using namespace std;void nextArr(int next[], string s){ int n = s.size(); if(n == 0){ return; } // 初始化数组[0,1]位置的值 next[0] = -1; if(n == 1){ return; } next[原创 2021-07-11 16:04:17 · 113 阅读 · 0 评论 -
字符串匹配之RabinKarp
#include <cstdio>#include <cmath>using namespace std;typedef unsigned long long ull;const int dd = 31;ull hashValue(char chs[], int i, int j){ ull sum = 0; for (int k = i; k <= j; ++k) { sum = (sum) * dd + chs[k];原创 2021-07-11 10:18:49 · 159 阅读 · 0 评论 -
子数组与子矩阵的最大累加和
#include <iostream>#include <cstdio>using namespace std;// 最大子数组int findDp(int a[], int n){ if(n==0){ return 0; } int max = a[0], sum = 0, ind = -1; for (int i = 0; i < n; ++i) { if(sum > 0){原创 2021-07-10 17:10:46 · 111 阅读 · 0 评论