• 其他板子整理


    ST表

    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)d[i][0]=read();    
        for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i-1+(1<<j)<=n;i++)
        d[i][j]=max(d[i][j-1],d[i+(1<<(j-1))][j-1]);
        while(m--)
        {
            l=read();r=read();
            k=log2(r-l+1);
            printf("%d
    ",max(d[l][k],d[r-(1<<k)+1][k]));
        }
    }

     LCA

    
    
    #include<bits/stdc++.h>
    using namespace std;
    int n,m,ne,head[1000100],x,y,q,t,a,b,dep[1000100],fa[1000100][22];
    struct node{int nxt,to;}eg[1000100*2];
    void adde(int f,int v){eg[++ne].to=v;eg[ne].nxt=head[f];head[f]=ne;}
    void dfs(int u,int father)
    {
        for(int i=head[u];i;i=eg[i].nxt)
        if(eg[i].to!=father)
        {int v=eg[i].to;
        dep[v]=dep[u]+1;fa[v][0]=u;dfs(v,u);}  
    }
    int lca(int x,int y)
    {
        if(dep[x]<dep[y])swap(x,y);
        for(int i=20;i>=0;i--)
        if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
        if(x==y)return x;
        for(int i=20;i>=0;i--)
            if(fa[x][i]!=fa[y][i])
            {
                x=fa[x][i];
                y=fa[y][i];
            }
        return fa[x][0];
    }
    int main()
    {    
        cin>>n>>q>>t;dep[t]=1;
        for(int i=1;i<=n-1;i++)
        {cin>>a>>b;adde(a,b);adde(b,a);}
        dfs(t,t);fa[t][0]=t;
        for(int i=1;i<=20;i++)
        for(int j=1;j<=n;j++)fa[j][i]=fa[fa[j][i-1]][i-1];
        while(q--)
        {
            scanf("%d%d",&x,&y);
            printf("%d
    ",lca(x,y));
        }
    }
    
    
    
     

     线段树

    #include<bits/stdc++.h>
    using namespace std;
    #define ln now<<1
    #define rn (now<<1)+1
    int n,m,a,b,c,cnt,d;
    long long sum[400040],num[400040],tag[400040];
    void pushdown(int now,int l,int r)
    {
        if(tag[now])
        {
            int mid=(l+r)>>1;
            sum[ln]+=(tag[now]*(mid-l+1));sum[rn]+=(tag[now]*(r-mid));
            tag[ln]+=tag[now];tag[rn]+=tag[now];
            tag[now]=0;sum[now]=sum[ln]+sum[rn];
        }
    }
    void build(int now,int l,int r)
    {
        if(l==r)sum[now]=num[++cnt];
        else{
        int mid=(l+r)/2;
        build(ln,l,mid);
        build(rn,mid+1,r);
        sum[now]=sum[ln]+sum[rn];    
        }
    }
    void add(int now,int ll,int rr,int l,int r,int val)
    {
        if(l<=ll&&r>=rr)
        {
            sum[now]+=(val*(rr-ll+1));
            tag[now]+=val;
        }
        else{
            pushdown(now,ll,rr);
            int mid=(ll+rr)/2;
            if(l<=mid)add(ln,ll,mid,l,r,val);
            if(r>mid)add(rn,mid+1,rr,l,r,val);
            sum[now]=sum[ln]+sum[rn];
        }
            
    }
    long long  gsum(int now,int ll,int rr,int l,int r)
    {
        long long ans=0;
        if(l<=ll&&r>=rr)ans+=sum[now];
        else{
            pushdown(now,ll,rr);
            int mid=(ll+rr)/2;
            if(l<=mid)ans+=gsum(ln,ll,mid,l,r);
            if(r>mid)ans+=gsum(rn,mid+1,rr,l,r);
            sum[now]=sum[ln]+sum[rn];    
        }
        return ans;
    }
    int main()
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++)cin>>num[i];
        build(1,1,n);
        while(m--)
        {
            cin>>a>>b>>c;
            if(a==1)
            {
                cin>>d;
                add(1,1,n,b,c,d);
            }
            else cout<<gsum(1,1,n,b,c)<<endl;
        }
    }
  • 相关阅读:
    输入一个nxn矩阵各元素的值,球出两条对角线元素之和
    打印杨辉三角
    编写一个函数,实现两个字符串的连接功能
    字符串置换。将字符串s中的出现的字符s1用字符s2置换
    有一行文字,要求删去其中某个字符
    自定义函数delstr()的功能是删去字符串s1中所有的"*"
    用微软的kestrel在Linux上利用Apache架设Asp.Net Core环境
    2012年8月14日 星期二 equals()方法 (冲突备份)
    jquery 操作DOM 案例
    FileUpload 控件上传图片和文件
  • 原文地址:https://www.cnblogs.com/SFWR-YOU/p/10499761.html
Copyright © 2020-2023  润新知