存模板
acmer_zp
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
线段树
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define LL long longLL x[10010],sum;struct Node{ LL l,r,sum,flag,odd,even;} node[100010];void bui原创 2016-11-09 10:05:02 · 320 阅读 · 0 评论 -
二分最大匹配数
#include#include#include#includeusing namespace std;int z[1010][1010],vis[1010],dis[1010],n,m;int dfs(int k){ for(int i=1; i<=n; i++) if(z[k][i]&&!vis[i])//i点未标记,k于i可配对 {原创 2016-10-18 19:47:28 · 393 阅读 · 0 评论 -
矩阵快速幂
#include#include#includeusing namespace std;#define mod 1000007typedef long long LL;struct zp{ LL Map[3][3];};zp jx(zp a,zp b)//矩阵相乘{ zp p; for(int i=0; i<3; i++) for(int原创 2016-10-18 19:48:41 · 292 阅读 · 0 评论 -
逆序数
#include#include#include#includeusing namespace std;long long cnt,k;int a[1000020],c[1000020];void merge(int a[],int first,int mid,int last,int c[]){ int i=first,j=mid+1; int m=mid,n=l原创 2016-10-18 19:49:09 · 364 阅读 · 0 评论 -
网络流EK算法
#include#include#include#include#include#define INF 0x3f3f3f3fusing namespace std;int x[510][510],n,m;//存容量struct zp//标号{ int head;//上一个节点 int value;//最多传来的流量} w[1010];int maxriver(原创 2016-10-18 19:49:50 · 464 阅读 · 0 评论 -
一维和二维树状数组
#include//注意0的死循环#include#include#includeusing namespace std;typedef long long int LL;const LL mod=1e9+7;LL n,m,x[1000010],arr[1010][1010];LL lowbit(LL t)//求低位 0 会陷入死循环{ return t&(-t);}原创 2016-10-18 19:50:22 · 305 阅读 · 0 评论 -
整数划分
整数划分n的所有方式:#include#include#include#includeusing namespace std;int x[20][20];int main(){ int ncase; scanf("%d",&ncase); memset(x,0,sizeof(x));//将n划分为任意正整数之和x[i][j]代表将i分为最大不超过j的数原创 2016-10-18 19:51:58 · 482 阅读 · 0 评论 -
字典树
#include#include#include#includeusing namespace std;const int N=2*1e5+10;int n,m,q,k,j;struct Dictree//字典树{ int cont;//单词出现次数 struct Dictree *tree[26];//26个子节点}*a;//a为头结点是空的void ini原创 2016-10-18 19:52:43 · 295 阅读 · 0 评论 -
最长递增子序列(nlogn),最长公共子串(连续),最长公共子序列(不连续)
最长递增子序列(nlogn):#include#include#include#includeusing namespace std;int x[500010],a[500010];int main(){ int n,Z=0; while(~scanf("%d",&n)) { for(int i=0;i<n;i++) {原创 2016-10-18 19:53:16 · 681 阅读 · 0 评论 -
神奇的二进制
NYOJ找球号:计算一个数二进制每一位的贡献:#include#include#include#include#includeusing namespace std;int x[110];void change(int a)//把a转化为二进制存到数组里{ for(int i=0; a!=0; i++) { if(a&1)原创 2016-10-18 20:23:25 · 647 阅读 · 0 评论 -
AC自动机
#include#include#include#include#includeusing namespace std;struct node{ int Next[500010][26];//数组存图 int fail[500010];//fail指针 int End[500010];//每个模式串出现的次数 int root,L;//根节点标号为0原创 2016-10-18 18:26:22 · 400 阅读 · 0 评论 -
Bellman及其优化
#include#include#include#include#include#include#include#include#define MAXX 1e6using namespace std;int first[1000010],NEXT[1000010],u[1000010],v[1000010],w[1000010],cont,dis[1000010],vis[1原创 2016-10-18 18:28:41 · 380 阅读 · 0 评论 -
Codeforces Round #378 (Div. 2) D题(二分答案,贪心判断)
#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int x[100100],y[100010],flag[100010];int judge(int n,int m)//从前往后找是否可通过所有考试{ int sum=0; mems原创 2016-11-22 22:01:11 · 757 阅读 · 0 评论 -
后缀数组(不可重叠最长重复子串)
poj 1743 二分答案,把题目变成判定性问题:判断是否 存在两个长度为k的子串是相同的,且不重叠。解决这个问题的关键还是利用 height数组。把排序后的后缀分成若干组,其中每组的后缀之间的height值都 不小于k。 有希望成为最长公共前缀不小于k的两个后缀一定在同一组。然 后对于每组后缀,只须判断每个后缀的sa值的最大值和最小值之差是否不小于 k。如果有一组满足,则说明存在,否原创 2016-12-14 21:29:23 · 593 阅读 · 0 评论 -
01,完全,多重背包
01背包每个只能背一次优化为一维数组后要从后往前背。 完全背包每个有多次所以可以从后往前背。 多重背包转化为01和多重背包求解。#include &amp;lt;cstdio&amp;gt;#include &amp;lt;cstring&amp;gt;#include &amp;lt;iostream&amp;gt;#include &amp;lt;algorithm&原创 2016-11-22 15:02:59 · 340 阅读 · 0 评论 -
Dijkstar及其优先队列优化
#include#include#include#include#include#include#define MAXX 1000000using namespace std;int n,m,s,t,cont,x[1010][1010];int first[MAXX],next1[MAXX],u[MAXX],v[MAXX],w[MAXX],dis[MAXX],vis[MAXX];原创 2016-10-18 18:29:13 · 744 阅读 · 0 评论 -
最小费用流
单向图#include<cstdio>//每次找费用的最短路,更新残留网络图直到找不到最短路为止#include<cstring>//最大费用 权值取负值 结果取负值#include<iostream>#include<algorithm>#include<queue>using namespace std;const int inf=0x3f3f3f3f;struct Node原创 2016-11-12 22:34:53 · 1673 阅读 · 0 评论 -
最小割最小割边
#include <cstdio>//最小割,图的割边,割断后无法从源点到汇点,最小割边的容量和为该图的最大流;#include <cstring>//最大点权独立和=所有点的权值和-最小割#include <algorithm>//点即是边,拆点,拆边#include <iostream>#include <queue>using namespace std;#define LL lo原创 2016-11-20 16:06:55 · 1504 阅读 · 0 评论 -
多边形重心
#include#include#include#include#includeusing namespace std;#define INF 0.0000001const int N=10010;int n;typedef struct point{ double x,y; point():x(0),y(0){}}point;point p[N],ANS;原创 2016-10-18 19:47:00 · 273 阅读 · 0 评论 -
大数模板
#include#include#include#include#include#includeusing namespace std;#define MAXN 9999#define MAXSIZE 10#define DLEN 4class BigNum{private: int a[500]; //可以控制大数的位数 int len;原创 2016-10-18 19:46:20 · 284 阅读 · 0 评论 -
尺取法
#include//尺取法判断x串中至少出现满足m条件的最小长度#include#include#include#includeusing namespace std;int vis[100],dis[100];int judge()//判断是否满足条件{ for(int i=0; i<26; i++) if(vis[i]<dis[i])原创 2016-10-18 19:38:55 · 338 阅读 · 0 评论 -
单调栈
#include//单调栈#include#include#include#includeusing namespace std;struct zp{ int v;//该节点的值 int num;//该节点之前(包括自己)大于等于自己的有几个}w[1010];int main(){ int n; while(~scanf("%d",&n)&&n)原创 2016-10-30 21:28:55 · 330 阅读 · 0 评论 -
双广搜
题目链接 题目大意:给你4个棋子的坐标,给你最终状态的4个坐标,每个棋子可以走4个方向,入过下一步是空格则可以走,想一步是棋子则走到对应的下一个位置(要是空格才可以,是棋子就不可以),问在8步之内能否走到; 思路:开8维char数组记录4个棋子的坐标,int会MLE;同时从两个方向搜索,如果在8步内某个状态搜到了相反状态则找到答案,否则没有答案;sort是用来简化状态的比如1 1 2 2 3 3原创 2017-01-16 11:49:58 · 592 阅读 · 0 评论 -
迭代深搜+A*(IDA*)
HDU 2234 无题I 题目意思中文的也就不用翻译了; 广搜由于要记录大量的状态因此耗费的空间比较大,深搜由于要遍历所有的状态,所以耗费的时间就比较高; A*算法就相当于普通的搜索算法加了一个很厉害的剪枝,让结果尽量最优的先搜具体的请百度,这是一个神奇的东西,非常强大; 迭代深搜就是广搜加深搜,用深搜的空间和广搜的时间来解决问题; 每次固定深搜的层数,就相当于广搜到了第几层,用深搜遍历,原创 2017-01-15 15:37:05 · 734 阅读 · 0 评论 -
bfs+预处理+路径回溯+字典序最小+hash
HDU 1043 Eight HDU 3567-Eight II HDU 1430 魔板 这两道题很像,在这里我们看第二道,第一道比第二道简单好多; 题目意思是给你起始和终止状态让你输出路径要求字典序最小; X代表空的位置每次X都可以和相应的上下左右互换位置,让求最终换到终止状态的路径字典序最小; 每一次都求一遍肯定会超时,因为每一种起始状态可以对应18W多的终止状态,200次; 在这原创 2017-01-15 15:16:58 · 884 阅读 · 0 评论 -
康拓展开与逆展开
题目链接别人关于康托展开与逆展开的博客 康拓展开是对一个自然排列到一个自然数的映射,它们是一一对应的。#include<cstdio>#include<cstring>#include<queue>#include<iostream>#include<algorithm>using namespace std;struct zp{ int Hash; int ko;原创 2017-01-10 17:55:51 · 377 阅读 · 0 评论 -
STL
hpuoj 1193: Interval [STL、双指针、二分] 注意题目下标是从1开始的;#include <cstdio>//预处理前缀和,枚举最短区间,用单调的数组维护走过的前缀和,用于二分查找>=M的值,则后面的所有区间都满足条件#include <vector>//把所有满足的区间累加起来得到答案#include <map>#include <set>#include <cst原创 2016-11-30 20:59:55 · 404 阅读 · 0 评论 -
最小费用最大流(拆边)
题目大概意思是,有N个城市M条边,要从1城市到N城市运送K的物品,求最少花费,每个边有一个系数ai花费的钱是ai*这条边上运送物资数的平方,比如在系数为3的边上运送了2的物品,则需要3*2*2的花费; 思路:由于每条边的容量不超过5,所以可以把每一条边拆成容量条流量为1的边,他们的花费分别为1*ai,3*ai,5*ai,7*ai,9*ai; 花费依次递增,然后每次找的最短路都是最小的,前几次的加原创 2016-11-16 20:04:58 · 1232 阅读 · 0 评论 -
带权二分图匹配KM算法
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int INF=0x7fffffff;int flag;struct zp{ int x,y;}man[200],house[200];int x[200][200],mn,ho,l原创 2016-11-11 17:43:56 · 814 阅读 · 1 评论 -
网络最大流SAP算法
#include<cstdio>//拆点 将1~n的女生每个拆成两个分别为n+1到2*n,坏女生连的是和自己关系不好的男生#include<cstring>#include<algorithm>#include<iostream>using namespace std;const int INF=0x7fffffff;int f[100010],n,m,p,k,cont,arr[1010原创 2016-11-01 20:04:57 · 353 阅读 · 0 评论 -
后缀数组
#include//sa为后缀数组,把后缀从小到大排序把后缀开头存起来,rank为名次数组,以i开头的后缀在所有后缀中排第几#include#include#include#include#define F(x) ((x)/3+((x)%3==1?0:tb))#define G(x) ((x)<tb?(x)*3+1:((x)-tb)*3+2)using namespace std;原创 2016-10-27 16:21:56 · 315 阅读 · 0 评论 -
Fleury算法求欧拉路径
注意是有向图#include//图联通 并且有2个或者没有奇数度节点,没有的是欧拉回路#include#include#include#include#includeusing namespace std;const int maxn=1e6+10;struct Edge{ int from,to;}z;vector w;vector s[maxn];int原创 2016-10-23 20:45:25 · 536 阅读 · 0 评论 -
无向图欧拉路的判定
#include//图联通 并且有2个或者没有奇数度节点,没有的是欧拉回路#include#include#include#includeusing namespace std;const int maxn=1e6+10;int bin[maxn];int finds(int x){ int flag=x,j; while(x!=bin[x])原创 2016-10-23 18:44:31 · 806 阅读 · 0 评论 -
Floyd最短路
#include#include#include#includeusing namespace std;const int MAXN=1e3+10;int x[MAXN][MAXN]int main(){ int n,m;//n个点m条边 while(~scanf("%d%d",&n,&m)) { int a,b,c; mem原创 2016-10-18 18:30:55 · 356 阅读 · 0 评论 -
kruscal
#include//m条边,n个点#include#include#includeusing namespace std;int vis[100010];struct zp{ int u; int v; int w;} x[1000010];bool cmp(zp a,zp b){ return a.w<b.w;}int FIND(int n原创 2016-10-18 19:06:40 · 365 阅读 · 0 评论 -
prim及其:队列优化
prim://矩阵输入的prim 有n*n的矩阵,求最小生成树#include#include#define spot 1000const int inf=0x3f3f3f3f;int a[spot+10][spot+10],dis[spot+10],b[spot+10]; //a[][]存矩阵,b[]标记,dis[]距离int main(){ int n;原创 2016-10-18 19:11:51 · 547 阅读 · 0 评论 -
表达式求值
#include#include#include#include#include#include#include#includeusing namespace std;string getstr(char str[])//处理字符串中的空格和最后的等号,还有字符串中的负号{ int len=strlen(str); string a; for(int i原创 2016-10-18 19:16:27 · 314 阅读 · 0 评论 -
比较杂的小算法
并查集:int finds(int x)//找老大{ int j,d=x; while(x!=a[x]) x=a[x]; while(a[d]!=x) { j=d; d=a[d]; a[j]=x; } return x;}int merger(int a,int b)//合并老大原创 2016-10-18 19:37:27 · 435 阅读 · 0 评论 -
dinic网络最大流
#include#include#include#include#includeusing namespace std;const int inf=0x7fffffff;int n,m,t,cnt;struct zp{ int u,v,w,Next;}Map[1000010];int dis[1010],head[1010];void add(int u原创 2016-10-18 18:30:29 · 337 阅读 · 0 评论
分享