常用模板___1

//读优——————————————————————————————————————————————————————
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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值