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的文章的时候,我不得不承认我当时低估了这个话 ...
随机推荐
- How to change Eclipse loading image
Eclipse IDE has many customize components, the splash welcome image (purple color loading image) is ...
- 更新node和npm到最新版本
卸载 1.首先卸载nodejs,打开控制面板,然后找到程序卸载: 2.找到npm目录和npmcache 目录,直接删掉(一般情况下会在C:\Users\Caffrey\AppData\Roaming\ ...
- [LeetCode] Binary Search 二分搜索法
Given a sorted (in ascending order) integer array nums of n elements and a target value, write a fun ...
- ajax 传递中文字符参数 问题
使用ajax 传递中文字符串时, 服务端会接收不到预期的 中文字符. 此时,需要对 js中的中文字符参数进行 编码, 到达服务端后, 再为其解码 即可. 前端: var url = '....'; ...
- Nestjs 微服务
文档 工作示例 安装: $ npm i --save @nestjs/microservices main.ts import { NestFactory } from '@nestjs/core'; ...
- Nmap 进阶使用 [ 脚本篇 ]
0×01 前言 因为今天的重点并非nmap本身的使用,主要还是想借这次机会给大家介绍一些在实战中相对比较实用的nmap脚本,所以关于nmap自身的一些基础选项就不多说了,详情可参考博客端口渗透相关文章 ...
- php发送邮箱
/** * 系统邮件发送函数 * @param string $tomail 接收邮件者邮箱 * @param string $name 接收邮件者名称 * @param string $subjec ...
- mysql千万级数据量查询出所有重复的记录
查询重复的字段需要创建索引,多个条件则创建组合索引,各个条件的索引都存在则不必须创建组合索引 有些情况直接使用GROUP BY HAVING则能直接解决:但是有些情况下查询缓慢,则需要使用下面其他的方 ...
- JS操作字符串
JS操作字符串 1.函数:split() 把字符串按分隔符分割成数组. 语法:字符串.split(separator,limit); separator:分隔符. 功能:使用一个指定的分隔符把一个字符 ...
- 干货|爱奇艺CDN巡检系统技术解析
小结: 1. 中心处理系统 /1/将定制后的巡检任务拆分,通过配置与任务分发系统.CMDB*( configuration management database)将派发到边缘拨测系统/2/处理边缘拨 ...