算法
文章平均质量分 92
.
1emerald
wwwwwww
展开
-
高斯消元模板
SPOJ-DETER3高斯消元对常数取模模板给出一个矩阵求行列式#include <iostream>#include <algorithm>#include <string.h>using namespace std;const int inf = 0x3f3f3f3f;const int maxn = 205;#define ll lo...原创 2019-08-11 23:26:34 · 159 阅读 · 0 评论 -
扩展欧几里得例题(luogu_1082)
luo gu由a∗x≡1(mod  b)a*x \equiv1 (\mod b)a∗x≡1(modb) 推导为扩展欧几里得->a∗xmod  b==1mod  ba*x \mod b == 1 \mod ba∗xmodb...原创 2019-05-22 14:55:53 · 571 阅读 · 0 评论 -
扩展欧几里得算法
最大公约数由gcd(a,b)=gcd(b,a%b)gcd(a,b) = gcd(b,a\%b)gcd(a,b)=gcd(b,a%b) 辗转相除法得到,贝祖定理存在整数a,b ,那么一定存在整数x,y,使得 ax+by=gcd(a,b)ax+by = gcd(a,b)ax+by=gcd(a,b)可以判断ax+by=gcd(a,b)ax + by = gcd(a,b)ax+by=gcd(a,b...原创 2019-05-22 13:59:31 · 151 阅读 · 0 评论 -
欧拉函数例题(poj3090)
欧拉函数例题除了(1,0)(1,1)(0,1)三个点的,发现其余可视点gcd(x,y)=1发现关于(1,1)这条线所有点都是对称的,不妨取下半部分,x<y,此时1<=x<y<=n,这就转化到求与y互质数x的个数,y有多个选择,且y>=2,最后答案从2~N累加起来求欧拉函数值,就是分解质因数的过程,1.试除法分解质因数累加和,但是只能求出 υ(n)\ups...原创 2019-05-02 10:21:22 · 967 阅读 · 0 评论 -
欧拉函数性质及推导
互质gcd(a,b) = 1 则a,b互质,gcd(a,b,c) = 1 则两两互质gcd(a,b) = gcd(a,c) = gcd(b,c) = 1欧拉函数定义:[1,N)中与N互质数的个数被称为欧拉函数,记作 υ(N)\upsilon(N)υ(N)由算数基本定理知:N=p1c1∗p2c2∗p3c3∗……∗piciN = p_1^{c_1} * p_2^{c_2}*p_3^{...原创 2019-05-01 20:57:21 · 1452 阅读 · 0 评论 -
质数筛
1不是质数一个数只能被1和自己整除的数叫做质数数N,如果不是质数,那么N一定有一个<=sqrt(N)<=sqrt(N)<=sqrt(N)的约数试除法,一个一个试E氏筛任意一个数N的倍数一定不是质数,2N,3N……求 1~N之间的质数const int maxn =1e6;int prime[maxn];for (int i=2;i&l...原创 2019-04-26 22:35:58 · 155 阅读 · 0 评论 -
快速幂+快速乘
快速幂+快速乘求 (ab) mod p(a^b)\bmod p(ab)modp 1<=a,b,p<=1091<=a,b,p<=10^91<=a,b,p<=109 快速幂直接过当 1<=a,b,p<=10181<...原创 2019-04-13 21:40:32 · 116 阅读 · 0 评论 -
lowbit()
lowbit 运算定义:自低位的1及其后面所有位为0构成的数值例如:n=10= (1010)2(1010)_2(1010)2 ans=10推导:设 n>0 且k位为1,第0~k-1为都为0先取反在+1包括最高位n1=10010000n2=01101111n3=01110000an=00010000 ans=n&(~n+1)看数值大小还是...原创 2019-04-07 19:45:21 · 418 阅读 · 0 评论 -
位运算基础
位运算时间 2019年4月7日 星期日 17:22:41左移1<<n=2n1<<n=2^n1<<n=2n n<<1=2nn<<1=2nn<<1=2n很好理解右移1>>n1>>n1>&...原创 2019-04-07 17:24:15 · 71 阅读 · 0 评论 -
汉诺塔问题理解
汉诺塔问题A,B,C三个柱子,A盘子上有64个盘子,盘子按照从小到大堆放,将A中所有盘子移到C柱,每次只能移一个盘子,小盘子只能放在大盘子上面,问最少移动几次能将A柱前n个盘子移动到C盘?属于递归问题n=1 移动一次n=2 移动三次三次分别包括A堆前(n-1)个移到B堆A堆第n个移动到C堆B堆的(n-1)个移动到C堆分解(n-1)个盘子的移动需要的次数n=3 3...原创 2019-04-04 19:55:52 · 188 阅读 · 0 评论 -
POJ 2887 块状链表
块状链表练手POJ 2887查询且需要插入第一个字符串长度不超过 1000000分成 (1000000)=1000\sqrt(1000000) = 1000(1000000)=1000个块忘记初始化,注意插入的位置,和题目要求的位置每次记得维护插入或者删除后 接触块 的大小防止退化//#include <bits/stdc++.h>#include ...原创 2019-11-24 01:34:25 · 176 阅读 · 0 评论 -
块状链表
块状链表原理很好理解,实现要注意细节转载博客 图示数组来模拟链表注意 块的编号和块中数组的下标belong[]保证编号不重复例题 Luogu 本文编辑器 belong[]的作用其实相当于记录块的编号 当块 (消失or合并) 时,下一次生成的块就用上一次消失块的编号,首次初始化为不同的就行了避免块状链表退化,在删除或者插入后维护2端的块,根据块的大小来决定是 合并还...原创 2019-11-21 17:53:56 · 170 阅读 · 0 评论 -
笛卡尔树
笛卡尔树一种二叉树,每个节点由 键值二元组 (k,w) 组成性质数列中每个元素对应树中某个唯一节点,树节点也对应于数列中某个唯一元素中序遍历笛卡尔树得到原数列任意树节点的左子树中的节点对应的数组元素下标小于该节点对应数组元素下标同理, 右子树中的节点对应的数组元素下标大于该节点对应数组的元素下标由于具有堆的性质, 任意节点对应的数值 大于or小于 左or右子树内任...原创 2019-11-24 13:07:04 · 127 阅读 · 0 评论 -
非旋转Treap
非旋转Treap通过节点的优先级来维护树的平衡, 下面是普通非旋转Treap (弱平衡,性质Treap是笛卡尔树的一种,只是 节点优先级是随机的Tree+HeapTree+HeapTree+Heap: 二叉搜索树+堆的性质2个核心操作 分裂+合并分裂 split按照 节点权值分裂或者值的排名分裂split_valsplit\_valsplit_val将一颗tre...原创 2019-12-04 12:00:11 · 293 阅读 · 0 评论 -
Luogu P3165 Splay区间翻转
脑残记录:这周末2天只做了一道平衡树题目(2天被一道题限住),发现自己的很多问题,学了算法及其性质 但是总是做不出来题目,很难利用学过的性质, 同样这种情况再次发生在今天没有运用的能力,思维太差???反思:自己对算法题目的思维能力 还是不行 ( ???一定要想办法改变??? )要对自己的学过的算法的流程 好好走一遍,Splay 练习 Luogu P3...原创 2019-12-01 20:48:35 · 142 阅读 · 0 评论 -
Luogu P2234+P2286 (Splay性质
Luogu P2234记住性质才能更好利用: Splay的查询前驱和后继操作tree.ins(val)tree.ins(val)tree.ins(val)插入后会SplaySplaySplay到根节点#include <bits/stdc++.h>using namespace std;using ll = long long;const int maxn = 1...原创 2019-11-28 22:40:08 · 134 阅读 · 0 评论 -
Splay
从oi-wiki学来及自己总结Splay树用SplaySplaySplay维护二叉查找树节点维护的信息roottotfa[i]ch[i][0/1]val[i]cnt[i]size[i]根节点编号节点个数节点i的父亲节点节点i的左右儿子编号节点i存的值节点i存的值出现的次数节点i子树的大小旋转操作本质: 将树上某个节点上移一个位置旋...原创 2019-11-26 13:43:47 · 96 阅读 · 0 评论 -
Splay 区间翻转(文艺平衡树)
Splay树 区间翻转 操作将数组的下标存到树中, 题目给出逆转的区间下标,那么在树中操作下标利用子树都是存的是数组中连续的一段,(类似线段树)翻转区间[l,r]在二叉查找树中对 数组区间翻转 只需要 更改子树中每一个节点左右的左右子树如何将整个区间(搬离到根节点附近去) ? 利用SplaySplaySplay的性质: rotate后中序遍历保持不变将l−...原创 2019-11-26 12:35:44 · 621 阅读 · 0 评论 -
替罪羊树
替罪羊树α\alphaα权重平衡认为一棵树XXX是平衡的当且仅当它每一棵子树满足下列条件:size(x.left)≤α∗size(x)size(x.left) \le \alpha * size(x)size(x.left)≤α∗size(x)size(x.right)≤α∗size(x)size(x.right)\le \alpha * size(x)size(x.right)≤α∗...原创 2019-12-02 21:35:16 · 138 阅读 · 0 评论 -
线段树区间加法+乘法
区间加法+区间乘法(2标记 Luogu一开始只想到了开2个标记,但是看了题解才知道标记下传是有优先级的按题目数据来如果是先+后x: val=(val+b)∗k=val∗k+b∗kval = (val + b) * k = val*k+b*kval=(val+b)∗k=val∗k+b∗k先x后+ : val=val∗k+bval = val * k + bval=val∗k+...原创 2019-12-15 17:46:43 · 1313 阅读 · 0 评论 -
差分数组 or 线段树
提交地址描述:bbq的工作是管理学校的社团活动,具体来说是为每个社团活动分配教室。要把有限的教室合理安排给这些社团,是不容易的。每个社团活动用k, t1, t2来表示:该社团活动在第t1天~第t2天内需要k个教室(包括t1,t2)。bbq总是按社团活动申请的先后顺序分配教室,如果某一天剩余的教室数量不够满足某社团的要求,则停止教室的分配。bbq需要告知该社团,他们的该次社团活动无法进行。...原创 2019-10-30 20:27:06 · 371 阅读 · 2 评论 -
HDU_3642_扫描线求覆盖3次的体积(线段树)
HDU 3642扫描线模板的基础上增加覆盖次数题意至少有2个以上不同地点才存在宝藏.即3个以上的空间立体交叉覆盖出的体积,覆盖3次及以上x y z包括整个库,意思就是给出顶点,观察样例知道是左上和右下的坐标z<=500.那么扫描法求出平面的面积,在处理题目给出的每一层.求的体积思路x用来离散化后作为横轴建线段树,z轴存下来枚举每一个层.x轴坐标离散化后要去重,z轴坐...原创 2019-08-07 23:05:24 · 154 阅读 · 0 评论 -
HDU_1255_扫描线求二次覆盖的面积(线段树)
HDU 1255在求所有覆盖面积的前提下,求出矩形被覆盖超过2次的区域面积线段数维护一个len2,表示覆盖>=2次的长度,len1表示覆盖>=1次的长度add代表区间覆盖的次数在pushup中,每次add被修改时和update结束时来维护线段树的值先维护len1,在len1的基础上维护len2在此之间将浮点坐标存下来(离散化),然后排序并且去重,这样每一个浮点坐标都...原创 2019-08-07 18:24:29 · 139 阅读 · 0 评论 -
HDU_1828_扫描线求周长(线段树维护)
HDU 1828从下到上扫一遍如何求出横边与竖边的长度?横边用一个变量存上一次区间横边覆盖总长度.这一次的区间横边覆盖总长度-上一次区间横边覆盖总长度=此次扫描的横边周长,取绝对值(可能为负数)竖边线段树维护每个区间覆盖横边的数量(矩形的个数),一个矩形有2个竖边,竖边的长度=下一条横边高度-此条横边高度,所以竖边的周长:2*高度*矩形个数线段树为了维护一个区间被覆...原创 2019-08-07 13:37:31 · 230 阅读 · 0 评论 -
HDU_1542_扫描线求面积(线段树维护)
HDU 1542一条竖直直线从左到右(反向也行)扫描,那么将扫描出来的直线的x坐标坐标离散化,然后用线段树维护x轴的覆盖区间.如果一条横着直线从下到上(反向也行)扫描,将扫描出来的y坐标离散化,线段树维护y轴的覆盖区间此题从左到右扫,将x坐标离散化,建树将一个矩形的2条边标记为上边1和下边-1,用线段树维护时不需要延迟标记,因为成对出现,下一次对应边出现就会消去此次覆盖.但是线段树端点...原创 2019-08-05 18:00:59 · 98 阅读 · 0 评论 -
HDU_4578_线段树多延迟标记
HDU 4578此题有2种延迟标记题意:1 x y val表示在区间[x,y]的每个值增加val2 x y val表示在区间[x,y]每个值乘val3 x y val表示将区间[x,y]上的每个值都修改为val4 x y val表示查询区间[x,y]上的每个值的p次幂的和每个值看做ax+b,那么给线段树开2个延迟标记,add用来加(代表b)mult表示乘(代表a)区...原创 2019-08-05 13:14:45 · 105 阅读 · 0 评论 -
HDU_4614_线段树+端点查找(通过数量)
HDU 4614从A开始插F朵花.插满为止,瓶子少了则剩下的花扔掉,即统计A后面有多少个0,如果0的个数ans<=0,说明一个也花一个也插不了,tmp表示A前面有多少0如果ans>0,找到x后的第一个0用来插花判断要插入的花的数量和ans的数量,若要插的数量>ans,那么最后一个插花的地方是第(ans+tmp)个0,否则是第(y+tmp)个0插花就是把区...原创 2019-08-04 15:36:34 · 123 阅读 · 0 评论 -
HDU_3974_dfs+线段树
HDU 3974题意是对以点作为根节点的子树进行操作.恰好可以使用线段树但是要将每个员工这棵有根树转化成线性区间开一个标记数组找到根用dfs转化然后.在对应的区间使用线段树区间修改模板记得cnt = 0,否则RE#include <iostream>#include <string.h>#include <vector>using name...原创 2019-08-04 10:46:41 · 158 阅读 · 0 评论 -
HDU_1540_线段树区间连续维护
HDU 1540求包括该点在内左右边的连续长度线段树维护3个值.len:该点的区间中最大连续长度.leftlen:该点区间左端的最大连续长度rightlen:该点区间右端的最大连续长度线段树区间连续长度的维护:父节点的区间连续长度是左子树区间长度、右子树区间长度、左子树右端+右子树左端的区间长度3着的中最大值父节点左端连续长度=左子树左端连续长度.如果左子树区间连续,那么还要...原创 2019-08-03 19:33:15 · 103 阅读 · 0 评论 -
HDU_4027_线段树区间开方
HDU 4027剪枝:开方等于7次,值等1以为每个点的值不一样,所以开方是要每个点开方,不能延迟标记long long存sum看别人博客:x居然可以>y#include <iostream>#include <string.h>#include <cmath> using namespace std;const int maxn = ...原创 2019-08-03 11:52:24 · 139 阅读 · 0 评论 -
POJ_3264_线段树区间最值
POJ 3264线段树每个节点区间中区间上的最大值和最小值询问时找到符合的区间,不符合就二分,然后更新合并区间的最大最小值#include <iostream>#include <string.h>#include <algorithm>using namespace std;const int maxn = 5e4+5;struct seg...原创 2019-08-03 10:31:23 · 108 阅读 · 0 评论 -
ZOJ_1610_思维+线段树
zoj 1610思维:线段区间[1,8000],颜色区间[0,8000]记录输入.找每个点的最后一个覆盖点就行了然后算多少个颜色段#include <iostream>#include <string.h>using namespace std;const int maxn = 1e4;int n;int e[maxn][3];int co...原创 2019-08-03 09:35:24 · 141 阅读 · 0 评论 -
HDU _1698_区间修改+思维
背景:在一段区间内将数组所有值改变为另一值.延迟标记延迟标记还可以用在 将区间内数组所有的值增加或者减少一个值HDU 1698建个空线段树更新所有的延迟标记为1change()的原理是:找到所有唯一的一个区间在线段树上的点.然后标记查询要递归遍历到所有的节点#include <iostream>using namespace std;const int max...原创 2019-08-02 17:08:26 · 86 阅读 · 0 评论 -
POJ_3468_线段树延迟标记
POJ 3468当需要区间修改而不是单点修改时.如果仍用单点修改来修改区间的所有点.必超时若修改区间为[l,r],且覆盖节点p的[e[p].left,e[p].right].为了避免修改子树所有节点(可能修改了后都用不到,浪费时间).修改该节点的区间值,且标记,当我们需要递归到子树时,在来一层一层更新#include <iostream>#include <stri...原创 2019-07-31 10:25:42 · 91 阅读 · 0 评论 -
HDU_1754_线段树
HDU 1754求区间最值.线段树维护#include <iostream>#include <string.h>using namespace std;const int maxn = 2e5+5;struct segementTree{ int left,right; int div;} e[4*maxn];int a[maxn];int n...原创 2019-07-30 22:31:19 · 69 阅读 · 0 评论 -
线段树+lazy标记
线段树基于分治思想的二叉树,用于区间信息统计特点:每个节点代表区间唯一根节点,也就是全部区间叶节点是长度为1的子区间,也就是所代表数组上的一个点存线段树的结构体数组长度一般是 线段树所代表数组长度的4倍.const int maxn = 1e3;struct segmentTree { int l,r; int dat;} e[4 * maxn];...原创 2019-07-17 16:22:23 · 169 阅读 · 0 评论 -
trie异或最大值2道例题
The XOR Largest Pair题目:在给定的N个整数中选出2个进行^运算,得到结果最大的是多少?思路将N个正数按照二进制位(从高位到低位)存到字典树中,求^ 的最大值,意思是每一位都尽量走反方向的,本来该位为0,树中有1就走1,没有则继续走0,这样求得的结果一定是最接近^的最大值,可以变插入变询问^的最大值,然后更新ans,因为两两相互查询,前面的插入的数没有和后面的数比,...原创 2019-04-26 21:51:35 · 297 阅读 · 0 评论 -
trie数组模拟
自闭数组模拟trie1.trie存的是字符串,从s[0],开始存二维数组,第一维记录节点的编号,第二维的索引代表字符,数组值存 节点编号(26个指针,指向下一个节点)const int maxn=1e6;int tot = 0;//全局变量,记录所以节点的数量int endp[maxn];//每个节点编号都可能作为一个字符串的末尾,void inserts(string s){...原创 2019-04-23 00:13:19 · 421 阅读 · 0 评论 -
ZOJ_3261_逆并查集
ZOJ 3261 逆并查集思路简单代码繁琐一直wa调了一天,真的菜因为并查集没有摧毁边的操作,那我们不妨先合并所有边中 不会被摧毁的边,那么就需要我们先保存所有的边,(这里太繁琐容易出错)开一个数组记录每个点的值,因为要找值最大 或者 值相同但点最小的点,在合并的时候根据这个来合并,值小的指向值大的,(值相同时,大点指向小点)这里用了一个技巧就是 map<pair<int,i...原创 2019-05-19 10:30:50 · 127 阅读 · 0 评论 -
HDU_1272_(并查集)
HDU 1272 无向图用并查集判断是否成环.坑点:仅仅考虑了根节点相同(有回路)的情况,而忽略了有多个连通分量,也是不满足 任意两个房间有且仅有一条路径相同#include <iostream>#include <string.h>using namespace std;const int maxn = 1e5+10;int pre[maxn];i...原创 2019-05-17 22:15:36 · 123 阅读 · 0 评论