mxqz 卡常
查看原帖
mxqz 卡常
234074
樱雪喵>w<楼主2024/1/11 18:15

救救孩子吧 /ll。TLE on #63,不知道怎么卡了。

#include<bits/stdc++.h>
char buf[1<<20],*p1,*p2;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
#pragma GCC target("avx")
#pragma GCC optimize(3)
#pragma GCC optimize("Ofast")
#define il inline
using namespace std;
il int read()
{
    int xr=0,F=1; char cr;
    while(cr=getchar(),cr<'0'||cr>'9') if(cr=='-') F=-1;
    while(cr>='0'&&cr<='9') 
        xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
    return xr*F;
}
const int N=2e4+5,inf=105,Inf=1e9;
int n,m,k,q,s,t;
struct edge{int nxt,to,w;} e[N<<1];
int E[1025][N<<1],ans[1025],lw[N];
int head[N],cnt=1;
il void add(int u,int v,int w)
{
    e[++cnt]={head[u],v,w};head[u]=cnt;
    e[++cnt]={head[v],u,0};head[v]=cnt;
}
namespace dinic
{
    queue<int> q;
    int dis[N],now[N];
    il bool bfs()
    {
        for(int i=s;i<=t;i++) dis[i]=inf,now[i]=head[i];
        dis[s]=0,q.push(s);
        while(!q.empty())
        {
            int u=q.front(); q.pop();
            for(int i=head[u];i;i=e[i].nxt)
            {
                int v=e[i].to;
                if(!e[i].w||dis[v]!=inf) continue;
                dis[v]=dis[u]+1,q.push(v);
            }
        }
        return dis[t]!=inf;
    }
    int dfs(int u,int sum)
    {
        if(u==t) return sum;
        int res=0;
        for(int i=now[u];i&&sum;i=e[i].nxt)
        {
            int v=e[i].to; now[u]=i;
            if(!e[i].w||dis[v]!=dis[u]+1) continue;
            int k=dfs(v,min(e[i].w,sum));
            e[i].w-=k,e[i^1].w+=k;
            sum-=k,res+=k;
        }
        return res;
    }
};
namespace EK
{
    int vis[N],pre[N],dis[N];
    int Vis[N],Pre[N],Dis[N];
    int q[N],st=1,ed=0;
    il void init()
    {
        for(int i=1;i<=n;i++) Vis[i]=0,Pre[i]=-1,Dis[i]=inf;
    }
    il bool bfs()
    {
        st=1,ed=0;
        // memcpy(vis,Vis,sizeof(Vis)),memcpy(pre,Pre,sizeof(Pre)),memcpy(dis,Dis,sizeof(Dis));
        for(int i=1;i<=n;i++) vis[i]=0,pre[i]=-1,dis[i]=inf;
        q[++ed]=s;
        vis[s]=1;
        while(st<=ed)
        {
            int u=q[st];st++;
            if(u==t) return 1;
            for(int i=head[u];i;i=e[i].nxt)
            {
                int v=e[i].to,w=e[i].w;
                if(vis[v]||!w) continue;
                vis[v]=1,pre[v]=i;
                dis[v]=min(dis[u],w);
                q[++ed]=v;
                if(v==t) return 1;
            }
            if(vis[t]) return 1;
        }
        return 0;
    }
    il int upd()
    {
        int now=t;
        while(now!=s)
        {
            int i=pre[now];
            e[i].w-=dis[t];
            e[i^1].w+=dis[t];
            now=e[i^1].to;
        }
        return dis[t];
    }
};
int w[N],sum[N];
void write(int x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10); putchar(x%10+'0');
}
int main()
{
    n=read(),m=read(),k=read(),q=read();
    s=1,t=n; EK::init();
    for(int i=1;i<=m;i++)
    {
        int u=read(),v=read(),w=read();
        add(u,v,w);
    }
    for(int i=1;i<(1<<k);i++) lw[i]=__lg(i&-i);
    while(dinic::bfs()) ans[0]+=dinic::dfs(s,inf);
    for(int i=1;i<=cnt;i++) E[0][i]=e[i].w;
    for(int i=1;i<(1<<k);i++)
    {
        int lst=i-(i&-i),pos=lw[i];
        for(int j=1;j<=cnt;j++) e[j].w=E[lst][j];
        e[(pos+1)<<1].w=inf;
        ans[i]=ans[lst];
        while(EK::bfs()) ans[i]+=EK::upd();
        for(int j=1;j<=cnt;j++) E[i][j]=e[j].w;
    }
    while(q--)
    {
        for(int i=1;i<=k;i++) w[i]=read();
        int ans=Inf;
        for(int i=1;i<(1<<k);i++) sum[i]=sum[i^(i&-i)]+w[lw[i]+1];
        for(int i=0;i<(1<<k);i++) 
        {
            int res=sum[(1<<k)-1^i];
            ans=min(ans,res+::ans[i]);
        }
        write(ans); putchar('\n');
    }
    return 0;
}
2024/1/11 18:15
加载中...