MnZn求助,最后几个点TLE
查看原帖
MnZn求助,最后几个点TLE
147401
koishi_offical楼主2021/5/20 21:41
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10,inf=0x3f3f3f3f;
int h[N],e[N<<1],ne[N<<1],w[N<<1],idx;
int n,m,k;
int s=1,t=1e6;
void add(int a,int b,int c)
  {
      e[idx]=b;
      ne[idx]=h[a];
      h[a]=idx;
      w[idx++]=c;
      e[idx]=a;
      ne[idx]=h[b];
      h[b]=idx++;
  }
int id=1;
struct node 
  {
      int l,r;
  }tr[N<<1];
int root1,root2;
int new_node()
  {
      h[++id]=-1;
      return id;
  }
void build(int &k1,int &k2,int l,int r)
  {
      k1=new_node();
      if(l==r)
        {
            k2=k1;
            if(l==1) add(s,k1,n);
            if(l==k) add(k1,t,n);
            return;
        }
      k2=new_node();
      int mid=l+r>>1;
      build(tr[k1].l,tr[k2].l,l,mid);
      build(tr[k1].r,tr[k2].r,mid+1,r);
      add(k1,tr[k1].l,inf);
      add(k1,tr[k1].r,inf);
      add(tr[k2].l,k2,inf);
      add(tr[k2].r,k2,inf);
  }
void change1(int k1,int l,int r,int x,int y,int v)
  {
      if(l>y||r<x) return;
      if(l>=x&&r<=y)
        {
            add(v,k1,inf);
            return;
        }
      int mid=l+r>>1;
      if(x<=mid) change1(tr[k1].l,l,mid,x,y,v);
      if(y>mid) change1(tr[k1].r,mid+1,r,x,y,v);
  }
void change2(int k2,int l,int r,int x,int y,int u)
  {
      if(l>y||r<x) return;
      if(l>=x&&r<=y)
        {
            add(k2,u,inf);
            return;
        }
      int mid=l+r>>1;
      if(x<=mid) change2(tr[k2].l,l,mid,x,y,u);
      if(y>mid) change2(tr[k2].r,mid+1,r,x,y,u);
  }
int now[N],d[N];
int maxflow;
bool bfs() 
  {
      queue<int> q;
      memset(d,0,sizeof(d));
      q.push(s);
      now[s]=h[s];
      d[s]=1;
      while(!q.empty())
        {
            int x=q.front();
            q.pop();
            for(int i=h[x];i!=-1;i=ne[i])
              if(w[i]&&!d[e[i]])
                {
                    d[e[i]]=d[x]+1;
                    now[e[i]]=h[e[i]];
                    q.push(e[i]);
                    if(e[i]==t) return 1;
                }
        }
      return 0;
  }
int dinic(int x,int flow)
  {
      if(x==t) return flow;
      int rest=flow,k,i;
      for(int i=now[x];i!=-1&&rest;i=ne[i])
       if(d[e[i]]==d[x]+1&&w[i])
        {
            k=dinic(e[i],min(w[i],rest));
            if(!k) d[e[i]]=0;
            rest-=k;
            w[i]-=k;
            w[i^1]+=k;
        }
      now[x]=i;
      return flow-rest;
  }
int main() {
    cin>>n>>m>>k;
    h[s]=-1;
    h[t]=-1;
    build(root1,root2,1,k);
    for(int i=1;i<=m;i++)
      {
          int op,l;
          int u=new_node(),v=new_node();
          cin>>op>>l;
          add(u,v,l);
          if(op==1)
            {
                int a,b;
                cin>>a>>b;
                change1(root1,1,k,b,b,v);
                change2(root2,1,k,a,a,u);
            }
          if(op==2)
            {
                int al,ar,b;
                cin>>al>>ar>>b;
                change1(root1,1,k,b,b,v);
                change2(root2,1,k,al,ar,u);
            }
          if(op==3)
            {
                int a,bl,br;
                cin>>a>>bl>>br;
                change1(root1,1,k,bl,br,v);
                change2(root2,1,k,a,a,u);
            }
          if(op==4)
            {
                int al,ar,bl,br;
                cin>>al>>ar>>bl>>br;
                change1(root1,1,k,bl,br,v);
                change2(root2,1,k,al,ar,u);
            }
      }
    int flow;
    while(bfs())
      while(flow=dinic(s,inf)) maxflow+=flow;
    cout<<maxflow;
}
2021/5/20 21:41
加载中...