模板库

来源:互联网 发布:python 中文乱码 编辑:程序博客网 时间:2024/05/16 01:22

读入优化

char ch;void read(int &n){    n=0;    ch=G();    while((ch<'0' || ch>'9') && ch!='-')ch=G();    ll w=1;    if(ch=='-')w=-1,ch=G();    while('0'<=ch && ch<='9')n=(n<<3)+(n<<1)+ch-'0',ch=G();    n*=w;}

输出优化

void write(int x){     if(x>9) write(x/10);     P(x%10+'0');}

最短路(spfa)

    memset(dis,127,sizeof(dis));    memset(bz,1,sizeof(bz));    bz[n]=dis[n]=0;    d[1]=n;    int head=0,tail=1;    while(head<tail)    {        x=d[++head];        for(int i=last[x];i;i=next[i])            if(dis[a[i]]>dis[x]+v[i] || (dis[a[i]]==dis[x]+v[i] && b[f[a[i]]]>b[x]))            {                dis[a[i]]=dis[x]+v[i];                f[a[i]]=x;                if(bz[a[i]])                {                    bz[a[i]]=0;                    d[++tail]=a[i];                }            }        bz[x]=1;    }

高精度

void add(arr a,arr b){    memset(t,0,sizeof(t));    int m=max(a[0],b[0]);    for(int i=1;i<=m;i++)    {        t[i]+=a[i]+b[i];        t[i+1]+=t[i]/mo;        t[i]=t[i]%mo;    }    if(t[m+1]>0)t[0]=m+1;else t[0]=m;}void dd(arr a,arr b){    memset(tt,0,sizeof(tt));    for(int i=1;i<=a[0];i++)    {        tt[i]+=a[i]-b[i];        while(tt[i]<0)        {            tt[i]+=mo;            tt[i+1]--;        }    }    tt[0]=a[0];    while(!tt[tt[0]])tt[0]--;}

线段树

void work(int x){    if(t[x].l>=opl && t[x].r<=opr)    {        if(opx==1)t[x].x=min(t[x].x,ops);        if(opx==2)ops=min(ops,t[x].x);        return;    }    if(t[x].l==t[x].r)return;    int m=(t[x].l+t[x].r)/2;    if(opl<=m)work(x+x);    if(m<opr)work(x+x+1);    t[x].x=min(t[x+x].x,t[x+x+1].x);}

并采集

int get(int x){return x==f[x]?x:f[x]=get(f[x]);}

哈希

inline void ins(){    int x=y%mo;    while(f[x]!=0 && f[x]!=y)x=(x+1)%mo;    f[x]=y;g[x]++;}inline int find(){    int x=y%mo;    while(f[x]!=0 && f[x]!=y)x=(x+1)%mo;    return g[x];}

tarjan

void tarjan(int x,int fa){    ti++;    dfn[x]=low[x]=ti;    bz[x]=0;    ta++;    z[ta]=x;    for(int i=b[x];i;i=next[i])    {        if((bz[a[i]])&&(a[i]!=fa))        {            tarjan(a[i],x);            low[x]=min(low[x],low[a[i]]);        }        else        if(a[i]!=fa)        {            low[x]=min(low[x],dfn[a[i]]);        }    }    if(low[x]==dfn[x])    {        if(z[ta]==x)        {            ta--;        }        else        {            while(z[ta]!=x)            {                g[z[ta]]=1;                ta--;            }            g[z[ta]]=1;            ta--;        }    }}

tarjan(人工栈)

void tarjan(int x){    d[r=1]=x;    while(r)    {        x=d[r];        if(dfn[x]==0)        {            z[++top]=x;            bz[x]=w[x]=0;            dfn[x]=low[x]=++now;        }        if(b[x])        {            int i=b[x];            if(p[i]==0)            {                low[x]=min(low[x],low[to[i]]);            } else            if(bz[to[i]])            {                if(p[i])                {                    d[++r]=to[i];                    p[i]=0;                    continue;                }            }else if(!w[to[i]])                low[x]=min(low[x],dfn[to[i]]);            b[x]=nxt[i];        }        else        {               if(low[x]==dfn[x])            {                cnt++;                z[top+1]=-1;                while(z[top+1]!=x)                {                    f[z[top]]=cnt;                    v[cnt]++;                    w[z[top]]=1;                    top--;                }                ans=max(ans,v[cnt]);            }            r--;        }    }}

倍增LCA

int lca(int x,int y){    if(deep[x]>deep[y])swap(x,y);    for(int j=19;j>=0;j--)        if(deep[x]<=deep[f[y][j]])y=f[y][j];    if(x==y)return x;    for(int j=19;j>=0;j--)        if(f[x][j]!=f[y][j])x=f[x][j],y=f[y][j];    return f[x][0];}

树状数组

int low(int x){    return x & (-x);}int find(int x,int y){    int s=0;    for(int i=x;i;i=i-low(i))        s+=z[y][i];    return s;}void change(int x,int y,int s){    for(int i=x;i<=n;i=i+low(i))        z[y][i]+=s;}

优先队列(堆)

#include<queue>#include<cstdio>#include<iostream>#include<algorithm>using namespace std;struct node{    int x;};priority_queue <node> q;//定义一个类型为node的优先队列(使用堆的队列) bool operator <(node a,node b){    return a.x>b.x;}//因为优先队列默认为从大到小( 用"<"比较),我们若要从小到大,就要重新定义"<"为相反操作 int main(){    int n;    cin>>n;    if (q.empty()) cout<<"The heap is empty!"<<endl;//判断队列是否为空     for (int i=1;i<=n;++i){        node t;        cin>>t.x;        q.push(t);//将t加入队列     }    for (int i=1;i<=n;++i){        node t;        t=q.top();//取出队首         q.pop();//将队首弹出         cout<<t.x<<' ';    }    cout<<endl;}

trie

int ins(char* s,int len){    int x=1;    for(int p=1;p<=len;p++)    {        if(tr[x].son[s[p]-'a']==0)        {            deep[++tot]=deep[x]+1;            tr[x].son[s[p]-'a']=tot;            f[tot][0]=x;            for(int j=1;j<20;j++)                f[tot][j]=f[f[tot][j-1]][j-1];        }        x=tr[x].son[s[p]-'a'];    }    return x;}

kmp

void make(int* t,int len){    memset(nxt,0,sizeof(nxt));    int j=0;    for(int i=2;i<=len;i++)    {        while(j>0 && t[j+1]!=t[i])j=nxt[j];        if(t[i]==t[j+1])j++;        nxt[i]=j;    }}int kmp(int l){    int j=0,sum=0;    for(int i=1;i<n;i++)    {        while(j>0 && a[i]!=b[j+1])j=nxt[j];        if(a[i]==b[j+1])j++;        if(j==l)        {            sum++;            j=nxt[l];        }    }    return sum;}

最小生成树(克鲁斯卡尔)

 for(int i=1;t<n-1;i++)        {            f1=get(a[i].x);            f2=get(a[i].y);            if(f1!=f2)            {                ins(a[i].x,a[i].y,a[i].z);                ins(a[i].y,a[i].x,a[i].z);                fa[f2]=f1;                ans+=a[i].z;                t++;                bz[i]=0;            }        }

二分图匹配(匈牙利算法)

bool find(int x){    for(int i=b[x];i;i=next[i])    {        if(bz[t[i]])continue;        bz[t[i]]=1;        if(g[t[i]]==0 || find(g[t[i]]))        {            g[t[i]]=x;            return 1;        }    }    return 0;}

最长回文串

void manacher(char s[], int length, int rad[]) {    for (int i=1,j=0,k; i < length; i+=k) {        while (s[i-j-1] == s[i+j+1]) ++j;        rad[i] = j;        for (k = 1; k <= rad[i] && rad[i-k] != rad[i]-k; ++k)         {             rad[i+k] = min(rad[i-k], rad[i]-k);        }        j = max(j-k, 0);    }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 微信里黑圈里面的白字是怎么办 脖子比脸黑好多怎么办 河南许昌小学生生病办休学怎么办 1岁宝宝内向胆小怎么办 3岁宝宝内向胆小怎么办 数学物理好不喜欢学医怎么办 孩子眉毛太浓了怎么办 小娃一年级成绩太差怎么办 孩子晚上睡得晚怎么办 在深圳买房难小孩读书怎么办 上海小孩读书积分不够怎么办 读书时静不下心怎么办 初中生静不下心读书怎么办 孩子学习静不下心怎么办 退烧后体温35度怎么办 孩子体温34度多怎么办 宝宝感冒咳嗽流鼻涕出汗怎么办 养的小鸡总打架怎么办 小鸡一条腿瘸了怎么办 同窝小斗鸡打架怎么办 夏季羊长的慢怎么办 1岁吃母乳不吃饭怎么办 5个月宝宝黏妈妈怎么办 九个月宝宝不爱吃饭怎么办 20个月宝宝吐了怎么办 十个月的宝宝消化不好怎么办 两岁宝宝不爱喝水怎么办 两岁宝宝不爱喝水吃饭怎么办 两岁的宝宝不爱喝水怎么办 宝宝不爱吃饭不爱喝水怎么办 一多半宝宝爱喝水 不爱吃饭怎么办 1岁宝宝不爱吃饭喝水怎么办 两岁小宝宝不爱吃饭怎么办 4个月小宝宝咳嗽怎么办 3个月小宝宝咳嗽怎么办 2个月小宝宝咳嗽怎么办 8的岁儿童腿不直怎么办 作业盒子选错年级怎么办 两岁x型腿怎么办 绿萝叶子有水滴怎么办 打游戏变菜了怎么办