zoukankan      html  css  js  c++  java
  • 四连测Day1

    这里只有本菜鸡的代码

    题解看这里

    #include<bits/stdc++.h>
    using namespace std;
    int st[21][100010];
    int st2[21][100010];
    int n,q,A[100010];
    int cnt,fst[100010],nxt[200010],to[200010];
    int a,b;
    void link(int x,int y)
    {
        nxt[++cnt]=fst[x];
        fst[x]=cnt;
        to[cnt]=y;
    }
    int dep[100010];
    void makedep(int x)
    {
        for(int i=fst[x];i;i=nxt[i])
        {
            if(!dep[to[i]]) {dep[to[i]]=dep[x]+1;st[0][to[i]]=x;st2[0][to[i]]=min(A[to[i]],A[x]);makedep(to[i]);}
        }
    }
    void makest()
    {
        for(int i=1;i<=20;i++)
        {
            for(int j=1;j<=n;j++)
            {
                st[i][j]=st[i-1][st[i-1][j]];
                st2[i][j]=min(st2[i-1][j],st2[i-1][st[i-1][j]]);
            }
        }
    }
    int quey(int x,int y)
    {
        int ans=min(A[x],A[y]);
        if(dep[x]<dep[y]) swap(x,y);
        for(int i=20;i>=0;i--)
        {
            if((1<<i)<=dep[x]-dep[y]) {ans=min(ans,st2[i][x]);x=st[i][x];}
        }
        if(x==y) return ans;
        for(int i=20;i>=0;i--)
        {
            if(st[i][x]!=st[i][y])
            {
                ans=min(ans,st2[i][x]);
                ans=min(ans,st2[i][y]);
                x=st[i][x];
                y=st[i][y];
            }
        }
        ans=min(st2[0][x],ans);
        ans=min(st2[0][y],ans);
        return ans;
    }
    int main()
    {
        freopen("min.in","r",stdin);
        freopen("min.out","w",stdout);
        scanf("%d%d",&n,&q);
        for(int i=1;i<=n;i++) scanf("%d",&A[i]);
        for(int i=1;i<n;i++)
        {
            scanf("%d%d",&a,&b);
            link(a,b);link(b,a);
        }
        dep[1]=1;makedep(1);
        makest();
        while(q--)
        {
            scanf("%d%d",&a,&b);
            printf("%d
    ",quey(a,b));
        }
    }
    min
    #include<bits/stdc++.h>
    using namespace std;
    namespace Seg_Tree
    {
        #define lx (x<<1)
        #define rx (x<<1|1)
        int c[500010];
        void update(int x)
        {
            c[x]=c[lx]+c[rx];
        }
        void pushdown(int x)
        {
            if(c[x]==0) 
            {
                c[rx]=c[lx]=0;
            }
        }
        void build(int x,int l,int r)
        {
            if(l==r) {c[x]=1;return;}
            int mid=(l+r)>>1;
            build(lx,l,mid);build(rx,mid+1,r);
            update(x);
        }
        void mdf(int x,int l,int r,int nl,int nr)
        {
            if(l==nl&&r==nr) {c[x]=0;return;}
            pushdown(x);
            int mid=(l+r)>>1;
            if(nl<=mid) mdf(lx,l,mid,nl,min(nr,mid));
            if(nr>mid) mdf(rx,mid+1,r,max(nl,mid+1),nr);
            update(x);
        }
        int quey(int x,int l,int r,int nl,int nr)
        {
            if(l==nl&&r==nr) return c[x];
            pushdown(x);
            int mid=(l+r)>>1,t=0;
            if(nl<=mid) t+=quey(lx,l,mid,nl,min(nr,mid));
            if(nr>mid) t+=quey(rx,mid+1,r,max(nl,mid+1),nr);
            return t;
        }
    }
    using namespace Seg_Tree;
    int n,m,ans;
    struct Data
    {
        int l,r,v;
        bool operator < (const Data &a) const
        {
            return v<a.v;
        }
    }A[100010];
    int main()
    {
        freopen("kruskal.in","r",stdin);
        freopen("kruskal.out","w",stdout);
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++) scanf("%d%d%d",&A[i].l,&A[i].r,&A[i].v);
        sort(A+1,A+m+1);
        build(1,1,n);
        for(int i=1;i<=m;i++)
        {
            int cnt=quey(1,1,n,A[i].l,A[i].r-1);
            ans+=cnt*A[i].v;
            mdf(1,1,n,A[i].l,A[i].r-1);
        }
        if(quey(1,1,n,1,n)>1) printf("-1
    ");
        else printf("%d
    ",ans); 
    }
    kruskal
    #include<bits/stdc++.h>
    using namespace std;
    int n,Q,k;
    int A[10010];
    int B[10010];
    int sum[1048585];
    inline int read()
    {
        int x=0;
        char c=getchar();
        while(!isdigit(c)) c=getchar();
        while(isdigit(c)) x=x*10+c-'0',c=getchar();
        return x;
    }
    int main()
    {
        freopen("xor.in","r",stdin);
        freopen("xor.out","w",stdout);
        n=read();Q=read();
        for(int i=1;i<=n;i++)
        {
            A[i]=read();
            B[i]=B[i-1]^A[i];
        }
        for(int i=0;i<=n;i++)
        {
            for(int j=i+1;j<=n;j++)
            {
                sum[B[i]^B[j]]++;
            }
        }
        for(int i=1;i<=1048575;i++) sum[i]+=sum[i-1];
        while(Q--)
        {
            k=read();
            printf("%d
    ",upper_bound(sum,sum+1048576,k-1)-sum);
        }
    }
    xor
  • 相关阅读:
    常用公共配置类——定时任务配置
    常用公共工具类——生成token
    常用公共工具类——分页工具类(IPage)
    常用公共工具类——Shiro工具类
    常用公共工具类——Redis工具类
    fmt.sprintf,fprintf区别
    web界面不显示内容排查思路
    golang值传递和引用传递
    web开发
    聊聊crd和list-watch
  • 原文地址:https://www.cnblogs.com/wjxgy/p/9436796.html
Copyright © 2011-2022 走看看