[不断更新中]模板

PS:以后把模板就放这里了~qwq 有时间就填坑233

常用定义

#define Re register
#define Ms(a,b) memset(a,(b),sizof(a))
#define Fo(i,a,b) for(Re int i=(a),_=(b);i<=_;i++)
#define Ro(i,a,b) for(Re int i=(b),_=(a);i>=_;i--)
#define Ee(i,u) for(Re int i=head[u],v;i;i=nxt[i])
typedef long long LL;

数学

筛法

线性筛质数

void getpri() {
	int tot=0;
	for(int i=2;i<=n;i++) {
		if(!vis[i]) pri[++tot]=i;
		for(int j=1;i*pri[j]<=n&&j<=cnt;j++) {
			vis[i*pri[j]]=1;
			if(i%pri[j]==0) break;
		}
	}
}

欧拉函数

void getphi() {
	//phi[mn]=phi[m]*phi[n] (gcd(m,n)==1)
	//phi[p]=p-1
	//phi[np]=phi[n]*p
    int tot=0;
    for(int i=2;i<=n;i++) {
        if(!vis[i]) pri[i]=i,phi[i]=i-1;
        for(int j=1;j<=tot&&i*pri[j]<=n;j++) {
            vis[i*pri[j]]=1;
            if(i%pri[j]==0) {
                phi[i*pri[j]]=phi[i]*pri[j];
                break;
            } 
            phi[i*pri[j]]=phi[i]*(pri[j]-1);
        }
    }
}

int getphi(int x) {//phi[i]=i*(1-1/p1)*(1-1/p2)*....
	int sqr=sqrt(x),ret=x;
	Fo(i,2,sqr) {
		if(x%i==0) ret=ret/i*(i-1);
		while(x%i==0) x/=i;
	}
	return ret;
}

莫比乌斯函数

void getmu() {
	int tot=0;
	for(int i=1;i<=n;i++) {
		if(!vis[i]) pri[++tot]=i,mu[i]=-1;
		for(int j=1;j<=tot&&i*pri[j]<=n;j++) {
			vis[i*pri[j]]=1;
			if(i%pri[j]==0) break;//mu[i*pri[j]]=0;
			mu[i*pri[j]]=-mu[i];
		}
 	}
}

分解质因数

void div(int x) {
	int sqr=sqrt(x);
	Fo(i,2,sqr) {
		if(x%i==0) cout<<i<<" ";
		while(x%i==0) x/=i;
	}
}

void div(int x) {
	int sqr=sqrt(x);
	for(int i=1;i<=tot&&pri[i]<=sqr;i++) {
		if(x%pri[i]==0) cout<<pri[i]<<" ";
		while(x%pri[i]==0) x/=pri[i];
	}
}

快速幂

typedef long long LL;
LL qpow(LL a,LL b) {//无模数 
	LL t=1;
	while(b) {
		if(b&1) t*=a;
		a*=a; b>>=1;
	}
	return t;
}

LL qpow(LL a,LL b,LL q) {//有模数 
	LL t=1;
	while(b) {
		if(b&1) t=t*a%p;
		a=a*a%p; b>>=1;
	}
	return t;
}

矩阵乘法&快速幂

struct Matrix{
	int da[N][N];
	void clear() {Ms(da,0);}
	Matrix operator * (const Matrix oth) {
		Matrix t;
		Fo(i,1,n) Fo(j,1,n) Fo(k,1,n) 
            t.da[i][j]=da[i][k]*oth.da[k][j];
		return t;
	}
}

Matrix Qpow(Matrix a,int b) {//快速幂
	Matrix t;
	Fo(i,1,n) t.da[i][i]=1;
	while(b) {
		if(b&1) t=t*a;
		a=a*a; b>>=1;
	}
	return t;
}

ST表

一维

void init() {
	lg2[1]=0; Fo(i,2,n) lg2[i]=lg2[i-1]+(1<<(lg2[i-1]+1)==i);
	Fo(j,1,lg[n]) for(Re int i=1;i<=n;i++) {
        int vi=min(n,i+(1<<(j-1)));
		mx[i][j]=max(mx[i][j-1],mx[vi][j-1]);
    }
}

void qry(int l,int r) {
	int k=lg2[r-l+1];
	return max(mx[l][k],mx[r-(1<<k)+1][k]);
}

二维

void init() {
	lg[1]=0; Fo(i,2,300) lg[i]=lg[i-1]+((1<<(lg[i-1]+1))==i);
	Fo(i,1,lg[n]) Fo(x,1,n) Fo(y,1,m) 
		f[x][y][i][0]=max(f[x][y][i-1][0],f[min(n,x+(1<<(i-1)))][y][i-1][0]);
	Fo(i,1,lg[m]) Fo(x,1,n) Fo(y,1,m) 
		f[x][y][0][i]=max(f[x][y][0][i-1],f[x][min(m,y+(1<<(i-1)))][0][i-1]);
	Fo(i,1,lg[n]) Fo(j,1,lg[m]) Fo(x,1,n) Fo(y,1,m) {
		int vx=min(n,x+(1<<(i-1))),vy=min(m,y+(1<<(j-1)));
		f[x][y][i][j]=max(max(f[x][y][i-1][j-1],f[vx][vy][i-1][j-1])
			,max(f[vx][y][i-1][j-1],f[x][vy][i-1][j-1]));
	}	
}

int qry(int x1,int y1,int x2,int y2) {
	int k1=lg[x2-x1+1],k2=lg[y2-y1+1];
	return max(max(f[x1][y1][k1][k2],f[x2-(1<<k1)+1][y2-(1<<k2)+1][k1][k2])
		,max(f[x2-(1<<k1)+1][y1][k1][k2],f[x1][y2-(1<<k2)+1][k1][k2]));
}

图论

Dijkstra

typedef pair<int,int> PII;
priority_queue <PII,vector<PII>,greater<PII> > Q;
void Dij() {
	while(!Q.empty()) Q.pop(); Ms(inq,0); Ms(dis,0x3f);
	Q.push(PII(dis[S]=0,S));
	while(!Q.empty()) {
		int u=Q.top().second;Q.pop();
		if(inq[u]) continue; inq[u]=1;
		Ee(i,u) if(dis[(v=to[i])]>dis[u]+cst[i]) 
			Q.push(PII(dis[v]=dis[u]+cst[i],v));
	}
}

字符串

KMP

void KMP(char *s) {
	int len=strlen(s+1),now=0; Ms(nxt,0);
	Fo(i,2,len) {
		while(now&&s[now+1]!=s[i]) now=nxt[now];
		if(s[now+1]==s[i]) now++;
		nxt[i]=now;
	}
}

Manacher

void Manacher(char *s) {
	int id=0,mx=0,len=strlen(s+1); Ms(p,0);
	Fo(i,1,len) {
		p[i]=i>mx?min(p[id*2-i],mx-i):1;
		while(i-p[i]>=1&&i+p[i]<=len&&s[i+p[i]]==s[i-p[i]]) p[i]++;
		//如果字符串左右两端加上不同字符则不需边界判断
		if(i+p[i]>mx) mx=i+p[i],id=i; 
	}
}

AC自动机

queue<int> Q;
struct ACM{
	int val[N],fal[N],cnt[N][26],cnt;
	void clear() {Ms(fal,0),Ms(val,0),Ms(cnt,0),cnt=0;}
	void ins(char *s) {
		int len=strlen(s+1),now=0;
		Fo(i,1,len) {
			int v=s[i]-'a';
			if(!nd[now][v]) nd[now][v]=++cnt;
			now=nd[now][v];
		}
		val[now]++;
	}
	void build() {
		Fo(i,0,25) if(nd[0][i]) fal[nd[0][i]]=0,Q.push(nd[0][i]);
		while(!Q.empty()) {
			int u=Q.front(); Q.pop();
			Fo(i,0,25) if(!nd[u][i]) nd[u][i]=nd[fal[u]][i];
				else fal[nd[u][i]]=nd[fal[u]][i],Q.push(nd[u][i]);
		}
	}
	int qry(char *s) {
		int len=strlen(s+1),now=0,res=0;
		Fo(i,1,len) {
			now=nd[now][s[i]-'a'];
			for(Re t=now;t&&val[t];t=fal[t]) res+=val[t];//1
		}
		return res;
	}
};

网络流

Dinic

bool bfs() {
    Ms(dis,0);
    int h=0,t=1; que[++h]=S; dis[S]=1;
    while(h<=t) {
        int u=que[h++];
        Ee(i,u) if(!dis[to[i]]&&cst[i]>0)
            dis[to[i]]=dis[u]+1,que[++t]=to[i];
    }
    return dis[T];
}

int dfs(int u,int flow) {
    if(u==T) return flow;
    int used=0;
    for(register int &i=cur[u],v;i;i=nxt[i]) 
        if(cst[i]>0&&dis[(v=to[i])]==dis[u]+1) {
            int tmp=dfs(v,min(flow-used,cst[i]));
            cst[i]-=tmp,cst[i^1]+=tmp;
            used+=tmp; if(used==flow) return flow;
        }
    if(!used) dis[u]=-1;
    return used;    
}

int dinic() {
    int res=0;
    while(bfs()) {
        Fo(i,0,T) cur[i]=head[i];
        res+=dfs(S,INF);
    }
    return res;
}

ISAP

//By Menteur_Hxy
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define Re register
#define Fo(i,a,b) for(Re int i=(a),_=(b);i<=_;i++)
#define Ee(i,u) for(Re int i=head[u],v;i;i=nxt[i])
#define add(a,b,c) nxt[++cnt]=head[a],to[cnt]=b,cst[cnt]=c,head[a]=cnt
using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}
	while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
	return x*f;
}

const int N=10010,M=100010,INF=0x3f3f3f3f;
int n,m,s,t,cnt=1,ans;
int nxt[M<<1],to[M<<1],cst[M<<1],head[N],cur[N];
int gap[N],dis[N],que[N],S[N];

void bfs() {
	gap[1]=1;dis[t]=1;
	int he=0,ta=1; que[++he]=t;
	while(he<=ta) {
		int u=que[he++];
		Ee(i,u) if(!dis[(v=to[i])]) {
			dis[v]=dis[u]+1;
			gap[dis[v]]++;
			que[++ta]=v;
		}
	}
}

void ISAP() {
	bfs();
	memcpy(cur,head,sizeof(head));
	int u=s,top=0;
	while(dis[s]<n+1) {
//		cout<<dis[s]<<endl;
		if(u==t) {
			int tmp=INF,now;
			Fo(i,0,top-1) if(tmp>cst[S[i]]) tmp=cst[S[i]],now=i;
			Fo(i,0,top-1) cst[S[i]]-=tmp,cst[S[i]^1]+=tmp;
			ans+=tmp; top=now;
			u=to[S[top]^1];
			continue;
		}
		int v,fla=0;
		for(register int &i=cur[u];i;i=nxt[i]) 
			if(cst[i]&&dis[(v=to[i])]+1==dis[u]) {fla=1;break;}
		if(fla) {S[top++]=cur[u]; u=v; continue;}
		int tmp=n+1;
		Ee(i,u) if(cst[i]&&dis[(v=to[i])]<tmp)
			tmp=dis[v],cur[u]=i;
		gap[dis[u]]--;
		if(!gap[dis[u]]) return ;
		gap[(dis[u]=tmp+1)]++;
		if(u!=s) u=to[S[--top]^1];
	}
	return ;
}

int main() {
	n=read(),m=read(),s=read(),t=read();
	Fo(i,1,m) f{
		int a=read(),b=read(),c=read();
		add(a,b,c); add(b,a,0);
	}
	ISAP();
	printf("%d",ans);
	return 0;
}

数据结构

树状数组

#define Lof(i,a,b) for(Re int i=(a),_=(b);i<=_;i+=i&-i)
#define Lor(i,a) for(Re int i=(a);i;i-=i&-i)
struct BIT{
	int da[N];
	void clear() {Ms(da,0);}
	void Modify(int x,int d) {Lof(i,x,n)da[x]+=d;}
	int query(int x) {int t=0;Lor(i,x)t+=da[x];return t;}
}T;

struct TDBIT{
	int da[N][N][N];
	void clear() {Ms(da,0);}
	void Modify(int p,int x,int y,int d) { Lof(i,x,n) Lof(j,y,m) da[p][i][j]+=d;}
	int qry(int p,int x,int y) {int t=0;Lor(i,x) Lor(j,y) t+=da[p][i][j];return t;}
	int query(int p,int x1,int y1,int x2,int y2) {return qry(p,x2,y2)+qry(p,x1-1,y1-1)-qry(p,x1-1,y2)-qry(p,x2,y1-1);}
}T;

左偏树

int nd[N][2],dis[N],val[N],fa[N];

#define ls nd[x][0]
#define rs nd[x][1]
int merge(int x,int y) {
	if(!x||!y) return x+y;
	if(val[x]>val[y]||(val[x]==val[y]&&x>y)) swap(x,y);
	fa[rs=merge(rs,y)]=x;
	if(dis[ls]<dis[rs]) swap(ls,rs);
	dis[x]=dis[rs]+1;
	return x;
}

void pop(int x) {
	val[x]=-1; fa[ls]=fa[rs]=0;
	merge(ls,rs);
}

int getf(int x) {
	while(fa[x]) x=fa[x]; return x;
}

主席树

//以区间第k小为例
void ins(int o1,int &o2,int l,int r,int d) {
	si[o2=++tot]=si[o1]+1;
	if(l==r) {ls[o2]=ls[o1];rs[o2]=rs[o1];return ;}
	int mid=(l+r)>>1;
	if(d<=mid) ins(ls[o1],ls[o2],l,mid,d),rs[o2]=rs[o1];
	else ins(rs[o1],rs[o2],mid+1,r,d),ls[o2]=ls[o1];
}

int qry(int o1,int o2,int l,int r,int k) {
	if(l==r) return l;
	int mid=(l+r)>>1,tmp=si[ls[o2]]-si[ls[o2]];
	if(k<=tmp) return qry(ls[o1],ls[o2],l,mid,k);
	else return qry(rs[o1],rs[o2],mid+1,r,k-tmp);
}

其他

高精度

(希望没错qwq)
PS:建议复制下来查看~


const int pwer=8,bas=100000000;

struct bign {
	vector<int> s;
	bign& clean() {while(!s.back()&&s.size()>1)s.pop_back();return *this;}
	bign(LL num=0) {*this=num;}
	bign(string str) {*this=str;}
	bign& operator=(LL num) {
		s.clear();
		do {
			s.push_back(num%bas);
			num/=bas;
		} while(num>0);
		return *this;
	}
	bign& operator=(const string &str) {
		s.clear(); 
		int x,len=(str.length()-1)/pwer+1;
		Fo(i,0,len-1) {
			int ed=str.length()-i*pwer;
			int st=max(0,ed-pwer);
			sscanf(str.substr(st,ed-st).c_str(),"%d",&x);//1
			s.push_back(x);
		}
		return (*this).clean();
	}
	bign operator+(const bign &num) const {
		bign c; c.s.clear();
		for(Re int i=0,las=0;;i++) {
			if(!las&&i>=s.size()&&i>=num.s.size()) break;//2
			int x=las;
			if(i<s.size()) x+=s[i];
			if(i<num.s.size()) x+=num.s[i];
			c.s.push_back(x%bas);
			las=x/bas;
		}
		return c.clean();
	}
	bign operator-(const bign &num) const {
		bign c; c.s.clear();
		for(Re int i=0,las=0;;i++) {
			if(!las&&i>=s.size()&&i>=num.s.size()) break;
			int x=las+s[i];
			if(i<num.s.size()) x-=num.s[i];
			if(x<0) x+=bas,las=-1; else las=0;
			c.s.push_back(x);
 		}
 		return c.clean();
	}
	bign operator*(const bign &num) const {
		vector<LL> v(s.size()+num.s.size(),0); bign c; c.s.clear(); 
		LL las=0,siz1=s.size(),siz2=num.s.size();
		Fo(i,0,siz1-1) Fo(j,0,siz2-1) 
			v[i+j]+=(LL)s[i]*num.s[j];
		for(Re int i=0;;i++) {
			if(!las&&i>=v.size()) break;//3
			LL x=v[i]+las;//4
			c.s.push_back(x%bas);
			las=x/bas;
		}
		return c.clean();
	}
	bign operator/(const bign &num) const {
		bign c=*this,m; int siz=s.size();
		Ro(i,0,siz-1) {
			m=m*bas+s[i];
			c.s[i]=bsearch(num,m);
			m-=num*c.s[i];
		}
		return c.clean();
	}
	bign operator%(const bign &num) const {
		bign c=*this,m; int siz=s.size();
		Ro(i,0,siz-1) {
			m=m*bas+s[i];
			c.s[i]=bsearch(num,m);
			m-=num*c.s[i];
		}
		return m;
	}
	int bsearch(const bign &num,const bign &m) const { 
		int L=0,R=bas-1,mid;
		while(1) {
			mid=(L+R)>>1;
			if(num*mid<=m) {if(num*(mid+1)>m)return mid;else L=mid;}
			else R=mid;
		}
	}
	bign& operator+=(const bign &num) {*this=*this+num;return *this;}
	bign& operator-=(const bign &num) {*this=*this-num;return *this;}
	bign& operator*=(const bign &num) {*this=*this*num;return *this;}
	bign& operator/=(const bign &num) {*this=*this/num;return *this;}
	bign& operator%=(const bign &num) {*this=*this%num;return *this;}
	bool operator<(const bign &num) const {
		if(s.size()!=num.s.size()) return s.size()<num.s.size();
		int siz=s.size();
		Ro(i,0,siz-1) if(s[i]!=num.s[i]) return s[i]<num.s[i];//5
		return 0;
	}
	bool operator>(const bign &num) const {return num<*this;}
	bool operator<=(const bign &num) const {return !(num<*this);}
	bool operator>=(const bign &num) const {return !(*this<num);}
	bool operator!=(const bign &num) const {return *this<num||num<*this;}
	bool operator==(const bign &num) const {return !(*this<num)&&!(num<*this);}
};

istream& operator>>(istream &in,bign &num) {string s;if((in>>s)) num=s;return in;}

ostream& operator<<(ostream &out,const bign &num) {
	out<<num.s.back(); int siz=num.s.size();
	Ro(i,0,siz-2) {
		char buf[20]; sprintf(buf,"%08d",num.s[i]);//6
		int len=strlen(buf); Fo(j,0,len-1) out<<buf[j];
	}
	return out;
}

int main() {
    bign a,b;
    cin>>a>>b;
    cout<<a+b;cout<<endl;
    if(a<b) cout<<"-"<<b-a;else cout<<a-b;cout<<endl;
    cout<<a*b<<endl;
    cout<<a/b<<endl;
    cout<<a%b<<endl;
}

持续更新中...

posted @ 2018-07-15 22:49  Menteur_hxy  阅读(365)  评论(0编辑  收藏  举报