常用模板___1

来源:互联网 发布:vue.js 格式化数字 编辑:程序博客网 时间:2024/05/21 14:48
//读优——————————————————————————————————————————————————————int read(){    char c;while(c=getchar(),(c<'0'||c>'9')&&c!='-');int x=0,y=1;    if(c=='-') y=-1;else x=c-'0';    while(c=getchar(),c>='0'&&c<='9') x=x*10+c-'0';    return x*y;}//floyed弗洛伊德 ————————————————————————————————————————————————-for(int k=1;k<=n;k++) for(int i=1;i<=n;i++)  if(i!=k&&f[i][k]!=maxn)   for(int j=1;j<=n;j++)    if(i!=j&&j!=k&&f[k][j]!=maxn)     f[i][j]=max(f[i][j],f[i][k]+f[k][j]);//kruskal克鲁斯卡尔————————————————————————————————————————————————for(int i=1;i<=m;i++){    if(find(x)!=find(y)){        unionn(x,y);k++;    }    if(k==n-1) break;} //union_find_set并查集———————————————————————————————————————————————/*getfather*/ int find(int x){    if(fa[x]!=x) fa[x]=find(fa[x]);    return fa[x];} /*union*/int unionn(int x,int y){    x=find(x);y=find(y);    if(x>y) fa[x]=y;    else fa[y]=x;}//Seg_Tree线段树——————————————————————————————————————————————————————/*up向上更新*/void up(int node){sum[node]=sum[node<<1]+sum[(node<<1)+1];}/*down下推标记*/void down(int node,int l_L,int l_R){    if(add[node]){        add[node<<1]+=add[node];        add[(node<<1)+1]+=add[node];        sum[node<<1]+=l_L*add[node];        sum[(node<<1)+1]+=l_R*add[node];        add[node]=0;    }} /*build建树*/void build(int node,int l,int r){    if(l==r){        sum[node]=f[l];        return;    }    int mid=(l+r)>>1;    build(node<<1,l,mid);    build((node<<1)+1,mid+1,r);    up(node);} /*点修改updateONE*/void updateONE(int node,int l,int r,int p,int ad){    if(l==r){        sum[node]+=ad;        return;    }    int mid=(l+r)>>1;    if(p<=mid) updateONE(node<<1,l,mid,p,ad);    else updateONE((node<<1)+1,mid+1,r,p,ad);    up(node);}/*区间修改updateMORE*/void updateMORE(int node,int l,int r,int LS,int RS,int ad){    if(LS<=l&&r<=RS){        sum[node]+=(r-l+1)*ad;        add[node]+=add;        return;    }    int mid=(l+r)>>1;    down(node,mid-l+1,r-mid);    if(LS<=mid) updateMORE(node<<1,l,mid,LS,RS,ad);    if(RS>=mid+1) updateMORE((node<<1)+1,mid+1,r,LS,RS,ad);    up(node);} /*区间查询query*/void query(int node,int l,int r,int LS,int RS){    if(LS<=l&&r<=RS){        return sum[node];    }    int mid=(l+r)>>1;    down(node,mid-l+1,r-mid);    int ans=0;    if(LS<=mid) ans+=query(node<<1,l,mid,LS,RS);     if(RS>=mid+1) ans+=query((node<<1)+1,mid+1,r,LS,RS);    return ans;} 
原创粉丝点击