模板
文章平均质量分 63
HT008_123
家人们点点关注叭
展开
-
[模板] 线段树维护区间线性基
单纯放个代码,可能以后用的到…实际上是写了个这玩意疯狂MLE#include <cstdio>#include <iostream>#include <algorithm>#include <cstring>const int maxm=1e5+100;int n,m,tot;int val[maxm];struct node{ ...原创 2019-08-04 20:36:57 · 289 阅读 · 0 评论 -
[POJ 1741] Tree
题目描述:给你一颗带权树,给出参数K,求有多少个点对 (X,Y)之间的距离 <=k题目分析:裸的点分治算法 我们要求的是一些合法的路径,这些路径我们可以分为两种:过某个点和不过某个点。这样我们就可以分别来求这两种情况。 如果我们已经知道了此时所有点到根的距离d[i],d[x] + d[y] <= k的(x,y)对数就是结果,这个可以通过排序之后O(n)的复杂度求出。然后...原创 2018-02-27 11:33:31 · 197 阅读 · 0 评论 -
计算几何工具算法-判断点与一个多边形的位置关系
题目描述给出一个n边形的n个顶点坐标 然后给出一个点的坐标,判断这个点与多边形的位置关系题目分析:对于在边上的情况很好搞,直接遍历n条边,然后依次用叉积判断即可 对于此点在多边形内部还是外部的问题 可以利用一个性质 从点P画一条足够长的射线 我们会发现 如点P在多边形内部 这条射线与多边形的交点个数为奇数 反之,如果点P在多边形外部,那么这条射线与多边形的交点个数为偶数(包括原创 2018-01-30 15:55:25 · 785 阅读 · 2 评论 -
计算几何工具算法-判断点是否在三角形内
题目描述:给出一个三角形三个点的坐标 以及一个点的坐标 判断这个点是否在三角形内 包括三角形边缘题目分析:最直接的想法是 先求出三角形的面积 S 然后用给出的点和三角形两个顶点作为一个三角形 求出三个面积 s1 s2 s3 然后判断 s==s1+s2+s3 然而这样搞精度误差实在是太大(也可能是我算面积的姿势不太对 看了下书上的方法,是用矢量的叉积来做的 很明显 D原创 2018-01-30 10:28:45 · 470 阅读 · 0 评论 -
[AHOI2012] 信号塔
题目描述:给出n个点,然后求最小覆盖掉它们的圆的坐标及半径题目分析:裸的最小圆覆盖问题,当练手题目了,但为啥在凸包的分类里(差评) 使用随机增量法,期望 O(n)题目链接:Luogu 2533 BZOJ 2823代码实现:#include #include #include #include #include const int maxm=1e原创 2018-01-31 16:51:24 · 385 阅读 · 0 评论 -
[POJ]1915 Knight Moves(双向宽搜)
题目链接题目大意给你一张N*N的图,一个起点x1,y1,一个终点x2,y2. 移动一次耗时1,问你最快到达终点的时间是多少解题思路很明显的是一道广度优先搜索的题目。 先写了写最传统的单向BFS 这就很尴尬了,单向宽搜跑的不慢啊。 不过我还是写了写双向宽搜 emmmm,差不多是快了1倍吧,如果数据强一点,效果应该会更明显。双向宽搜顾名思义,就原创 2018-01-16 14:45:09 · 465 阅读 · 1 评论 -
可合并堆-左偏树 初级入门教程
引言对于维护一串数的最大值,最小值,插入,查询,删除优先值。 我们仅需要使用二叉堆也就是STL中的优先队列即可维护! 但如果有多个堆并且需要我们对堆进行合并,该怎么办? 于是引入可合并堆。 可合并堆有四种,这里介绍左偏树。 支持合并,查询,插入,删除优先值操作。性质1:根节点大于(小于)任何一个子节点(堆的性质) 2:节点的左儿子的距离不小于右儿子的距离。 3:根节点原创 2018-01-07 14:05:07 · 1280 阅读 · 0 评论 -
计算几何工具算法-求任意多边形的面积
题目描述:给出n边形的n个顶点坐标,求这个n边形的面积题目分析:如果在数学上,大概会把这个多边形分成三角形(n-2)个三角形来求 但是这样免不了繁琐的算法,编程复杂度和时间复杂度都很差。 根据矢量叉乘的几何意义 矢量A与矢量B的矢量积是一个矢量,其模等于由A和B作成的平行四边形的面积,下面给出一个公式。 s=(∑i=1nOPi→∗OP原创 2018-01-30 17:08:42 · 766 阅读 · 0 评论 -
HDU 2485 Destroying the bus stations(迭代加深搜索)
题目链接题目大意给你N个点M条边和一个参数K 问你最少删除几个点可以让1-n的最短路径>K解题思路首先,我们删除的点一定是在当前图上1-n最短路径上的点,否则没有意义。 N问题的难点在于我们没法确定到底删几个点和那几个点。 删除几个点这样有层次的问题,我们可以使用迭代加深搜索。迭代加深搜索所谓迭代加深搜索,即将深搜限制在一定的层数下的深搜。 基本的深搜原创 2018-01-16 09:34:11 · 228 阅读 · 0 评论 -
读入优化的正确姿势
原来的读入是这样写的inline int read(){ int x=0,w=1;char ch=0; while(ch'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); } while(ch>='0'&&ch'9') x=(x3)+(x1)+ch-'0',ch=getchar原创 2018-01-23 21:33:34 · 362 阅读 · 0 评论 -
[算法讲解] 树链剖分
引言如果给你一串数,查询区间的和(max或min),该如何做? 线段树(树状数组) 但如果这个问题换到树上,查询 u,v 路径上的和呢? 树LCA+暴力 如果数据随机,这种方法是可以过的! 可是你觉得出题人会这么好心吗? 所以我们引出树链剖分,将这类问题转化成由线段树可以解决的问题!定义deep[i]deep[i]deep[i] 为i节点的深度(根的深度为1) son...原创 2018-01-06 08:49:12 · 256 阅读 · 0 评论 -
ZJOI[2008]树上统计
一道树剖的裸题,连区间修改都不用,只需要单点修改,区间最值,区间求和即可。 需要注意的是,此题有负数,求最大值时需要考虑。 题目传送门#include #include #define lson (o#define rson (ousing namespace std;const int maxm=310000;int deep[maxm],son[maxm],size[max原创 2018-01-06 10:04:52 · 296 阅读 · 0 评论 -
[Luogu P3806] 点分治 模板
题目描述:给出一颗含N个点的数。 Q个询问,每个询问一个K,问树中是否存在一对点的距离==K题目分析:这道题目可以看为POJ那道的简化版? 然而用那种方法,对于每个K都查一次,不T才怪嘞. 注意到 K<=10000000. 那我们可以用点分治的办法跑一边树,求出所有点对的路径长度,扔进一个桶里即可做到O(1)查询.题目链接:Luogu 3806AC 代码:...原创 2018-02-27 15:19:35 · 366 阅读 · 0 评论 -
[模板] 可持久化数组(可持久化线段树/平衡树)
题目描述:给出一串数字 然后给出M个操作 1:询问 版本为 V 的数组上 POS位置的数字 2:修改 版本为 V 的数组上 POS位置的数字变为 Num题目分析:我们用可持久化线段树来实现可持久化的数组 思想跟主席树差不多,我们只需要对于需要修改的线段区间新开点,而对于相同的只需要把前面的版本的节点信息复制一下即可 神™询问也算版本题目链接:Luogu 3919...原创 2018-03-15 11:03:25 · 292 阅读 · 0 评论 -
[BZOJ 4589] Hard Nim
题目描述:石子堆数为N且每堆石子的数量都是不大于M的质数的Nim游戏,求先手必败的局面数量模10^9+7。N<=10^18,M<=50,000,数据组数<=80.题目分析:算是FWT的模板吧QAQ… 我们构造一个多项式 若 x 为一个质数 且 x<=m 那么 Ax=1Ax=1A_x=1 如果我们能够实现 ci=∑j xor k=iaj...原创 2018-04-25 15:35:54 · 197 阅读 · 0 评论 -
[模板] 高斯消元法
题目描述:求线性方程组的解题目分析:高斯消元法,用矩阵来存储线性方程… 利用加减消元法把矩阵消成上三角矩阵,然后我们就可以从后往前递推回带就可以求出每个解了. 回带完毕之后这个上三角矩阵就变成了只有主对角线为1的矩阵,那么n+1的值就是解惹题目链接:貌似很水的模板Ac 代码:#include <cstdio>#include <c...原创 2018-04-20 18:58:58 · 181 阅读 · 0 评论 -
[模板] 矩阵树定理
题目描述:给一个无向图,求图上生成树的数量.题目分析:矩阵树定理就是用于解决图上的生成树的计数问题的. 先构造两个矩阵 A为邻接矩阵 若 u v 有边 A[u][v]++ A[v][u]++ B为度数矩阵 若 u v 有边 则 B[u][u]++ B[v][v]++ 最后构造矩阵 C=B-A 删去矩阵C任意元素 Ci,jCi,jC_{i,j} 所在的行列 求这个矩阵...原创 2018-04-20 16:51:45 · 270 阅读 · 0 评论 -
[模板] 卢卡斯定理
题目描述:求Cmn+m% pCn+mm% p保证p为质数题目分析:卢卡斯定理 Cmn% p=Cm%pn%p∗Cm/pn/p%pCnm% p=Cn%pm%p∗Cn/pm/p%p题目链接:Luogu 3807Ac 代码:// luogu-judger-enable-o2#include <cstdio>#include <iostre...原创 2018-03-29 09:00:13 · 190 阅读 · 0 评论 -
[模板] MTT实现之FFT拆系数
题目描述:求两个多项式的卷积,系数对P取模,不保证P可以分解成P=a⋅2k+1P=a⋅2k+1P=a⋅2^k+1 题目分析:P不保证分解成那个形式,那么我们就不可以用NTT了. 如何解决这个问题呢? 拆系数+FFT~ 基本上就是找个模数 然后拆成4个多项式,分别是第一个多项式 / 模数 %模数 第二个多项式 / 模数 %模数 的值 然后两两相乘,结果 乘上对应项数的模数次...原创 2018-04-16 11:01:25 · 1041 阅读 · 0 评论 -
[模板] 多项式求逆
题目描述:给定多项式F(x)F(x)F(x) 求一个多项式G(x)G(x)G(x) 满足F(x)∗G(x)≡1(mod xn)F(x)∗G(x)≡1(mod xn)F(x)*G(x)\equiv1(mod \ x^n)题目分析:通过倍增法及NTT求逆 总复杂度为NlogNNlogNNlogN 具体讲解请看Miskcoo的博客题目链接:Luog...原创 2018-04-15 16:28:00 · 257 阅读 · 0 评论 -
[模板] NTT快速数论变换
题目分析:emmm,求两个多项式卷积题目分析:FFT能做哇,然而精度和速度… NTT相对于FFT就是变换了原根。 本博客木有讲解,只有板子qwq题目链接:UOJ #34 Luogu 3803Ac 代码:#include <iostream>#include <cstdio>#include <algorithm&g...原创 2018-04-15 09:37:09 · 425 阅读 · 0 评论 -
[SDOI2016]生成魔咒
题目描述:雾。题目分析:一眼裸的SAM啊. 在SAM里维护本质不同的子串就好了.题目链接:Luogu 4070 BZOJ 4516Ac 代码:#include <iostream>#include <cstdio>#include <map>#define ll long long#define js(x) (...原创 2018-03-06 10:36:56 · 251 阅读 · 0 评论 -
P3804 [模板]后缀自动机
题目描述:计算出现次数>1的子串长度*次数的最大值题目分析:SAM 一个串的出现次数等于right/endpos集合的大小 而这个集合的大小等于所有parent树上儿子的大小 这样子的话,给每个终止位置的size记为1 然后按照拓扑序累加,这就是right/endpos集合的大小 最后对于每个size>1的节点,ans=max(longest?size)...原创 2018-03-09 20:54:43 · 412 阅读 · 0 评论 -
LCT 基本概念 模板 及其应用
本博大部分转载于 玫葵之蝶LCT的前置技能:你需要一棵完美的Splay来写LCT Or 一棵Finger Search Tree也可以 Or Treap写Finger Search 还有就是你的常数需要小一点LCT的常数的确不想吐槽了LCT的用途:在线link & cut(即连接边与删除 查询连通性 维护链上信息 换根 维护子树信息(某些情况)...转载 2018-03-09 18:47:52 · 1164 阅读 · 1 评论 -
树剖求LCA
若不知道树剖是啥的,请参照我上篇博客。实现先对树进行树剖 如何求LCA 1:若u,v在一条重链上 那么深度小的点即为LCA 2:若二者不在一条重链上 假设deep[top[u]]>deep[top[v]] 那么我们可以令u=fa[top[u]],直到两者在一条重链上。//树剖求lca很短,只是预处理有点长int lca(int u,int v){ whil原创 2018-01-06 09:13:04 · 336 阅读 · 0 评论 -
CDQ分治之三维偏序问题
前言上篇博文介绍了二维偏序问题的解决方法。 现在将参量提升到3个,该咋办呢? 树套树??? 理解难度->INF 代码难度->INF 烦躁程度->INF 那就上新工具 CDQ分治。 CDQ分治这名字一点也不表面,其实是以神犇陈丹琦名字命名的。适用条件首先CDQ必须满足的条件: 1.修改操作对询问的贡献独立,修改操作之间互不影响效果。 2.题目允许使用离线算法。实原创 2018-01-15 11:24:57 · 1339 阅读 · 0 评论 -
Splay伸展树
首先要了解啥是Splay! 度娘的介绍 Splay是对二叉搜索树的优化(神TM优化),防止极限的数据退化成N的复杂度! 比方说我输入的数据降序的,那么二叉搜索树就屁用没有了! 所以说要尽量把这棵树变成一颗满二叉树,深度尽量低。 做到这些效果的方法即为左旋和右旋,就是儿子变成了老子。 而Splay的核心思想即为我是你老子,我是你老子,直到我成为祖宗。 在这个过程中这棵树会变得很平衡!原创 2017-12-20 17:13:56 · 237 阅读 · 0 评论 -
SPFA(模板)
题目#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<vector>#include<deque>#include<cstring>using namespace std;struct H{ int cost;//边长 int to; //指向的店};vecto原创 2016-12-31 14:11:09 · 371 阅读 · 0 评论 -
素数线性筛(O(N)!!!)
我们先来看一下最经典的埃拉特斯特尼筛法。时间复杂度为O(n loglog n) int ans[MAXN]; void Prime(int n) { int cnt=0; memset(prime,1,sizeof(prime)); prime[0]=prime[1]=0; for(int原创 2017-05-26 17:57:18 · 351 阅读 · 0 评论 -
没有删除的二叉搜索树
还没有写删除操作,所以感觉实用性不大 操作含义如图所示#include <cstdio>#include <iostream>using namespace std;int tot=1;int root=1;struct tree{ int val; int lt; int rt; int size; int fat;};tree a[99原创 2017-05-07 10:31:04 · 218 阅读 · 0 评论 -
AC自动机
2018-4-2重新编辑作为一个蒟蒻的我,终于学习了AC自动机。 其实之前我以为AC自动机是自动AC的呢!(手动滑稽) 其实AC自动机啊,是字符串匹配中的多匹配问题的基础2333 举个栗子 母串 hychycxyxy 三个匹配串 hyc chy cxyy 有两个是母串的子串2333 如果匹配串只有一个的话,那就用KMP喽,可是这个是很多个匹配串咋办呢 那就得请出炒鸡厉害...原创 2017-04-16 10:58:13 · 860 阅读 · 0 评论 -
KMP
KMP是字符串的单匹配算法,判断一个字符串是不是另一个字符串的子串。 处理next数组void find(){ int len=strlen(s2); int t1=0,t2=-1; net[0]=-1; while(t1<len) { if(t2==-1||s2[t1]==s2[t2]) net[++t1]=++t2原创 2017-04-16 08:07:34 · 312 阅读 · 0 评论 -
割边
#include <cstdio>#include <iostream>using namespace std;int dfn[199999],low[199999],n,m,root;int num;int f[199999];int head[199999],to[199999],net[199999],cnt;void add(int x,int y){ cnt++;原创 2017-03-20 08:13:16 · 660 阅读 · 0 评论 -
裸的tarjan(模板)
#include <cstdio>#include <iostream>#include <vector>using namespace std;vector <int> q[1000];int color[10000],c=0,num=0,low[1000],dfn[1000],top=0,f[1000],s[1000],maxf=-1;void dfs(int x){ dfn原创 2017-02-15 15:48:46 · 365 阅读 · 0 评论 -
最小生成树(prime)
#include <cstdio>#include <iostream>#include <cstring> using namespace std;int dis[1000],sum=0,f[1000],a[1001][1001],ans[1000][3],p[1000];int main(){ int n,m,t=0; scanf("%d%d",&n,&m); m原创 2017-02-15 15:50:01 · 311 阅读 · 0 评论 -
数组模拟链表
#include <cstdio>#include <iostream>#include <algorithm>#include <vector>using namespace std;int head[1000],next[1000],num[1000];int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i原创 2017-02-17 17:42:31 · 577 阅读 · 2 评论 -
(模板)区间修改与查询
题目呀#include <cstdio>#include <iostream>#include <string>#include <cstring>#define LL long long using namespace std;const int MAXN=200001;LL a[MAXN];struct tree{ LL adi; LL sum; LL l原创 2016-12-30 14:04:00 · 293 阅读 · 0 评论 -
P1531 I Hate It(最简单的线段树)
题目在这呢QAQ 这个垃圾题目我tmd调了一节课#include <cstdio>#include <iostream>#include <string>using namespace std;const int MAXN=200001;int a[MAXN],st[(MAXN)<<2],q[5001];void build(int o,int l,int r){ if(l=原创 2016-12-23 17:04:46 · 423 阅读 · 0 评论 -
欧拉线性筛
对于线性筛素数的增添,可以同时求出每个数的欧拉函数 首先需要三个性质 证明链接(转) 性质一:若p为质数,phi[p]=p-1(显然) 性质二:若 i mod p=0(p为质数),那么有phi[i*p]=p*phi[i] 性质三:若 i mod p≠0,那么phi[i*p]=phi[i]*(p-1)#include <cstdio>#include <iostream>using na原创 2017-05-27 11:23:37 · 364 阅读 · 0 评论 -
自己的垃圾Treap
啥都干不了的Treap,没有多大实用性,主要是用来理解Treap的 至于平衡树的建立的过程以及为啥么这么写,等我有时间再写吧#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#include <cmath>#include <queue>#include <vector>#include原创 2017-05-10 16:10:34 · 250 阅读 · 0 评论