mika的模板库
二分图最大匹配:
1.匈牙利算法:注意dfs中是dfs(c[w[i]]),搜索的是与之匹配的点。
#include<cstdio>
#include<cstring> int n,m,x,y,fi[],w[],ne[],cnt,c[],ans;
bool b[]; void add(int u,int v)
{
w[++cnt]=v;ne[cnt]=fi[u];fi[u]=cnt;
} bool dfs(int u)
{
for(int i=fi[u];i;i=ne[i])
if(!b[w[i]])
{
b[w[i]]=;
if(!c[w[i]] || dfs(c[w[i]]))
{
c[w[i]]=u;return ;
}
}
return ;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
scanf("%d",&m);cnt=;
memset(fi,,sizeof(fi));
memset(c,,sizeof(c));
for(int i=;i<=m;i++) scanf("%d%d",&x,&y),add(x,y);
for(int i=;i<=n;i++)
{
memset(b,,sizeof(b));
if(dfs(i)) ans++;
}
printf("%d\n",ans);
}
return ;
}
匈牙利算法
2.dinic算法:速度优于匈牙利算法,但是加边时需要区分两边的点。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std; int n,m,x,y,fi[],w[],ne[],v[],cnt,ans,dis[]; queue<int> q; int read()
{
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<='') {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} void add(int u,int vv,int val)
{
w[++cnt]=vv;ne[cnt]=fi[u];fi[u]=cnt;v[cnt]=val;
w[++cnt]=u;ne[cnt]=fi[vv];fi[vv]=cnt;v[cnt]=val;
} bool bfs()
{
memset(dis,-,sizeof(dis));
dis[]=;q.push();
while(!q.empty())
{
int k=q.front();q.pop();
for(int i=fi[k];i;i=ne[i])
if(v[i]> && dis[w[i]]==-)
{
dis[w[i]]=dis[k]+;
q.push(w[i]);
}
}
return dis[n*+]==- ? :;
} int dfs(int u,int vv)
{
if(u==n*+) return vv;
int kkz,now=;
for(int i=fi[u];i;i=ne[i])
if(dis[w[i]]==dis[u]+ && v[i]> && (kkz=dfs(w[i],min(vv-now,v[i]))))
{
v[i]-=kkz;v[i^]+=kkz;now+=kkz;
if(now==vv) return now;
}
if(!now) dis[u]=-;
return now;
} int main()
{
while(scanf("%d",&n)!=EOF)
{
m=read();cnt=;ans=;
memset(fi,,sizeof(fi));
for(int i=;i<=m;i++) x=read(),y=read(),add(x,y+n,);
for(int i=;i<=n;i++) add(,i,),add(i+n,*n+,);
while(bfs()) ans+=dfs(,);
printf("%d\n",ans);
}
return ;
}
dinic算法
欧拉函数:
1.公式:euler(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数,x是不为0的整数。
ans=n;
for(int i=;i*i<=n;i++)
if(!(n%i))
{
while(!(n%i)) n/=i;ans=ans/i*(i-);
}
if(n!=) ans=ans/n*(n-);
公式
2.线性筛:
phi[]=;
for(int i=;i<=n;i++)
{
if(!b[i]) a[++a[]]=i,phi[i]=i-;
for(int j=;a[j]*i<=n && j<=a[];j++)
{
b[i*a[j]]=;
if(!(i%a[j]))
{
phi[i*a[j]]=phi[i]*a[j];break;
}
phi[i*a[j]]=phi[i]*phi[a[j]];
}
}
线性筛
莫比乌斯函数:
u[]=;
for(int i=;i<=n;i++)
{
if(!b[i]) q[++q[]]=i,u[i]=-;
for(int j=;j<=q[] && i*q[j]<=n;j++)
{
b[i*q[j]]=;
if(!(i%q[j]))
{
u[i*q[j]]=;break;
}
u[i*q[j]]=-u[i];
}
}
莫比乌斯函数
线性基:线性基的异或和是序列的最大异或和。
1.单区间:
for(int i=;i<=n;i++)
for(int j=;~i;i--)
if(a[i]&(<<j))
{
if(f[j]) a[i]^=f[j];
else
{
f[j]=a[i];break;
}
}
单区间线性基
2.多区间:f[i]表示区间[i,n]的线性基。
struct node{
int x,id;
}f[N][],tmp; for(int i=n;i;i--)
{
memcpy(f[i],f[i+],sizeof(f[i+]));
tmp=(node){a[i],i};
for(int j=;~j;j--)
if(tmp.x&(<<j))
{
if(!f[i][j].x) swap(tmp,f[i][j]);
else
{
if(f[i][j].id>tmp.id) swap(tmp,f[i][j]);
tmp.x^=f[i][j].x;
}
}
}
多区间线性基
扩展欧几里得算法解二元一次方程:
int gcd(int a,int b,int &x,int &y)
{
if(!b)
{
x=;y=;return a;
}
int k=gcd(b,a%b,x,y),z=y;
y=x-a/b*y;x=z;
return k;
} void getans(int a,int b,int c,int &x,int &y)
{
int k=c/gcd(a,b,x,y);
x*=k;y*=k;
}
二元一次方程
FFT:
1.使用STL里面的complex,比较方便:
#define E complex<double>
#define pi acos(-1) void fft(E *u,int v)
{
for(int i=;i<n;i++) if(r[i]>i) swap(u[r[i]],u[i]);
for(int i=;i<n;i<<=)
{
E wn(cos(pi/i),v*sin(pi/i));
for(int j=;j<n;j+=(i<<))
{
E w(,);
for(int k=;k<i;k++,w=w*wn)
{
E x=u[j+k],y=u[i+j+k]*w;
u[j+k]=x+y;u[i+j+k]=x-y;
}
}
}
if(v==-) for(int i=;i<n;i++) u[i]/=n;
} int main()
{
n=read();for(int i=;i<=n;i++) a[i]=read();
m=read();for(int i=;i<=m;i++) b[i]=read();
m+=n;
for(n=;n<=m;n<<=) l++;
for(int i=;i<n;i++) r[i]=(r[i>>]>>)|((i&)<<(l-));
fft(a,);fft(b,);
for(int i=;i<n;i++) a[i]=a[i]*b[i];
fft(a,-);
for(int i=;i<n;i++) c[i]=(int)(a[i].real()+0.5);
}
STLcomplex FFT
2.struct定义complex型,要比STL快:
#define pi acos(-1) int n,m,l,r[N]; struct E{
double a,b;
E() {}
E(double aa,double bb):a(aa),b(bb) {}
E operator + (const E&u) const {return E(a+u.a,b+u.b);}
E operator - (const E&u) const {return E(a-u.a,b-u.b);}
E operator * (const E&u) const {return E(a*u.a-b*u.b,a*u.b+b*u.a);}
E operator !() const {return E(a,-b);}
}a[N],b[N]; void fft(E *u,int v)
{
for(int i=;i<n;i++) if(r[i]>i) swap(u[r[i]],u[i]);
for(int i=;i<n;i<<=)
{
E wn(cos(pi/i),v*sin(pi/i));
for(int j=;j<n;j+=(i<<))
{
E w(,);
for(int k=;k<i;k++,w=w*wn)
{
E x=u[j+k],y=u[i+j+k]*w;
u[j+k]=x+y;u[i+j+k]=x-y;
}
}
}
if(v==-) for(int i=;i<n;i++) u[i].a/=n;
} int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&a[i].a);
for(int i=;i<=n;i++) scanf("%d",&b[i].a);
m+=n;
for(n=;n<=m;n<<=) l++;
for(int i=;i<l;i++) r[i]=(r[i>>]>>)|((i&)<<(l-));
fft(a,);fft(b,);
for(int i=;i<n;i++) a[i]=a[i]*b[i];
fft(a,-);
for(int i=;i<n;i++) c[i]=(int){a[i].a+0.5};
}
手写complex FFT
KDtree:
1.求最小值,带更新:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define inf 999999999 int n,m,opt,x,y,root,kkz,ans; struct node{
int a[],mx[],mn[],l,r;
}a[],c[],kkzv,T; int read()
{
int x=,f=;char ch=getchar();
while(ch<'' || ch>'') {if(ch=='-') f=-;ch=getchar();}
while(ch>='' && ch<='') {x=(x<<)+(x<<)+ch-'';ch=getchar();}
return x*f;
} bool operator < (node u,node v)
{
return u.a[kkz]<v.a[kkz];
} int abs(int u)
{
return u< ? -u:u;
} int dis(node u,node v)
{
return abs(u.a[]-v.a[])+abs(u.a[]-v.a[]);
} void update(int u)
{
node l=c[c[u].l],r=c[c[u].r];
for(int i=;i<;i++)
{
if(c[u].l) c[u].mx[i]=max(c[u].mx[i],l.mx[i]),c[u].mn[i]=min(c[u].mn[i],l.mn[i]);
if(c[u].r) c[u].mx[i]=max(c[u].mx[i],r.mx[i]),c[u].mn[i]=min(c[u].mn[i],r.mn[i]);
}
} int build(int l,int r,int now)
{
kkz=now;
int mid=l+r>>;
nth_element(a+l,a+mid,a+r+);
c[mid]=a[mid];
for(int i=;i<;i++) c[mid].mn[i]=c[mid].mx[i]=c[mid].a[i];
if(l<mid) c[mid].l=build(l,mid-,now^);
if(r>mid) c[mid].r=build(mid+,r,now^);
update(mid);
return mid;
} int get(int k,node u)
{
int now=;
for(int i=;i<;i++) now+=max(,c[k].mn[i]-u.a[i]);
for(int i=;i<;i++) now+=max(,u.a[i]-c[k].mx[i]);
return now;
} void insert(int k,int now)
{
if(T.a[now]>=c[k].a[now])
{
if(c[k].r) insert(c[k].r,now^);
else
{
c[k].r=++n;c[n]=T;
for(int i=;i<;i++) c[n].mn[i]=c[n].mx[i]=c[n].a[i];
}
}
else
{
if(c[k].l) insert(c[k].l,now^);
else
{
c[k].l=++n;c[n]=T;
for(int i=;i<;i++) c[n].mn[i]=c[n].mx[i]=c[n].a[i];
}
}
update(k);
} void query(int k)
{
int d,dl=inf,dr=inf;
d=dis(c[k],T);
ans=min(ans,d);
if(c[k].l) dl=get(c[k].l,T);
if(c[k].r) dr=get(c[k].r,T);
if(dl<dr)
{
if(dl<ans) query(c[k].l);
if(dr<ans) query(c[k].r);
}
else
{
if(dr<ans) query(c[k].r);
if(dl<ans) query(c[k].l);
}
} int query(node p)
{
ans=inf;T=p;
query(root);
return ans;
} int main()
{
n=read();m=read();
for(int i=;i<=n;i++) a[i].a[]=read(),a[i].a[]=read();
root=build(,n,);
while(m--)
{
opt=read();kkzv.a[]=read();kkzv.a[]=read();
if(opt==) T=kkzv,insert(root,);
else printf("%d\n",query(kkzv));
}
return ;
}
min带修改
2.求最大值的cal函数:
int cal(int u)
{
int now=;
for(int k=;k<;k++) now+=max(abs(c[u].mx[k]-tmp.a[k]),abs(c[u].mn[k]-tmp.a[k]));
return now;
}
cal_max函数
KMP:
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std; const int N=; int t,n,next[N],len1,len2;
char s1[N],s2[N]; int cal()
{
int k=,ans=;
for(int i=;i<=len1;i++)
{
while(k> && s1[k+]!=s1[i]) k=next[k];
if(s1[k+]==s1[i]) k++;
next[i]=k;
}
k=;
for(int i=;i<=len2;i++)
{
while(k> && s1[k+]!=s2[i]) k=next[k];
if(s1[k+]==s2[i]) k++;
if(k==len1) ans++,k=next[k];
}
return ans;
} int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%s%s",s1+,s2+);
len1=strlen(s1+);len2=strlen(s2+);
printf("%d\n",cal());
}
return ;
}
KMP
mika的模板库的更多相关文章
- STL标准模板库(简介)
标准模板库(STL,Standard Template Library)是C++标准库的重要组成部分,包含了诸多在计算机科学领域里所常见的基本数据结构和基本算法,为广大C++程序员提供了一个可扩展的应 ...
- c++转载系列 std::vector模板库用法介绍
来源:http://blog.csdn.net/phoebin/article/details/3864590 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作 ...
- Handlebars模板库浅析
Handlebars模板库简单介绍 Handlebars是JavaScript一个语义模板库,通过对view(模板)和data(ajax请求的数据,一般是json)的分离来快速构建Web模板.它采用& ...
- 【转】C++标准库和标准模板库
C++强大的功能来源于其丰富的类库及库函数资源.C++标准库的内容总共在50个标准头文件中定义.在C++开发中,要尽可能地利用标准库完成.这样做的直接好处包括:(1)成本:已经作为标准提供,何苦再花费 ...
- STL标准模板库介绍
1. STL介绍 标准模板库STL是当今每个从事C++编程的人需要掌握的技术,所有很有必要总结下 本文将介绍STL并探讨它的三个主要概念:容器.迭代器.算法. STL的最大特点就是: 数据结构和算法的 ...
- c++模板库(简介)
目 录 STL 简介 ......................................................................................... ...
- 【c++】标准模板库STL入门简介与常见用法
一.STL简介 1.什么是STL STL(Standard Template Library)标准模板库,主要由容器.迭代器.算法.函数对象.内存分配器和适配器六大部分组成.STL已是标准C++的一部 ...
- C++——string类和标准模板库
一.string类 1.构造函数 string实际上是basic_string<char>的一个typedef,同时省略了与内存管理相关的参数.size_type是一个依赖于实现的整型,是 ...
- STL 简介,标准模板库
这篇文章是关于C++语言的一个新的扩展--标准模板库的(Standard Template Library),也叫STL. 当我第一次打算写一篇关于STL的文章的时候,我不得不承认我当时低估了这个话 ...
随机推荐
- Cnr
Description 写一个求阶乘的函数,实现Cmn排列,就是指从给定n个数的元素中取出指定r个数的元素,进行排序,我们用A(n,r)表示,组合,则是指从给定n个数的元素中仅仅取出指定r个数的元素, ...
- css 块元素、内联元素、内联块元素
块元素.内联元素.内联块元素: 元素就是标签,布局中常用的有三种标签,块元素.内联元素.内联块元素,了解这三种元素的特性,才能熟练的进行页面布局. 块元素: 块元素,也可以称为行元素,布局中常用的标签 ...
- (56)Wangdao.com第八天_JavaScript 流程控制语句
流程控制语句 条件判断语句 if 条件分支语句 switch 循环语句 for .while switch 和 if 都可以相互转换,switch 的性能更优于 if 1. 条件判断语句 if 在某条 ...
- (96)Wangdao.com_第二十九天_表单事件
表单事件 input 事件 select 事件 change 事件 invalid 事件 reset 事件 submit 事件 ...
- DS博客作业01--线性表
1.本周学习总结(0--2分) 1.1思维导图 1.2.谈谈你对线性表的认识及学习体会. 1.线性表的内容上了三星期的课,相对来说内容比较丰富,尤其是链表方面,包含单链表,双链表和循环链表.作为第一部 ...
- 内置对象之request对象
内置对象就是(容器)已经创建好的对象,可以被直接使用.当用户发送一个请求给容器,它就会自动创建一个对象来处理客户端发送来的消息,如request这个对象,可以获取到用户(客户端)发送来的信息.它的常见 ...
- Docker入门级简单的操作命令
在理解 Docker 之前,首先得先区分清楚两个概念,容器和虚拟机. 虚拟机都需要有自己的操作系统,虚拟机一旦被开启,预分配给它的资源将全部被占用. 容器技术是和我们的宿主机共享硬件资源及操作系统,可 ...
- Android数据库无缝升级方案
软件迭代过程中,业务不断更新,也要求软件持续更新.相应地,数据库更新升级也是不可避免的一个环节.Android作为客户端应用,数据库升级相对于服务端来说会麻烦一些.常见的升级方式有: 1.删除旧表和数 ...
- c++ STL概述
2018-09-26 c++ STL(标准模板库)是一套通过c++模板类实现的标准类库,提供了通用的模板和函数,功能强大,大大的提高了c++的开发效率. c++ STL的核心主要包括三个组件:(1)容 ...
- 2019春第十周作业Compile Summarize
这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 在这里 我在这个课程的目标是 能够对C语言的编写更加得心应手 这个作业在那个具体方面帮助我实现目标 结构体更进一步 参考文献与网址 C语言 ...