//PS:最近修改日期:2017-11-07 20:41:44
首先感觉这种模板类的东西写了还是很有意义的,毕竟时不时的可以拿出来借鉴一下。
现在因为刚开始写这一类的东西,所以说还不是很详细,若有读者感觉可以补充,欢迎反馈!!感激不尽!!
注意!在本篇文章中,有:
#include<bits/stdc++.h>
#define LL long long
typedef pair <int,int> pill;
using namespace std;
所以以下的LL指的就是long long 的数据类型。
并且pill 指的是2元整形容器pair<int,int>
目录:
一、读入优化
二、快速幂
三、Floyd算法
四、Dijkstra算法
五、Dijkstra算法的堆优化
六、欧几里得算法
七、扩展欧几里得
八、矩阵快速幂
九、ST表
一、读入优化 //读入数据的大小以MB作为单位的。
inline LL read(){ LL base=0,flag=1; char ch='.'; while(ch>'9'||ch<'0'){ ch=getchar(); if(ch=='-') flag=-1; } while(ch>='0'&&ch<='9'){ base=base*10+ch-'0'; ch=getchar(); }; return flag*base; }
二、快速幂 //输出(x^k)%p的值,满足k非常大,n也非常大
inline LL quick_pow(LL x,LL k){ LL base=1;
while(k){ if(k&1) base=(base*x)%p; k>>=1; x=(x*x)%p; } return base; }
三、Floyd算法 //求所有的节点到每个节点的最短路的距离
inline void Floyd (){ memset(dis,0x3f,sizeof(dis)); for(int k=1;k<=n;k++){ for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]; } } } return; }
四、Dijkstra算法 //求n点到其他点的单源最短路径长度
inline void Dijkstra (int x){ int min=1e9+1,place=0; dis[x]=0; memset(dis,0x3f,sizeof(dis)); memset(vis,false,sizeof(vis)); for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ if(!vis[j]&&dis[j]<min){ min=dis[j]; place=j; } } if(place==0)break; vis[place]=true; for(int j=head[place];j!=-1;j=edge[j].next){ if(!vis[edge[j].to]&&dis[edge[j].to]>(edge[j].dis+dis[place])){ dis[edge[j].to]=edge[j].dis+dis[place]; } } } return; }
五、Dijkstra的堆优化 //求n点到其他点的单源最短路径长度
inline void Dijkstra (int x){ priority_queue<pill,vector<pill>,greater<pill> >q; dis[s]=0; q.push(make_pair(dis[s],s)); while(!q.empty()){ pill temp=q.top(); q.pop(); numb=temp.second; if(vis[numb])continue; vis[numb]=1; for(int i=head[numb];i!=-1;i=edge[i].next){ if(dis[edge[i].to]>dis[numb]+edge[i].dis){ dis[edge[i].to]=dis[numb]+edge[i].dis; q.push(make_pair(dis[edge[i].to],edge[i].to)); } } } return; }
六、欧几里得算法 //求最大公约数
inline LL gcd(LL a,LL b){ if(a%b==0)return b; else return gcd(b,a%b); }
七、扩展欧几里得 //在求最大公约数的同时求ax+by=gcd(a,b)的整数解
inline LL exgcd(LL a,LL b,LL &x,LL &y){ if(b==0){ x=1; y=0; return a; } else{ ans=exgcd(b,a%b,x,y); LL temp=x; x=y; y=temp-(a/b)*y; return ans; } }
八、矩阵快速幂 //线性代数中比较重要的一课
struct Mat{ LL mat[105][105]; } Mat operator *(Mat a,Mat b){ Mat c; memset(c.mat,0,sizeof(c.mat)); for(int k=0;k<n;k++) for(int i=0;i<n;i++) for(int j=0;j<n;j++) c.mat[i][j]+=a.mat[i][k]*b.mat[k][j]; return c; } void work(){ for(int i=0;i<n;i++){ for(int j=0;j<n;j++) scanf("%lld",&x.mat[i][j]); res.mat[i][i]=1; } } while(k){ if(k&1) res=res*x; k>>=1; x=x*x; } }
九、ST表 //灵活运用二进制进行加速的访问操作
inline void ST(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&f[i][0]); LOG[0]=-1; for(int i=1;i<=n;i++) LOG[i]=LOG[i/2]+1; power[0]=1; for(int i=1;i<=LOG[n];i++) power[i]=power[i-1]*2; for(int j=1;j<=LOG[n];j++) for(int i=1;i<=n;i++) if(i+power[j-1]-1<=n) f[i][j]=max(f[i][j-1],f[i+power[j-1]][j-1]); return; }
等待补充。。。。。。