![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM
文章平均质量分 55
ACM
明月千里赴迢遥
这个作者很懒,什么都没留下…
展开
-
亚特兰蒂斯(离散化的扫描线)题解笔记
AcWing 247. 亚特兰蒂斯(对代码进行详细解释) - AcWing从扫描线到离散化难免令人有些费解,下面写一些针对离散化映射后build和pushup的思考坐标轴上是一些下标经过排序后从小到大的离散的点,每两个点构成一个线段d[i],线段树实际上存储的是一个个线段,就像没离散化之前的扫描线一样,之后按离散化之前的套路处理即可...原创 2022-03-27 11:35:13 · 231 阅读 · 0 评论 -
线段树简单笔记
一 经典线段树结构:权值为[L,R]的区间和int L,R,sum;操作1 单点修改O(logn)递归找到相应叶子节点,回溯时修改父节点(两个儿子总和)操作2 区间查询O(logn)左右两边递归,递归边界为左右两边都被包含,累加其权值最坏耗时4logn区间修改需要懒标记,蓝桥杯一般考不到,即使考到也是特殊区间修改,用不到函数1 pushup 用子节点信息更新当前节点信息2 build 在一段区间上初始化线段树3 modify 单点修改4 query 区间查询静态链表存储,空原创 2022-03-20 12:39:28 · 717 阅读 · 0 评论 -
树状数组简单总结(原理见以往帖子)
树状数组:快速(动态)求前缀和在线算法(支持修改)O(logn) 1:给某个位置上的数加上一个增量(修改某个元素)2:求某个前缀和即:单点修改,区间查询(sum(r)-sum(l-1))树状数组只能支持这俩问题,别的问题都得通过转化才能解决比如区间修改,单点查询需要利用差分转化为区间修改记树状数组为C[x],定义:C[x]=(x-lowbit[x],x],即x-lowbit[x]+1~x,奇数为其本身lowbit[x]=x&-x,含义是2^k,k为x...原创 2022-03-15 00:12:02 · 491 阅读 · 0 评论 -
求至少加上几个字符使之回文
等价于求至少删除几个字符使之回文等价于总长度减去最长回文子序列的长度注意:不能用马拉车算法,马拉车求的是最长回文字串,是连续的,而子序列不必连续原创 2022-03-11 12:11:38 · 112 阅读 · 0 评论 -
背包九讲练习篇(更新中)
背包问题专栏原创 2022-03-06 12:21:46 · 270 阅读 · 0 评论 -
以洛谷P1091 合唱队形初探动态规划DP
目录一 题目描述二 题目拆解三 子问题求解Q1:如何求dpup[i]——删除元素数最小的递增子序列Q2:如何求dpdown[i]——删除元素数最小的递减子序列四 AC代码一 题目描述P1091 [NOIP2004 提高组] 合唱队形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)入门果然耗时间,一道简单的DP却花了我两三个小时 ...原创 2022-01-17 01:11:43 · 351 阅读 · 0 评论 -
并查集判断成环 HDU 1272
加入边前判断两个节点是否根节点相同,如果相同那么成环,如果不同合并他们比如1-2,1-3,2-3,加入2-3时2和3已经同属一个并查集了,成环例题 HDU 1272原创 2021-09-09 16:08:54 · 277 阅读 · 0 评论 -
中国剩余定理例题 POJ1006
中国剩余定理模板的返回值是最小值,最小值加上公倍数就是通解,求最小的大于day的通解即为所求中国剩余定理#include<cstdio>//http://poj.org/problem?id=1006#include<iostream>using namespace std;typedef long long ll;ll exgcd(ll a,ll b,ll &x,ll &y) { //扩展欧几里得算法 ax+by=c 求解a,b if(!b) {原创 2021-09-09 15:09:19 · 282 阅读 · 0 评论 -
HDU 3790 最短路径最小花费
迪杰斯特拉总结相比于普通迪杰斯特拉,我们要做的变动是:优先队列排序 friend bool operator < (const node &f1, const node &f2) { if(f1.w!=f2.w) return f1.w > f2.w; else return f1.p>f2.p; }迪杰斯特拉节点更新if (dis[end] > dis[start] + edge[i].w) { dis[end] =原创 2021-09-09 13:22:49 · 188 阅读 · 0 评论 -
C++ 给两直线上四个点求交点
理论代码来源Point getIntersectPoint(Line a, Line b) { double a1 = a.s.y - a.e.y, b1 = a.e.x - a.s.x, c1 = a.s.x * a.e.y - a.e.x * a.s.y; double a2 = b.s.y - b.e.y, b2 = b.e.x - b.s.x, c2 = b.s.x * b.e.y - b.e.x * b.s.y; return Point((c1*b2-c2*b1)/(a2*转载 2021-09-06 03:17:45 · 1170 阅读 · 0 评论 -
POJ 3608 凸包最小间距
下面有很多没用到的函数,所以请从主函数开始看计算几何详解请参考我的博客计算几何基础#include<cstdio> //计算几何基础 代码 https://blog.csdn.net/qq_44691917/article/details/104686146 #include<iostream>//理论https://www.luogu.com.cn/blog/wjyyy/geometry1 #include<cmath>//自己写的总结 https://m原创 2021-09-04 22:37:47 · 119 阅读 · 0 评论 -
HDU 5251
这题老早就想A了,就因为这个才想学旋转卡壳,但是折磨了我好久,今天终于过了哈哈哈凸包及旋转卡壳请参考我的这篇博客https://mp.csdn.net/mp_blog/creation/editor/120031148这题跟模板不同的是题目要求输出整数,而且是四舍五入的!一开始没注意到吃了大亏,不过不吃那亏也注意不到我模板写错了……因祸得福哈哈模板和原理都在上篇博客中讲述的很清楚了,下面是模板的运用AC代码#include<cstdio> //计算几何基础 代码 htt原创 2021-09-04 06:20:56 · 155 阅读 · 0 评论 -
计算几何基础(施工未完)
目录总模板点和向量部分点和线部分总模板#include<cstdio> //计算几何基础 代码 https://blog.csdn.net/qq_44691917/article/details/104686146 #include<iostream>//理论https://www.luogu.com.cn/blog/wjyyy/geometry1 #include<cmath>using namespace std;#define Vect原创 2021-09-01 02:48:54 · 604 阅读 · 1 评论 -
结构体初始化:构造函数 二义性
struct Node{ int r,c,dist; Node(){} Node(int r,int c):r(r),c(c){} Node(int r,int c,int dist):r(r),c(c),dist(dist){}};第三行是为了能够不经初始化就能定义结构体变量转载 2021-08-31 18:36:07 · 187 阅读 · 0 评论 -
POJ 2182 普通权值线段树求第k小
模板写错了,研究了一个多小时,哭死int kth(int root,int start,int end,int k) {//查询第k小值是多少 if(start==end) return start; int mid=(start+end)>>1,s1=tree[lson],s2=tree[rson]; if(k<=s1) return kth(lson,start,mid,k);//向左子树搜索 else return kth(rson,mid+1,end,k-原创 2021-08-31 03:10:32 · 371 阅读 · 0 评论 -
求组合数的各种方法 (Lacus等) (理论待更新,目前只有模板)
理论待更新,今天更完Lacus定理注意!如果m%p>n%p,那么C(n%p,m%p,p)=0 也就是下标小于上标 结果也就是0了 这一点务必要注意#include<cstdio>//求单个组合数 卢卡斯定理 n<=1e18 m<=1e18 p为素数但比较小! p<=1e4 注意!如果m%p>n%p,那么C(n%p,m%p,p)=0 也就是下标小于上标 结果也就是0了 这一点务必要注意 #include<string.h>//易错:计算时.原创 2021-08-30 06:13:15 · 278 阅读 · 0 评论 -
莫比乌斯反演
https://blog.csdn.net/tomandjake_/article/details/81083703上面这篇文章讲得很好下面我对模板做一些分析int mu[maxn], vis[maxn];int primes[maxn], cnt;void get_mu() { memset(vis, 0, sizeof(vis)); memset(mu, 0, sizeof(mu)); cnt = 0; mu[1] = 1; for (int i = 2; i <= ma转载 2021-08-29 03:40:25 · 87 阅读 · 0 评论 -
扩展欧几里得 逆元 逆元打表
参考文献逆元打表扩展欧几里得+求单个逆元原理详阅,不再赘述typedef long long ll;ll exgcd(ll a,ll b,ll &x,ll &y){//扩展欧几里得算法 ax+by=c 求解a,b if(!b){ x=1,y=0; return a; } ll ans=exgcd(b,a%b,x,y); ll temp=x; x=y; y=temp-a/b*y; re原创 2021-08-29 02:38:33 · 133 阅读 · 0 评论 -
中国剩余定理(孙子定理)
参考文献感谢武大佬的PPT和精彩讲解模板(有一处错误)扩展欧几里得算法题意:人自出生起就有体力,情感和智力三个生理周期,分别为23,28和33天。一个周期内有一天为峰值,在这一天,人在对应的方面(体力,情感或智力)表现最好。通常这三个周期的峰值不会是同一天。现在给出三个日期,分别对应于体力,情感,智力出现峰值的日期。然后再给出一个起始日期,要求从这一天开始,算出最少再过多少天后三个峰值同时出现。分析: 首先我们要知道,任意两个峰值之间一定相距整数倍的周期。假设一年的第N天达到峰值,则转载 2021-08-29 01:53:57 · 806 阅读 · 0 评论 -
二分乘法a*b%m 解决a*b远超int
二分乘法主要是解决乘法的结果远超int范围,但需要的结果有取余的乘法运算对于a*b%m来说,如果b为奇数,ans+a,把b变为偶数如果b为偶数,我们令b减半,a翻倍类似快速幂的思想ll multi(ll a,ll b,ll m){//a*b%m 解决乘法的结果远超int范围,但需要的结果有取余的乘法运算 ll ans=0; a%=m; while(b){ if(b&1)//b为奇数时变偶数 ans=(ans+a)%m,原创 2021-08-29 00:48:34 · 280 阅读 · 0 评论 -
素数筛 欧拉函数
参考文献特别鸣谢武大佬的PPT素数筛素数及其相关定理一、素数定义 基本概念素数又称质数,是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。 易错点1不是质数,写题要注意出题人出0,1卡你,质数大于1唯一分解定理一个数n肯定能被分解成 n=p1^a1 * p2^a2 . . .*pn^an(p是素因子,a是素因子的个数)因为一个数肯定是由合数和质数构成的,合数又可以分解成质数和合数,最后递归下去就会变成质数的乘积最后化成了质数相乘的形式二、素数的原创 2021-08-27 19:39:37 · 593 阅读 · 0 评论 -
哈密顿图 Dirac 竞赛图
理论https://blog.csdn.net/qq_41848675/article/details/99686010目录Dirac竞赛图Dirac时间复杂度O(N^2)分析模板的63~71时间复杂度n^2其他的都是n,遵循加法规则,所以时间复杂度O(N^2)下面是我做的一些配图S和T不相邻时相当于T和Vi+1部分颠倒找到新点j时(T代表终点,而不是哈密顿数组里的t) 方向是哈密顿数组下标增大的方向 j是新的终点,也是新的t,可以用来拓展新点上图也可原创 2021-08-16 00:41:07 · 170 阅读 · 0 评论 -
Kurskal算法求最小生成树 POJ 1751
时间复杂度mlogm 先给每条边按边长排序,然后每次都选取最小的边,用并查集判断他们是否联通,若不连通则相连 (否则连接后成环) ,连成n-1条边后退出算法适用于稀疏图,prim适用于稠密图模板#include<cstdio>//kurskal算法 时间复杂度mlogm 先给每条边按边长排序,然后每次都选取最小的边,用并查集判断他们是否联通,若不连通则相连 (否则连接后成环) #include<algorithm>//适用于稀疏图,prim适用于稠密图 using n.原创 2021-08-13 16:43:34 · 83 阅读 · 0 评论 -
Prim算法求最小生成树
求总权值例题思想类似迪杰斯特拉算法,贪心,两边之和大于第三边不过权值可以是负数写题的时候数组一定要开大,开大,开大!#include<cstdio>//优化后外层循环为n,内层循环1为优先队列push的logn,2一共为边数m乘以push的logn ,时间复杂度由n^2降为logn(n+m)#include<iostream>//数组从1开始而不是0 #include<cstring>//最小生成树不能形成回路#include<queue原创 2021-08-13 01:04:32 · 202 阅读 · 0 评论 -
线段树总结(动态开点,zkw,权值,主席)
zkw线段树https://www.cnblogs.com/Judge/p/9514862.html上面这篇文章虽然有些谬误,但总体很棒先上一篇带解析的总代码带解析的总代码//zkw线段树 https://www.cnblogs.com/Judge/p/9514862.html (queryMax和queryMin有错误) #include<cstdio>#include<algorithm>using namespace std;const int N原创 2021-08-10 03:15:58 · 797 阅读 · 0 评论 -
HDU 1394 树状数组求逆序数
注释详细,如有疑惑请移步树状数组总结/*求逆序数 A[i]默认值为0,一个数加入序列使A[i]+=1,表示该数出现,求i的前缀和相当于求比i小的数的数目s 那么比i大的数为n-1-s,n为加入该数后当前序列数量,用动态规划的方式一个个加入数求总逆序*/#include<iostream>#include<cstdio>#include<string>#include<cstring>using namespace std;const原创 2021-08-09 14:31:52 · 94 阅读 · 0 评论 -
单源有负权无负环求最短路径 SPFA 链式前向星实现
SPFA两个作用求最短路径 判断是否存在负环原理:从起点开始加入队列,队首更新与其相邻的点,如果可以松弛就松弛,松弛之后如果这个点不在队列中,加入队列 如果一个点入队次数超过n,存在负环求最短路模板如下#include<cstdio>#include<cstring>#include<iostream>#include<queue>using namespace std;const int N=1e5+10,M=5e5+10,I原创 2021-08-12 18:35:51 · 76 阅读 · 0 评论 -
迪杰斯特拉算法 Dijkstra 总结
原理概论边权无负数时,从未访问的所有点中选一个距源点最短的点,用它来更新别的点,循环操作。相当于三角形两边和大于第三边,边长都是正数时,你从别的点绕到这个最短的点肯定比直接到最短的点距离要大,所以我们可以放心地用这个最短的点更新别的点,这是贪心的思想故事引入邻接矩阵版 O(N^2版代码)模板#include<cstdio>//有向边无负权有环也行时间复杂度N^2 数组从0开始而不是1 #include<c......原创 2021-08-12 02:42:59 · 443 阅读 · 0 评论 -
HDU 1878题解 判断无向图欧拉回路
https://acm.hdu.edu.cn/showproblem.php?pid=1878无向图欧拉回路 :首先判断是否属于一个线段:并查集根节点相同然后判断是否一笔画回路且可以回到起点:度为偶数 实现:开个数组计算度概念解析详见欧拉回路总结博客#include<cstdio>#include<cstring>const int N=1e3+5;int root[N];//并查集 int du[N];//度int n,m;//n个节点m条边in..原创 2021-08-10 20:59:09 · 113 阅读 · 0 评论 -
超级源点与超级汇点
背景:给出题目,在一张图中有多个点起点,一个终点,求所有起点到终点的最短距离。解题方法:1.跑N边单源最短路,但是这样是不行的肯定超时。2.floyd求出所有最短路,枚举每个起点到终点的距离,这个似乎比法1更慢。3.反向建边,反向跑一遍Dijkstra,或者SPFA,这样就能求到终点到起点的距离,在枚举最小的一个即可,时间复杂度为一遍最短路加枚举N。4.建立超级源点,虚拟出一个点作为源点,源点到所有起点的距离都是0,那么这样求超级源点到终点的最短距离就是所有起点到终点的距离的最短一个,时转载 2021-08-14 00:45:25 · 624 阅读 · 0 评论 -
拓扑排序总结
讲解这大哥讲得好上述链接的模板有两处错误int ans[x++]=u; ///记录答案 这个把int去掉if(cnt!=n) cout<<"有环"<<endl; 不是cnt!=n,是x!=n模板 #include<cstdio>#include<iostream>#include<cstring>#include<queue>#def...原创 2021-08-11 18:09:50 · 70 阅读 · 0 评论 -
Floyd 弗洛伊德算法 多源最短路
原理:动态规划设中转点是ki,那么i->j的最短路是min(dis[i][j],dis[i][ki]+dis[ki][j]),就是他的最短路要么是两个点直接相连,要么是两个点经过一系列的中转点相连,一系列中转点是一个集合,可以是空集,也可以是k1,也可以是k1、k2,他可以是K的任意子集(K={k1,k2,......,kn})由于最小值满足区间加法,因此我们可以用dp优化用途求多源最短路 判断负环求任意两点的最短距离,如果有负环可以判断出来核心bool floyd() ..原创 2021-08-12 21:28:46 · 319 阅读 · 0 评论 -
求最短路总结
目录单源有向无环无负权最短路单源无负权最短路单源有负权最短路+判断负环多源有负权最短路+判断负环单源有向无环无负权最短路采用拓扑+贪心求解,按拓扑把入度为0的节点删去,更新与其相连的节点距离源点s的最短距离,因为无负,因此与其直接相连最短的点的一定比绕一个中转点的距离短,三角形两边和大于第三边(注意,更新的是距离那个点最短的点,而不是任意点!!!)时间复杂度N+M,最优秀了//单源有向无环最短路 拓扑 思路:按拓扑把入度为0的节点删去,更新与其相连的节点距离源点s的最原创 2021-08-12 21:38:14 · 61 阅读 · 0 评论 -
POJ 2230 通过模拟深入了解深搜有向边+链式前向星
题目分类:有向图的欧拉路(利用深度优先搜索+链式前向星)题目大意:一个图,要将每条边恰好遍历两遍,而且要以不同的方向,还要回到原点。定理:如果一个有向图所有顶点的入度等于出度,则该有向图存在欧拉回路。解题思路:此题实质是建立了一个双向连接的有向图。关键在于理解深搜时从S出发,为什么一定会回到S。可以从反证法角度考虑。假设遍历的顺序为S->A1->A2->A3->...->S->...->An,S在深搜过程中被遍历,则S的入度为1,出度为2,入度与出度不相原创 2021-08-11 03:35:28 · 240 阅读 · 0 评论 -
C++ 结构体数组定义后不会立即分配内存
https://www.luogu.com.cn/problem/P1908不对结构体进行操作可以AC,代码如下#include<cstdio>//求逆序对(动态开点权值线段树)#include<iostream>//https://www.cnblogs.com/IzayoiMiku/p/13997750.html#include<cstring>#define lnode tree[node].lson#define rnode tree[node]原创 2021-08-16 17:25:00 · 865 阅读 · 0 评论 -
图论:链式前向星 邻接表 邻接矩阵 实现+搜索
目录有向图链式前向星(常用 重点)邻接矩阵无向图邻接表有向图链式前向星(常用 重点)链式前向星他讲的很不错这个是倒序存储的,我们一般是倒序输出的,比如这篇https://mp.csdn.net/mp_blog/creation/editor/119586896代码+模拟版/*链式前向星:静态链表实现。添加节点:为了保证O(1)的添加操作,每条边都加在头结点的后面,这就导致本来在头结点后面的节点的前驱结点变为新添加的节点而新添加的节点为头结点,也就是说正原创 2021-08-11 18:02:03 · 130 阅读 · 0 评论 -
欧拉回路总结(待更新)
定义欧拉回路:从起点S出发的路径,每条边只走一次,最终回到起点S。(闭环一笔画)欧拉路径:从起点S出发的路径,每条边只走一次,不必回到起点S。(开环一笔画)欧拉图:存在欧拉回路的图半欧拉图:存在欧拉路径的图判断欧拉回路无向图欧拉回路首先判断是否属于一个线段——每个节点在并查集中的根节点相同然后判断是否一笔画回路且可以回到起点——每个节点的度度为偶数实现:开个数组计算度,开个数组实现并查集 核心代码如下,全部代码看例题解析 int root[N...原创 2021-08-10 21:52:29 · 269 阅读 · 0 评论 -
HDU 1285 拓扑排序+优先队列
2021年的HDU编译器不支持优先队列用greater,写完放哪都没问题放在HDU编译失败可把我气坏了……后来发现用cmp也是可以的struct cmp { bool operator () (int &a, int &b) { return a > b; }};priority_queue<int, vector<int>,cmp > q;great原理移步拓扑排序#include<cstdio>#includ原创 2021-08-11 22:10:29 · 152 阅读 · 0 评论 -
二分图问题——匈牙利算法+链式前向星 二分图性质 KM算法
匈牙利算法+链式前向星这算法是用来求二分图的最大匹配数,二分图就是可以把点集分成两部分,点集内部互不相连的图。原理网上有很多,比如https://zhuanlan.zhihu.com/p/96229700之类的形象化讲述,严谨的讲数学可以参考https://www.bilibili.com/video/BV1LZ4y1T7Nt例题https://acm.hdu.edu.cn/showproblem.php?pid=2063模板#include <iostream>//求的是原创 2021-08-14 04:28:13 · 395 阅读 · 0 评论 -
普通线段树总结
优点:修改快,求和快对于某一类问题,我们主要关注的是一个线段或者区间。对于给定区间,更新区间中一个元素或者一个区间的值,查询一个区间[i,j]的最大值、最小值,或者区间数字和。线段树不一定满二叉树,也不一定是完全二叉树,但一定是平衡二叉树线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二原创 2021-08-08 01:30:30 · 149 阅读 · 0 评论