zoukankan      html  css  js  c++  java
  • [UOJ] #217. 【UNR #1】奇怪的线段树

    题解见大佬博客

    我的丑陋代码:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    inline int read()
    {
        int x;char c;
        while((c=getchar())<'0'||c>'9');
        for(x=c-'0';(c=getchar())>='0'&&c<='9';)x=x*10+c-'0';
        return x;
    }
    #define MN 8000
    #define MV 16000
    #define ME 56000
    #define INF 0x3FFFFFFF
    struct edge{int nx,t,l,w;}e[ME*2+5];
    int S=MV+1,T=MV+2,h[MV+5],en=1,d[MV+5],q[MV+5],qn,c[MV+5];
    int cnt=1,L[MN+5],R[MN+5],u[MN+5],z[MN+5],fa[MN+5];
    inline void ins(int x,int y,int l,int w)
    {
        e[++en]=(edge){h[x],y,l,w};h[x]=en;
        e[++en]=(edge){h[y],x,0,0};h[y]=en;
    }
    bool build(int k,int l,int r)
    {
        u[k]=read();
        if(k>1&&u[k]&&!u[fa[k]])exit(0*puts("OwO"));
        if(l<r)
        {
            int mid;
            fa[L[k]=++cnt]=k;build(L[k],l,mid=read());
            fa[R[k]=++cnt]=k;build(R[k],mid+1,r);
            z[L[k]]=R[k];
            ins(k,L[k],0,INF);
        }
        L[k]=l;R[k]=r;
    }
    bool bfs()
    {
        int i,j;
        memset(d,0,sizeof(d));
        for(d[q[i=qn=0]=S]=1;i<=qn;++i)for(j=c[q[i]]=h[q[i]];j;j=e[j].nx)
            if(e[j].w&&!d[e[j].t])d[q[++qn]=e[j].t]=d[q[i]]+1;
        return d[T];
    }
    int dfs(int x,int r)
    {
        if(x==T)return r;
        int k,u=0;
        for(int&i=c[x];i;i=e[i].nx)if(e[i].w&&d[e[i].t]==d[x]+1)
        {
            k=dfs(e[i].t,r-u<e[i].w?r-u:e[i].w);
            u+=k;e[i].w-=k;e[i^1].w+=k;
            if(u==r)return u;
        }
        return d[x]=0,u;
    }
    int main()
    {
        int n=read(),i,j;
        build(1,1,n);
        for(i=1;i<2*n;++i)if(u[i])
        {
            ins(S,i,0,INF);
            for(j=i;++j<2*n;)if(L[i]<=L[j]&&R[i]>=R[j]&&u[j])u[i]=0;
            ins(i,i+2*n,u[i],INF);
            ins(i+2*n,T,0,INF);
            for(j=i;++j<2*n;)if(R[i]+1==L[j]&&z[i]!=j){ins(i+2*n,j,0,INF);break;}
        }
        for(i=1;i<=T;++i)for(j=h[i];j;j=e[j].nx)d[i]-=e[j].l,d[e[j].t]+=e[j].l,e[j].w-=e[j].l;
        for(S+=2,T+=2,i=1;i<S;++i)
        {
            if(d[i]<0)ins(i,T,0,-d[i]);
            if(d[i]>0)ins(S,i,0,d[i]);
        }
        while(bfs())dfs(S,INF);
        ins(T-2,S-2,0,INF);
        while(bfs())dfs(S,INF);
        for(i=h[S-2];i;i=e[i].nx)if(e[i].t==T-2)printf("%d",e[i].w);
    }
  • 相关阅读:
    在终端中输出彩色文字
    卸载PythonToolKit的方法
    几款python集成开发环境
    关于Python中数据对象的可变性
    解决vim无法返回上次的位置
    evince无法返回上次浏览的位置
    解决xfce4桌面图标消失的问题
    xfce4的截屏插件
    linux 查看chm文档的软件
    [MySQL]group by 与 if 的统计技巧
  • 原文地址:https://www.cnblogs.com/ditoly/p/UOJ217.html
Copyright © 2011-2022 走看看