线段树优化建图+网络流 代码求调,50pts
查看原帖
线段树优化建图+网络流 代码求调,50pts
305891
Eraine楼主2024/3/13 11:44

#11~14 WA #15 TLE #16~20 RE

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int M=2e7+5;
const int inf=1e9;
int n,m,k,s,t;
int num[N<<3],cur[N<<3],tot;
struct Edge{
    int end,nxt,flow;
    void add(int u,int v,int w){
        end=v;
        nxt=num[u];
        num[u]=tot;
        flow=w;
    }
}E[M];
int d[N<<3];bool vis[N<<3];
bool bfs(){
    memset(d,0,sizeof d);
    queue<int>q;
    d[s]=1;
    q.push(s);
    while(!q.empty()){
        int u=q.front();
        q.pop();
        for(int i=num[u];~i;i=E[i].nxt){
            int v=E[i].end,w=E[i].flow;
            if(!d[v]&&w){
                d[v]=d[u]+1;
                q.push(v);
                if(v==t){
                    return 1;
                }
            }
        }
    }
    return 0;
}
int dfs(int u,int flow){
    if(u==t){
        return flow;
    }
    int res=flow;
    for(int &i=cur[u];~i&&res;i=E[i].nxt){
        int v=E[i].end,w=E[i].flow;
        if(d[v]==d[u]+1&&w){
            int k=dfs(v,min(w,res));
            if(!k){
                d[v]=0;
            }
            E[i].flow-=k;
            E[i^1].flow+=k;
            res-=k;
        }
    }
    return flow-res;
}
int dinic(){
    int maxflow=0;
    while(bfs()){
        memcpy(cur,num,sizeof cur);
        maxflow+=dfs(s,inf);
    }
    return maxflow;
}
struct node{
    int ch[2];
}tr[N<<3];
int rt[2],idx;
int a[N][2];
void addDouble(int u,int v,int w){
    E[++tot].add(u,v,w);
    E[++tot].add(v,u,0);
}
struct segTree{
    #define lc tr[i].ch[0]
    #define rc tr[i].ch[1]
    #define mid (l+r)/2
    void build(int &i,int l,int r,int opt){
        i=++idx;
        if(l==r){
            a[l][opt]=i;
            return;
        }
        build(lc,l,mid,opt);
        build(rc,mid+1,r,opt);
        if(opt==0){
            addDouble(lc,i,inf);
            addDouble(rc,i,inf);
        }else{
            addDouble(i,lc,inf);
            addDouble(i,rc,inf);
        }
    }
    void Link(int i,int l,int r,int L,int R,vector<int>&lnk){
        if(L<=l&&R>=r){
            lnk.push_back(i);
            return;
        }
        if(L<=mid){
            Link(lc,l,mid,L,R,lnk);
        }
        if(R>mid){
            Link(rc,mid+1,r,L,R,lnk);
        }
    }
    #undef lc
    #undef rc
    #undef mid
}sgt[2];
int main(){
    memset(num,-1,sizeof num);
    tot=-1;
    scanf("%d%d%d",&n,&m,&k);
    sgt[0].build(rt[0],1,k,0);
    sgt[1].build(rt[1],1,k,1);
    for(int i=1;i<=n;i++){
        addDouble(a[i][1],a[i][0],inf);
    }
    s=++idx,t=++idx;
    addDouble(s,a[1][0],n);
    addDouble(a[k][1],t,n);
    vector<int>lnk0,lnk1;
    for(int i=1;i<=m;i++){
        lnk0.clear(),lnk1.clear();
        int u=++idx,v=++idx;
        int opt,lmt,a1,a2,b1,b2;
        scanf("%d%d",&opt,&lmt);
        if(opt==1){
            scanf("%d%d",&a1,&b1);
            sgt[0].Link(rt[0],1,k,a1,a1,lnk0);
            sgt[1].Link(rt[1],1,k,b1,b1,lnk1);
        }else if(opt==2){
            scanf("%d%d%d",&a1,&a2,&b1);
            sgt[0].Link(rt[0],1,k,a1,a2,lnk0);
            sgt[1].Link(rt[1],1,k,b1,b1,lnk1);
        }else if(opt==3){
            scanf("%d%d%d",&a1,&b1,&b2);
            sgt[0].Link(rt[0],1,k,a1,a1,lnk0);
            sgt[1].Link(rt[1],1,k,b1,b2,lnk1);
        }else if(opt==4){
            scanf("%d%d%d%d",&a1,&a2,&b1,&b2);
            sgt[0].Link(rt[0],1,k,a1,a2,lnk0);
            sgt[1].Link(rt[1],1,k,b1,b2,lnk1);
        }
		addDouble(u,v,lmt);
        for(auto p0:lnk0){
            for(auto p1:lnk1){
//				printf("%d and %d\n",p0,p1);
                addDouble(p0,u,inf);
                addDouble(v,p1,inf);
            }
        }
    }
    printf("%d\n",dinic());
    return 0;
}

2024/3/13 11:44
加载中...