• [不断更新中]模板


    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;
    }
    

    持续更新中...

  • 相关阅读:
    父级和 子集 controller 之间的通讯
    ui-router(三)controller与template
    ui-router详解(二)ngRoute工具区别
    关于MySql全文索引
    Yii提供的Htmler助手checkboxList可自定义Checkbox输出格式
    添加和删除索引以及如何给中间表添加两个主键
    设置数据库及表的默认字符集
    保存数据的时候报类型错误的原因和解决方案
    金融经济
    YII获取刚插入数据的id主键
  • 原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9315440.html
Copyright © 2020-2023  润新知