![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
板子
_Rikka_
- v -
展开
-
kruskal板子
#include<iostream> #include<algorithm> using namespace std; typedef long long ll; const int Max = 1e6 + 5; struct node { int u, v, w; node(int a=0, int b=0, int c=0) { u = a, v = b, w = c; } bool operator <(node& a) { return w原创 2021-04-27 18:51:59 · 1722 阅读 · 0 评论 -
dijkstra板子
#include<iostream> #include<queue> #include<memory.h> using namespace std; typedef long long ll; const int Max = 1e6 + 5; struct node { int n, v;//n结点编号 v到节点的距离 node(int a, int b) { n = a, v = b; } bool operator <( const node&am原创 2021-04-27 18:34:00 · 140 阅读 · 0 评论 -
蓝桥杯 分考场(图染色问题)
问题描述 n个人参加某项特殊考试。 为了公平,要求任何两个认识的人不能分在同一个考场。 求是少需要分几个考场才能满足条件。 输入格式 第一行,一个整数n(1<n<100),表示参加考试的人数。 第二行,一个整数m,表示接下来有m行数据 以下m行每行的格式为:两个整数a,b,用空格分开 (1<=a,b<=n) 表示第a个人与第b个人认识。 输出格式 一行一个整数,表示最少分几个考场。 思路 DFS暴力回溯+剪枝。 大体思路是假设当前已经有n个考场,考场中已经放入了num原创 2021-04-17 23:04:03 · 246 阅读 · 0 评论 -
扩展欧几里得板子
ax+by=c,求出其中一组解x y int exgcd(int a,int b,int &x,int &y)//扩展欧几里得算法 { if(b==0) { x=1;y=0; return a; //到达递归边界开始向上一层返回 } int r=exgcd(b,a%b,x,y); int temp=y; //把x y变成上一层的 y=x-(a/b)*y; x=temp; return r;转载 2021-03-25 20:24:52 · 119 阅读 · 0 评论 -
线段树--概念+模板+入门题
引子 子问题–1 给出n个数,m次问询,每次问询给出一个范围l、r,求区间l–r的总和 很容易想到用前缀和可以解决 O(n) 子问题–2 给出n个数,m次修改,每次给出一个范围l、r和一个值k,将区间l—r的数全部+k,m次修改后,再问询1次求区间l–r的总和 也可以想到这用差分就能解决 O(n) 最后将这两个问题结合起来,给出n个数,m次操作,操作有两种一个是将区间l–r的值+k,一个是询问区间l–r的总和。 这个问题与之前不同的地方是,之前想要求一个范围只需处理一次数据算前缀和,然后数据不变,可以一原创 2021-03-10 15:06:09 · 1782 阅读 · 3 评论 -
P3374 【模板】树状数组 1和2(洛谷)
题目 Code: #include<iostream> #include<string> #include<memory.h> typedef long long ll; #define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) //#define int long long using namespace std; ll a, b, x, y, ans; struct node { ll l,原创 2021-03-08 23:58:27 · 101 阅读 · 0 评论 -
二分模板
第一个>=x的位置 l while (l <= r) { int mid = (l + r) / 2; if (lst[mid] < x) l = mid + 1; else r = mid - 1; } 最后一个=x的位置 l-1 while (l <= r) { int mid = (l + r) / 2; if (lst[mid] <= x) l = mid + 1; else r = mid - 1; } while(l<r) 如果为check成功 l=mid,e原创 2021-02-23 00:48:40 · 192 阅读 · 0 评论 -
逆元
参考于此篇博客:https://www.cnblogs.com/kongbursi-2292702937/p/10582258.html 逆元定义: 对于a*b≡1(mod m),b是a在模m下a的逆元。 首先对于同余符号≡,如 a≡b%m 表示的意思是a%m=b%m,a、b模m后余数相同。 逆元可以看作一个数的倒数 c * b≡1(mod m)(b为c的逆元) 可得(a/c)%m=(a*b)%m 推导过程:(a/c)%m=(a/c)*1%m=(a/c) * c * b%m=(a * b)%m 由费马原创 2021-02-10 19:48:04 · 1184 阅读 · 0 评论 -
埃拉托色尼筛法(素数筛)
列举大于等于2的整数,将其倍数划掉,往后遍历发现被划掉的直接略过,还没被划掉的则是质数(表示其不是前面任何一个数的倍数,也即没有除1和本身外的因子)。时间复杂度 O(NloglogN),空间 O(N). Code: int prim[Max], vis[Max], x = 0; //prim[x]第x个质数 void eratos(int n) { for (int i = 2;i <= n;i++) { if (!vis[i])prim[++x] = i; if (vi原创 2021-01-22 13:01:19 · 313 阅读 · 0 评论 -
树状数组模板
#define lowbit(x) (x&(-x)) int c[Max], n;//n为元素个数 void add(int x, int v)//单点给元素+v {for (int i = x;i <= n;i += lowbit(i))c[i] += v;} int que(int x)//询问前x元素的总和 { int ans = 0; for (int i = x;i != 0;i -= lowbit(i))ans += c[i]; return ans; } ...原创 2021-02-04 18:30:35 · 93 阅读 · 0 评论 -
组合数模板
证明过程可参考此篇博客https://www.cnblogs.com/liziran/p/6804803.html Code: ll f[Max]; ll qpow(ll a, ll b) { ll ans = 1, base = a; while (b) { if (b & 1) ans = ans * base % Mod; base = base * base % Mod; b >>= 1; } return ans; } void init() { f[0]原创 2020-12-17 18:28:14 · 248 阅读 · 0 评论