[不断更新中]模板

[不断更新中]模板

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 阅读( ...) 评论( ...) 编辑 收藏
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值