OI-模板
略
嘉伟森的猫
NYU Shanghai本科,MBZUAI机器学习硕士,深度学习/强化学习菜鸡
展开
-
POJ 3070 Fibonacci(矩阵快速幂)(模板)
传送门题意:求斐波那契数列的第n项,但是n很大,达到1e9题解:由于n很大,所以不能逐项递推,采用矩阵快速幂加速递推,如图#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int MOD=1e4;int n;struct Matrix { int v[2][2]; Matrix ()原创 2020-06-02 17:49:09 · 198 阅读 · 0 评论 -
POJ 1061 青蛙的约会(扩展欧几里得)(模板)
传送门题意:在一条首尾相接的纬度线上,青蛙A的出发点坐标是x,青蛙B的出发点坐标是y。青蛙A一次能跳m米,青蛙B一次能跳n米,两只青蛙跳一次所花费的时间相同。纬度线总长L米。现在要你求出它们跳了几次以后才会碰面。题解:设要跳x次,那么...原创 2020-06-02 17:41:33 · 218 阅读 · 0 评论 -
POJ 1741(点分治)(模板)
传送门题意:统计树上距离不超过K的点对数量题解:点分治,求树的重心,统计有多少条经过重心的合法路径,再对子树进行相同操作(递归处理),总复杂度O(nlog(n)log(n))。为什么是这个复杂度?因为以重心为根的树至少有两棵子树,所以分治的层数不超过log(n)。每次统计时,设当前树的大小为size,那么排序的复杂度为size*log(size),双指针扫描为size,所以复杂度取size*log(size)。每一层分治的总复杂度为,所以整个算法复杂度为nlog(n)log(n)。注意点:1原创 2020-06-01 14:48:56 · 313 阅读 · 1 评论 -
hihocoder 1098(kruskal)
传送门模板题,原计划觉得kruskal稳如狗根本不用管,但是保险起见还是敲一遍,如果忘了就吃键盘。#include#include#include#includeusing namespace std;const int N=1e5+4,M=1e6+4;int n,m,fa[N];struct EDGE { int u,v,w; friend bool operator原创 2017-11-09 19:57:18 · 307 阅读 · 0 评论 -
hihocoder 1032(manacher)
传送门模板题。关键:记一个最远延伸的起点id。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int N=1e6+4;char s[N];int p[N<<1];in...原创 2017-11-09 19:46:07 · 313 阅读 · 0 评论 -
hihocoder 1015(KMP)
传送门再刷模板ing。#include#include#include#includeusing namespace std;char T[1000004],W[10004];int n,m,f[10004];inline void getfail(char *W,int m) { f[0]=f[1]=0; for (register int i=1;i<m;++i)原创 2017-11-09 19:24:51 · 243 阅读 · 0 评论 -
hihocoder 1014(Trie)
传送门Trie树模板题,询问一个前缀在字符串集合中出现的次数。#include#include#include#includeusing namespace std;const int N=1e6+4;struct Trie { int ch[26][N]; int val[N],tot; inline Trie() {memset(ch,-1,sizeof(ch))原创 2017-11-09 19:13:27 · 250 阅读 · 0 评论 -
Luogu 3383(线性筛)
传送门模板题。好奇NOIP会不会考用线性筛求一个化简过程中遇到的积性函数#include#include#include#includeusing namespace std;const int N=1e7+4;int prime[N/10],tot=0;bool vis[N];inline void linear_shaker(int n) { vis[1]=tru原创 2017-11-08 19:20:43 · 261 阅读 · 0 评论 -
Luogu 3387(tarjan+dp)(tarjan+SPFA)
传送门 直接tarjan缩点,然后在DAG上dp一下最长路即可。#pragma comment(linker,"/STACK:1024000000,1024000000")#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define root 1,n,1#define lson l,mid,r原创 2017-08-29 23:00:52 · 341 阅读 · 0 评论 -
Luogu 3805(manacher)
传送门模板题。注意:id要初始化为0,否则本地都会RE(局部变量的初值不会自动为0)。P.S.本文可能是本菜鸡AFO之前最后一篇(或者几篇)博文。7月底开始写博客时第二篇便是manacher,现在以此收尾,不得不感叹时间飞逝~~最后几天好好努力吧!#include#include#include#include#include#includeusing namesp原创 2017-11-07 20:05:57 · 167 阅读 · 0 评论 -
hihocoder 1038(01背包)
传送门模板题,倒着for,复杂度O(n*maxV)。#include#include#include#includeusing namespace std;int c[502],v[502];int n,m;int f[100004];inline int read() { int x=0;char c=getchar(); while (c'9') c=getch原创 2017-11-09 20:36:39 · 240 阅读 · 0 评论 -
hihocoder 1043(完全背包)
传送门模板题,正着for。#include#include#include#includeusing namespace std;int c[502],v[502];int n,m;int f[100004];inline int read() { int x=0;char c=getchar(); while (c'9') c=getchar(); while (c原创 2017-11-09 20:40:32 · 309 阅读 · 0 评论 -
Luogu 3371(dijkstra堆优化)
传送门模板题。此版本无遍历标记,只能过弱化版数据......#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<queue>using namespace std;const int N=10004,M...原创 2017-11-09 21:27:31 · 344 阅读 · 0 评论 -
高精度运算模板
去年这个时候问亲爱的hfu老师NOIP考不考高精度,hfu老师满不在意地说这几年早都不怎么考了不用管。一年后的今天,只听见机房门口:“好同yue们,这个高精度,还是要去看一下,哈~~~。万一他考到了。。。”好吧那就硬着头皮自己写模板吧。估计即使用高精也是乘爆或者加爆long long应该不会是除法,再加上时间紧迫,先附上加减乘三种运算的模板。codevs 3116 高精度加法原创 2017-10-25 19:44:47 · 387 阅读 · 2 评论 -
Luogu 3378(堆)
传送门模板题。#include#include#include#includeusing namespace std;const int N=1e6+4; struct Heap { int a[N],siz=0; inline void push(int x) { a[++siz]=x; push_heap(a+1,a+siz+1,greater()); }原创 2017-11-05 16:55:41 · 263 阅读 · 0 评论 -
Luogu 3370(hash)
传送门模板题,如果有误请各位大佬直接打脸,毕竟这类算法以前基本没碰过。P.S.本题还可以用stl的set直接搞,更快更短orz。#include#include#include#includeusing namespace std;typedef unsigned long long ull;const int N=1e4+4;const ull base=263;原创 2017-11-05 22:48:04 · 241 阅读 · 0 评论 -
Luogu 3373(线段树标记混合下传)
传送门题意:nlogn实现区间加、区间乘、区间求和(都要求取模)题解:只要记住一句话:(x+a)*b=x*b+a*b,先乘后加,乘法标记管两个(sum,add),加法标记管一个(sum)。#include#include#include#includeusing namespace std;#define root 1,1,n#define lson rt<<1,l原创 2017-11-05 16:20:37 · 343 阅读 · 0 评论 -
Luogu 3384(树链剖分)(模板)
传送门模板题,其中线段树部分也可以使用树状数组实现(区间操作略显麻烦)。#includeusing namespace std;#define lson rt<<1,l,mid#define rson rt<<1|1,mid+1,r#define root 1,1,ntypedef long long ll;const int MAXN=1e5+4;int rot,n,m,a原创 2017-11-05 23:03:25 · 272 阅读 · 0 评论 -
Luogu 4779(dijkstra+线段树优化)(dijkstra+堆优化)
传送门题意:模板题,求有向非负权图的单源最短路题解:明说了要卡SPFA,所以只能dijkstra+数据结构优化,不管用堆还是线段树,只有能到O(nlogn)就OK。实测线段树略快。注意:每次“出队”时将当前点赋值为INF(如果硬要做删除操作就只有上平衡树了233),线段树在判断“队列为空”的边界时直接判断全局最小值是否等于INF即可。线段树优化dijkstra:#in...原创 2018-08-20 20:57:18 · 731 阅读 · 0 评论 -
Luogu 3865(st表)
传送门模板题,就怕某些毒瘤出题人卡线段树。#include#include#include#includeusing namespace std;const int N=1e5+4;int n,q;int mx[18][N],lg[N]={0,0};inline int read() { int x=0;char c=getchar(); while (c'9') c=原创 2017-11-07 19:28:36 · 265 阅读 · 0 评论 -
Luogu 3807(Lucas定理)
传送门模板:同时用于复习阶乘以及逆元的预处理。#include#include#include#includeusing namespace std;typedef long long ll;const int N=1e5+4;int fac[N<<1]={1,1},inv[N<<1]={1,1};int n,m,mod;inline int read() { in原创 2017-11-07 19:08:34 · 263 阅读 · 0 评论 -
Luogu 3386(二分图最大匹配)
传送门模板题。新技能get:存增广标记的cov数组如果使用int类型就不用每次memset(以前的版本在之前的博文中有过),可以大幅节约时间。晚安~#include#include#include#include#includeusing namespace std;const int N=1004;int n,m,eg;int head[N<<1],etot=0;原创 2017-11-06 22:25:59 · 288 阅读 · 0 评论 -
主席树模板
维护n棵1~i的前缀权值线段树,每次查询减一下就好了。 poj 2104就是模板题,裸的静态第k大,需要先离散化,不会的就用lower_bound()多试试,研究研究应该就能懂。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=1原创 2017-07-31 09:05:18 · 211 阅读 · 0 评论 -
扩展中国剩余定理模板
这就是神奇的非互质版CRT,同余方程组中各个模数可能不互质,如果再用以前互质版的做法就会出错(这个的原因我也没有深究,如果有兴趣的小伙伴懂的话欢迎在评论区里指点本蒟蒻)。 对于模数不互质的情况,需要逐个合并方程求解,具体证明如下图: 还是FZU 1402的代码, 非互质版算法同样适用于模数互质的题目,有兴趣的同学可以做一下hdu 1573 FZU 1402:#include<cstdio>原创 2017-07-31 08:53:10 · 744 阅读 · 0 评论 -
中国剩余定理模板
这个定理有两个版本,下面是互质版(非扩展版)的代码,具体讲解可以参考信息学竞赛数学一本通。做法大概就是: 把一个同余方程组: x≡b1(mod m1) x≡b2(mod m2) x≡b3(mod m3) …… x≡bn(mod mn) 转化成n个同余方程组: x≡0(mod m1) x≡0(mod m2) …… x≡1(mod mi) …… x≡0(mod mn) 每组解原创 2017-07-31 08:41:25 · 363 阅读 · 0 评论 -
后缀数组模板
说实话本人蒟蒻一枚第一次写博客就写个这么“高端“的东西感觉并不太合适,如果代码有误请大神多多指教。 具体讲解可以点击这里 还有兴趣的小伙伴可以看看国家集训队的论文,里面详细介绍了后缀数组的各种应用orz。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<cstdlib>using原创 2017-07-29 14:19:31 · 240 阅读 · 0 评论 -
tarjan(SCC)模板
hdu 1269即模板题,缩完点后判断点数是否为1即可。 图论题一定要记着memset(head,-1,sizeof(head))(如果题目不含0号点也可以memset成0),否则就坐等TLE吧。。。#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<stack>using name原创 2017-07-30 14:17:58 · 677 阅读 · 0 评论 -
Manacher模板
hdu 3068即一道Manacher的模板题,使用时记得处理每组新数据之前清空辅助数组b[i](虽然好像这题不memset也不会错)。。。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<climits>using namespace std;const int maxn=110原创 2017-07-29 14:24:47 · 382 阅读 · 0 评论 -
倍增LCA模板
poj 1330即一道倍增LCA模板题,注意在倍增往上跳时每个while语句的终止条件,WA了后几次就是因为跳飞了。。。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#include<vector>using namespace std;const int maxn=10004;int n;原创 2017-07-29 19:20:11 · 499 阅读 · 0 评论 -
C++读入优化模板
正整数:inline int read() { int x=0;char c=getchar(); while (c<'0'||c>'9') c=getchar(); while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); return x;}整数:inline int read() { int x=0,f=1;ch原创 2017-07-29 15:40:09 · 347 阅读 · 1 评论 -
Dinic模板(附带当前弧优化)
数组定义大小根据题目需要确定,参考了Flaze的博客。大多数最大流最小割的题套上模板再连好边就能过。struct EDGE { int v,nxt,r;}e[maxn*maxn*6<<1];int cur[maxn*maxn],dis[maxn*maxn],head[maxn*maxn],edge=0,source,sink,sum=0;/*inline int read() {原创 2017-07-29 14:43:57 · 855 阅读 · 4 评论 -
树状数组区间操作模板
推荐一篇博客: http://m.blog.csdn.net/blackjack_/article/details/74997479 推导过程在代码之前,模板题是Luogu 3368或者codevs线段树练习3/* pre_sum(n)=a[1]+a[2]+...+a[n] =c[1]+(c[1]+c[2])+...+(c[1]+c[2]+...+c[n])原创 2017-08-24 21:32:25 · 222 阅读 · 0 评论 -
Luogu 3382(三分)
传送门模板题。好想有个什么叫黄金分割比例优化三分,洛谷的题解里有一位大佬提到过orz。#include#include#include#includeusing namespace std;const int N=15;const double eps=1e-10;double a[N],L,R;int n;inline double fpow(double a,in原创 2017-11-06 22:02:59 · 238 阅读 · 0 评论 -
Luogu 3376(最大流)(Dinic+当前弧优化)
传送门Dinic+当前弧优化,复杂度上界为O(V^2*E),NOIP应该还不至于卡这个而支持ISAP吧。#include#include#include#include#includeusing namespace std;const int N=1e4+4,M=1e5+4,INF=0x3f3f3f3f;int n,m,source,sink;int head[N]原创 2017-11-06 20:31:50 · 370 阅读 · 0 评论 -
Luogu 3381(最小费用流)
传送门模板题。最小费用最大流,要求同时输出最大流以及最小费用,复杂度有点玄学,每增广一次,下一次SPFA的复杂度又会降低。所以这种题暂时只能这么处理:看出来有后效性的相互约束关系的就考虑用费用流解决。#include#include#include#include#includeusing namespace std;const int N=5004,M=50004,INF=0原创 2017-11-06 21:24:42 · 264 阅读 · 0 评论 -
Luogu 3375(KMP)
传送门KMP模板题,要求输出匹配点的起始位置以及模式串所有位置的nxt(也称作fail)指针。#include#include#include#include#include using namespace std;const int N=1e6+4;char T[N],W[N];int n,m,f[N];vector s;inline void getfail(cha原创 2017-11-06 20:50:12 · 218 阅读 · 0 评论 -
Luogu 3388(割点)
传送门注意:统计割点个数一定要注意算重!!!有多个儿子使当前点成为割点时计数器也只能加一次!!!#include#include#include#includeusing namespace std;const int N=1e5+4;int n,m,dfn[N],low[N],tim=0,cut=0;int head[N],etot=0;struct EDGE { in原创 2017-11-06 19:40:37 · 304 阅读 · 0 评论 -
Luogu 3379(LCA)
传送门模板题,我用倍增居然把它卡过了。(拒绝vector支持链式前向星!)P.S.在欧拉序列上进行RMQ也可以做到O(1)。倍增:#include#include#include#includeusing namespace std;const int N=5e5+4;int n,q,rot;int dep[N]={0},f[20][N];int head[N],e原创 2017-11-06 17:14:07 · 275 阅读 · 0 评论 -
欧拉线性筛模板
O(n)求欧拉函数φ(i):inline void linear_shaker() { bool vis[maxn]; memset(vis,false,sizeof(vis)); phi[1]=1; for (int i=2;i<maxn;++i) { if (!vis[i]) prime[++tot]=i,phi[i]=i-1; f原创 2017-07-31 08:58:03 · 524 阅读 · 0 评论 -
Dijkstra+堆优化模板
稳定的最短路算法,除了不能处理负环以外几乎完美无瑕,在SPFA被特殊数据卡的时候也能用。struct NODE { int id,dis; friend bool operator <(const NODE &a,const NODE &b) { return a.dis>b.dis; }};inline void dijkstra(int source)原创 2017-07-29 15:33:31 · 501 阅读 · 0 评论