模板
Self-Discipline
在校大学生
展开
-
bzoj2351 Matrix(二维哈希)
题意:Description给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过。所谓01矩阵,就是矩阵中所有元素不是0就是1。Input输入文件的第一行为M、N、A、B,参见题目描述。接下来M行,每行N个字符,非0即1,描述原矩阵。接下来一行为你要处理的询问数Q。接下来Q个矩阵,一共Q*A行,每行B个字符,描述Q个01矩...原创 2019-08-12 16:06:05 · 287 阅读 · 0 评论 -
后缀树组模板(以洛谷P3809为例)
题目:点击打开链接题意:略。分析:后缀树组裸题,直接输出sa数组就行了,后缀树组入门参考点击打开链接。代码一(不含注释):#include<iostream>#include<cstdio>#include<cstring>#define N 1000050using namespace std;char s[N];int y[N],x[...原创 2018-11-26 19:44:11 · 459 阅读 · 0 评论 -
左偏树模板(以洛谷P3377 为例)
题目:点击打开链接题意:略。分析:左偏树(可并堆)模板题,配对堆或者斐波那契堆也可以做。左偏树入门参考https://www.luogu.org/problemnew/solution/P3377?&page=2。代码:#include<algorithm>#include<iostream>#include<fstream>#incl...原创 2018-11-23 11:02:21 · 230 阅读 · 0 评论 -
HDU 5572 An Easy Physics Problem
题目:点击打开链接题意:二维平面中一位于(Ax, Ay)的点A以矢量v为方向运动,同时平面内有一半径为r 圆心为Ox Oy的圆,点A碰到圆就会反弹,问运动过程中是否能碰到点B。分析:这题思路上并不难,写起来比较麻烦,抄的kuangbin的新板子,先判断一下直线AV是否与圆的交点个数,如果少于2个交点,判断B是否在射线AV上,如果有两个交点,求出距离A较近的那个交点P1,求出A关于QP1的对称点...原创 2018-11-22 22:11:53 · 213 阅读 · 0 评论 -
2018 ACM-ICPC 南京站 D Country Meow
题目:点击打开链接题意:最小球覆盖裸题。分析:三分套三分再套三分(x,y,z三个方向嵌套三分)或者模拟退火。代码一(三分):#include<algorithm>#include<iostream>#include<fstream>#include<complex>#include<cstdlib>#include&...原创 2018-11-21 21:29:06 · 668 阅读 · 0 评论 -
模拟退火模板(以POJ 2069为例)
题目:点击打开链接题意:给n个点的坐标(xi,yi,zi),求覆盖这n个点的最小球的半径r。分析:最小球覆盖模板题,模拟退火或者三分套三分再套三分,模拟退火法就是纯贪心的修改版。在搜索到某个局部最优解之后,普通的贪心算法就结束搜索了,但是模拟退火法会以一定的概率进行下一次搜索,这个概率随着时间的变化而减小。选择任意一个点作为初始解,然后将所有点按到当前圆/球心的距离排序,向距离最远的点靠近。每...原创 2018-11-21 21:17:30 · 774 阅读 · 0 评论 -
树链剖分模板(以洛谷P3384为例)
题目:点击打开链接题意:略。分析:树链剖分板子题,树链剖分入门参考https://www.luogu.org/problemnew/solution/P3384。代码:#pragma comment(linker, "/STACK:102400000,102400000")#include<unordered_map>#include<unordered_set...原创 2018-11-13 15:53:11 · 188 阅读 · 0 评论 -
二维线段树单点更新+区间最值模板(以UVA11297为例)
题目:点击打开链接题意:给你一个n*n的矩阵,有m个询问,q x1 y1 x2 y2 查询这个子矩阵的最大值和最小值,c x y v是将x,y点的值改成c。分析:二维线段树裸题,留作板子。二维线段树就是在一棵线段树的每一个节点,都保存着另一棵线段树的根节点编号。注意更新操作,稍微有点复杂,给个图解。可以结合代码理解,代码在关键地方写了注释。(感谢xbb的指导)代码:#inclu...原创 2018-11-01 23:30:17 · 733 阅读 · 0 评论 -
树状数组求逆序数模板
以前求逆序数都是用的归并排序,现在发现树状数组求逆序数更简单,常数更小,留个板子,数值较大时需要离散化,用map实更简单,入门参考https://www.cnblogs.com/xiongmao-cpp/p/5043340.html。普通逆序数代码:#pragma comment(linker, "/STACK:102400000,102400000")#include<unor...原创 2018-10-31 00:03:23 · 321 阅读 · 0 评论 -
二维树状数组模板(区间更新,单点查询)(以POJ 2155为例)
题目:点击打开链接题意:n*n坐标图起初都为0,C:翻转左下和右上两个坐标围成的矩阵中所有点,Q:查询此点的0 1状态。分析:利用差分的思想,推广到二维,一维单点查询就是前缀和,即query(x)。区间修改先让s-n都加num,再让t+1-n减去num,即update(s, num),update(t+1, -num)。二维的单点查询变成二维就好了query(x, y)。区间修改update(...原创 2018-10-30 10:28:40 · 362 阅读 · 0 评论 -
二维树状数组模板(单点更新,区间求和)(以HDU 2642为例)
题目:点击打开链接题意:输入B后输入坐标,表示对应的点的灯变亮,输入D后输入坐标表示对应的点灯灭,输入Q后输入一个矩形的左下角和右上角 输出矩形内亮着的等的个数,注意灯亮过不能再亮,灯关了不能再关,所以用数组标记,树状数组模板中元素下标均从1开始,题目从0开始所以加1。分析:二维树状数组单点更新,区间求和裸题。总结下板子。tree[x][y]记录的是右下角为(x, y),高为lowbit(x...原创 2018-10-30 09:32:45 · 346 阅读 · 0 评论 -
归并树模板(以poj 2104为例)
题目:点击打开链接题意:区间第k大。分析:主要学习了一下归并树,归并树是利用了归并排序的思想。归并树原理是先归并排序,然后把每一层排好序的数组记录下来,二分答案,看[ql,qr]区间有几个数小于k,[ql,qr]可以像线段树那样被分成若干个已经排好序的区间,比如在一个已经排好序的子区间[l,r],我再二分求ans在这个区间对应下标,我就知道l r,有多少个数是小于ans了,ql qr可以被分成...原创 2018-10-29 19:34:09 · 181 阅读 · 0 评论 -
划分树模板(以poj 2104为例)
题目:点击打开链接题意:区间第k大。分析:主要学习了一下划分树,划分树是利用了快速排序的思想。划分树入门参考https://www.cnblogs.com/hchlqlz-oj-mrj/p/5744308.html。代码:#pragma comment(linker, "/STACK:102400000,102400000")///#include<unordered_map...原创 2018-10-29 16:19:52 · 194 阅读 · 0 评论 -
倍增法实现LCA(以HDU - 2586为例)
题目:点击打开链接题意:求树上任意两点之间的距离。分析:LCA模板题,这是一棵无根树,把它转化为有根树,再用倍增LCA求出每个结点到根节点的距离,两点的距离:dist = dis[u] + dis[v] - 2 * dis[ LCA(u,v) ],复杂度O(nlogn)。倍增法求LCA入门参考https://blog.csdn.net/lw277232240/article/details/7...原创 2018-10-17 19:49:05 · 358 阅读 · 0 评论 -
最短工期-拓扑排序模板
题意:现给定一个项目中各个任务之间的关系,请你计算出这个项目的最早完工时间。(项目里程碑的数量N(≤100)和任务总数M。这里的里程碑从 0 到N−1编号。随后M行,每行给出一项任务的描述,格式为“任务起始里程碑 任务结束里程碑 工作时长”,三个数字均为非负整数,以空格分隔。)代码:#include<bits/stdc++.h>using namespace st...原创 2019-03-18 16:45:23 · 982 阅读 · 0 评论 -
P1903
题目:https://www.luogu.org/problemnew/show/P1903分析:主席可以做,也可以用动态(带修改)莫队,模板题。参考博客:https://www.cnblogs.com/zwfymqz/p/7154145.htmlhttps://blog.csdn.net/wu_tongtong/article/details/77924765注意:对于n和m同级...原创 2019-05-24 22:46:55 · 229 阅读 · 0 评论 -
Codeforces 126B Password(Z-Box or kmp)
题意:你要在一个串中找到“密码”,密码定义为既是前缀,也是后缀,同时在串中间出现过的子串。分析:字符串匹配经典题,用kmp肯定是可以的,但是最近学了一下Z-Box算法,就练一下,感觉比kmp更好理解,更实用。先预处理处z数组,如何保证前缀也是后缀呢?z[i]==n-i。直观理解上就是以这一位为开始的串有n-i位与前缀相同。就是后缀和前缀相等。那如何保证这一个串在中间也出现过呢?遍历的过程中记录...原创 2019-08-11 07:07:49 · 165 阅读 · 0 评论 -
URAL 1486(二维字符串HASH)
题意:给定一个n*m的字符矩阵,问你是否存在两个不重合(可以有交集)的正方形矩阵完全一致, 存在输出正方形的最大边长和两个正方形的左上角坐标,不存在则输出0。分析:二维字符串Hash板子题,二分正方形的长度,然后Hash判断即可。注意进制P和模数M的选择,按照《算法竞赛进阶指南》上的来说,P一般可以选择131或者13331,推荐论文:《Hash在信息学竞赛中的一类应用》。代码:#in...原创 2019-08-13 16:47:55 · 183 阅读 · 0 评论 -
CH#17C 舞动的夜晚(最大流+强连通分量)
题意:L公司和H公司举办了一次联谊晚会。晚会上,L公司的N位员工和H公司的M位员工打算进行一场交际舞。在这些领导中,一些L公司的员工和H公司的员工之间是互相认识的,这样的认识关系一共有T对。舞会上,每位员工会尝试选择一名Ta认识的对方公司的员工作为舞伴,并且每位员工至多跳一支舞。完成的交际舞的数量越多,晚会的气氛就越热烈。顾及到晚会的气氛,员工们希望知道,哪些员工之间如果进行了交际舞,就会使整场晚...原创 2019-08-02 11:03:20 · 1203 阅读 · 0 评论 -
2019牛客暑期多校训练营(第五场) B generator 1(十进制矩阵快速幂)
题意:分析:十进制快速幂板子题。代码(模板):#include<bits/stdc++.h>using namespace std;typedef long long LL;const int N=1000005;LL mod;struct MAT{ LL t[2][2]; MAT operator * (const MAT&b)cons...原创 2019-08-02 10:01:35 · 125 阅读 · 0 评论 -
洛谷P3690 Link Cut Tree(LCT)
题意:给定n个点以及每个点的权值,要你处理接下来的m个操作。操作有4种。操作从0到3编号。点从1到n编号。0:后接两个整数(x,y),代表询问从x到y的路径上的点的权值的xor和。保证x到y是联通的。1:后接两个整数(x,y),代表连接x到y,若x到y已经联通则无需连接。2:后接两个整数(x,y),代表删除边(x,y),不保证边(x,y)存在。3:后接两个整数(x,y),代表将...原创 2019-08-02 21:15:33 · 150 阅读 · 0 评论 -
BZOJ1791/洛谷4381 Island 岛屿(基环森林直径和+单调队列优化DP+树形DP)
题意:基环树森林的各个树直径之和。分析:基环树(树)森林直径模板,详见《算法竞赛进阶指南》P388-389。代码:#include<iostream>#include<cstdio>using namespace std;const int u=1000010;int ver[2*u],edge[2*u],next[2*u],head[u],du[...原创 2019-07-30 10:56:59 · 371 阅读 · 0 评论 -
最小路径覆盖
转自:https://blog.csdn.net/qq_39627843/article/details/82012572花了好长时间,用于找了几篇能看懂的最小路径覆盖。定义:通俗点将,就是在一个有向图中,找出最少的路径,使得这些路径经过了所有的点。最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖。最小不相交路径覆盖:每一条路径经过的顶点各不相同。如图,其最小路径覆...转载 2019-06-07 11:07:41 · 369 阅读 · 0 评论 -
LA 4597 Inspection 路径覆盖
题意:给一个有向图,求最小路径覆盖并且输出路径,不过走过的路径可以重复走。分析:设d[ i ]为节点 i的入度-出度的值,如果路径不可重复走,那么最小路径覆盖就是所有d[ i ]为负数的和sum,不过路径是可以重复走的,那么有些边在不可重复走中只能走一次,但是在这题中可以走多次,这些边满足性质:起点u的d[ i ]>0,终点v的d[ i ]<0,那么就连接s-->u,v--...原创 2019-06-07 11:03:30 · 188 阅读 · 0 评论 -
SPOJ Count on a tree II
题意:给定一个n个节点的树,每个节点表示一个整数,问u到v的路径上有多少个不同的整数。分析:树上莫队模板题,利用欧拉序将树上路径转化为序列,注意我们询问的区间长度为2∗N,所以预处理的时候一定要循环到2∗N。参考博客:https://www.cnblogs.com/zwfymqz/p/9223425.htmlhttps://blog.csdn.net/qq_39759315/artic...原创 2019-05-24 11:05:39 · 153 阅读 · 0 评论 -
POJ 2201
题目:笛卡尔树:笛卡尔树中的每个节点有两个数据域k,a,对于数据域k,满足二叉搜索树性质,对于数据域a,满足最小堆性质。给出N个节点,1<=N<=50000,每个节点由一对k,a构成,判断能否根据这些节点构建一颗笛卡尔树,如果可以构建则输出构造出的笛卡尔树,否则输出“NO”。解题思路:首先,根据N个节点,肯定可以构造出一颗笛卡尔树。参考博客:https://www.cnblog...原创 2019-05-23 21:51:31 · 202 阅读 · 0 评论 -
HDU 6538
题意:给你n个点,选四个点构成四边形,求四边形的面积最大最小值的两倍。分析:先将点按照x为第一关键词y为第二关键词从小到大排序,然后我们开始取向量,并将所取的所有向量进行极角排序。第一条向量的两个端点在之前排序过的点的序列中是相邻的。这样的序列保证在序列的第一个点到向量的左端点的点距离这条直线单调递减,右侧也一样,那么我们考虑当我们旋转坐标系的时候,画图可知,受影响的点只有之前那条向量上的点,...原创 2019-05-28 11:26:07 · 560 阅读 · 0 评论 -
HDU 3507
题意:就是要输出N个数字a[N],输出的时候可以连续连续的输出,每连续输出一串,它的费用是 “这串数字和的平方加上一个常数M”。分析:我们设dp[i]表示输出到i的时候最少的花费,sum[i]表示从a[1]到a[i]的数字和。于是方程就是:dp[i]=dp[j]+M+(sum[i]-sum[j])^2;很显然这个是一个二维的。题目的数字有500000个,不用试了,二维铁定超时了,需要使用斜率优...原创 2019-05-23 20:14:47 · 343 阅读 · 0 评论 -
HDU 5126
题意:一共有Q(1<=Q<=50000)组操作,操作分为两种:1.在x,y,z处添加一颗星星,2.询问以(x1,y1,z1)与(x2,y2,z2)为左上和右下顶点的矩形之间的星星数,所有坐标取值范围均为[1,1e9]。思路:CDQ分治模板题,x,y,z和时间四维,是个四维带修改的偏序问题,所有操作按默认时间排序,将每个查询操作拆分为8个(容斥),再进行两次分治。第一次分治:将q中每...原创 2019-05-27 16:18:36 · 228 阅读 · 0 评论 -
次小生成树模板(以POJ 1679为例)
题目:点击打开链接题意:判断生成树的唯一性,唯一则输出权值,不唯一输出Not Unique!分析:显然,可以转化为求次小生成树,次小生成树权值=最小生成树,则不唯一。我这里用的是kruscal算法,更加简单易用。入门参考https://blog.csdn.net/li1615882553/article/details/80011884和https://www.cnblogs.com/rad...原创 2018-10-16 16:29:08 · 176 阅读 · 0 评论 -
k短路模板(以POJ 2449 为例)
题目:点击打开链接题意:给出一个图,然后给出一个起点个一个终点,求这两点间的第K短路。本题中是可以走重复的路的,所以如果一张图中有一个环的话,无论求第几短路都是存在的。路径长度一样,经过的边集不同属于两种不同的情况。分析:k短路模板题,A*+dijkstra,注意当s == t的时候,需要计算第k+1短路。因为s到t这条距离为0的路不能算是这k短路里边。A*入门参考https://www.c...原创 2018-10-15 22:22:18 · 256 阅读 · 0 评论 -
伯努利数模板
预处理逆元与组合数,复杂度为O(n)。代码:#pragma comment(linker, "/STACK:102400000,102400000")///手动扩栈#include<algorithm>#include<iostream>#include<cstdlib>#include<cstring>#include&l...原创 2018-07-27 11:41:39 · 254 阅读 · 0 评论 -
基于链式前向星的有向图无向图的缩点模板(tarjan)
对于无向图的缩点:void tarjan(int u,int fa){ dfn[u]=low[u]=++times; q[++head]=u; for(int i=Laxt[u];i;i=Next[i]){ if(To[i]==fa) continue; if(!dfn[To[i]]) { tarjan(...原创 2018-07-03 11:37:45 · 1418 阅读 · 2 评论 -
poj1330 Nearest Common Ancestors(最近公共祖先)
传送门:点击打开链接题意:最近公共祖先的裸题。分析:最近公共祖先其实用的不多,为了以防万一,还是准备个模板。常用的求LCA的算法有:Tarjan/DFS+ST/倍增,我这里用的是Tarjan。Tarjan算法的优点在于相对稳定,时间复杂度也比较居中,也很容易理解。如果有并查集的基础,Tarjan就很容易理解了。代码:#include<iostream>#includ...原创 2018-05-02 15:32:22 · 236 阅读 · 0 评论 -
最大流之Edmonds-Karp算法(模板)
传送门:点击打开链接 #include <iostream>#include <queue>#include <cstring>#include <cstdio>using namespace std;const int N = 210;const int INF = 0x7FFFFFFF;int n,m,map[N][N]...原创 2018-03-21 16:20:09 · 520 阅读 · 0 评论 -
POJ 3348 Cows (凸包模板)
传送门:点击打开链接题目大意:草地上有些树,用树做篱笆围一块最大的面积来养牛,每头牛要50平方米才能养活,问最多能养多少只羊解法:凸包求面积,分解成三角形用叉积求面积。代码: #include<iostream>#include<algorithm>#include<cstring>#include<cmath>usin...原创 2018-03-28 15:03:27 · 188 阅读 · 0 评论 -
FWT模板(洛谷P4717)
Fast Walsh-Hadamard Transform,即FWT,用来解决形如一类的卷积,其中⊕表示位运算(xor/or/and)。参考博客:https://www.cnblogs.com/cjyyb/p/9065615.html大体结构和FFT、NTT差不多。代码:#pragma GCC optimize(2)#pragma GCC optimize(3)#pragma...原创 2018-08-29 21:36:32 · 276 阅读 · 0 评论 -
NTT多项式乘法模板(HUD 1402)
FFT虽然能快速处理卷积,但是它也有很大的弊端。精度问题有时会导致一些错误。而且,有许多题目涉及了取模,比如 998244353,复数域下的 DFT精度更是暴露无遗。于是考虑是否有模意义下的这种算法。于是,便出现了快速数论变换(Fast Number−Theoretic Transform, FNT)。NTT和FFT基本上一样,只不过用原根代替了复数根。参考博客:https://www.c...原创 2018-08-29 20:48:28 · 1309 阅读 · 0 评论 -
HDU 4347 The Closest M Points
题目:点击打开链接题意:求取一个点的m个最近的点分析:kd树模板题。入门可参考https://blog.csdn.net/u013534123/article/details/80952174,代码细节可参考https://blog.csdn.net/HackerTom/article/details/78198767代码:#pragma GCC optimize(2)#pra...原创 2018-09-04 10:09:46 · 174 阅读 · 0 评论 -
FFT多项式乘法模板(HDU1402)
这几天学了下FFT,入门推荐算法导论第三十章,话不多说,上板子。递归版:#pragma GCC optimize(2)#pragma GCC optimize(3)#pragma GCC optimize(4)#pragma comment(linker, "/STACK:102400000,102400000")#include<unordered_map>#in...原创 2018-08-29 14:50:16 · 269 阅读 · 0 评论