四连测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\n",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\n");
    else printf("%d\n",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\n",upper_bound(sum,sum+1048576,k-1)-sum);
    }
}
xor

 

posted @ 2018-08-07 14:26  秦こころ酱  阅读(107)  评论(0编辑  收藏  举报