1 条题解

  • 0
    @ 2026-9-2 19:16:16

    你们好口牙。

    我不会这个题。

    我觉得这个题比 https://www.luogu.com.cn/problem/CF1368H1 更困难但是那个是黑。

    但是我会卡常口牙。

    所以我们卡常吧。

    好像过了?

    T=50,N=500T=50,N=500 不是 O(TN6)O(TN^6) 常见数据范围吗?

    #include<bits/stdc++.h>
    using namespace std;
    constexpr int N=502;
    #ifdef ONLINE_JUDGE
    #define putchar putchar_unlocked
    #else
    #define putchar _putchar_nolock
    #endif
    char *p1,*p2,buf[100000];
    #define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
    #define min(a,b) (a>b?b:a)
    inline int read(){//正数快读
    	int x=0;char ch=getchar();
    	while(!isdigit(ch)){ch=getchar();}
    	while(isdigit(ch)){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    	return x;
    }
    char obuf[100000],*oh=obuf;
    inline void write(int x) {
        if(!x){*oh++='0';*oh++='\n';return;}
        char s[20];int p=0;
        while(x){s[p++]=x%10+'0';x/=10; }
        while(p--)*oh++=s[p];
        *oh++='\n';
    }
    
    pair<int,int> ed[N*N*2];
    int T,tot,head[N*N],s,t,lvl[N*N],cur[N*N],w1[N][N],w2[N][N],buc[N*N],W[N*N*10],W2[N*N*10],stk[N*N],X[51],P[51],C[51],top,n,m,base,Clear[400],Y;
    static inline void adde(int u,int v,int w){
        ed[tot]={v,head[u]};
        W[tot]=w;
        head[u]=tot++;
        ed[tot]={u,head[v]};
        W[tot]=w;
        head[v]=tot++;
    }
    static inline void addf(int u,int v,int w){
        ed[tot]={v,head[u]};
        W[tot]=w;
        head[u]=tot++;
        ed[tot]={u,head[v]};
        W[tot]=0;
        head[v]=tot++;
    }
    static inline int pos(int u,int d){//方向
        return base+((u-1)<<2)+d;
    }
    inline int ton(int u,int d){
        if(!d)return u+m;
        else if(d==1)return u+1;
        else if(d==2)return u>m?u-m:0;
        else return u>1?u-1:0;
    }
    int isap(){
        register int flow=0,u=s;
        top=0;
        memset(buc,0,(t+1)<<2);
        memset(lvl,-1,(t+1)<<2);
        lvl[t]=0;
        buc[0]=1;
        static int Q[N*N];
        register int l=0,r=0;
        Q[r++]=t;
        while(l^r){
            int u=Q[l++];
            for(int i=head[u];i;i=ed[i].second){
                int v=ed[i].first;
                if(lvl[v]==-1&&W[i^1]){
                    lvl[v]=lvl[u]+1;
                    buc[lvl[v]]++;
                    Q[r++]=v;
                }
            }
            if(u<=Y){
                for(int d=0;d<4;d++){
                    int v=ton(u,d);
                    if(v&&lvl[v]==-1&&W[pos(v,d^2)]){
                        lvl[v]=lvl[u]+1;
                        buc[lvl[v]]++;
                        Q[r++]=v;
                    }
                }
            }
        }
        memcpy(cur,head,(t+1)<<2);
        while(lvl[s]<t){
            if(u==t){
                register int add=0x3f3f3f3f,I;//pos
                for(register int i=1;i<=top;i++){
                    int cap;
                    if(stk[i]>0)cap=W[stk[i]];
                    else{
                        int z=-stk[i]-1;
                        int v=(z>>2)+1,d=z&3;
                        cap=W[pos(v,d)];
                    }
                    if(add>cap){
                        add=cap;
                        I=i;
                    }
                }
                for(register int i=1;i<=top;i++){
                    if(stk[i]>0){
                        W[stk[i]]-=add;
                        W[stk[i]^1]+=add;
                    }
                    else{
                        int z=-stk[i]-1;
                        int v=(z>>2)+1,d=z&3;
                        W[pos(v,d)]-=add;
                        W[pos(ton(v,d),d^2)]+=add;
                    }
                }
                flow+=add;
                if(stk[I]>0)u=ed[stk[I]^1].first;
                else{
                    int z=-stk[I]-1;
                    u=(z>>2)+1;
                }
                top=I-1;
                continue;
            }
            bool ok=0;
            if(cur[u]>0){
                for(register int i=cur[u];i;i=ed[i].second){
                    int v=ed[i].first;
                    if(lvl[v]==lvl[u]-1&&W[i]){
                        stk[++top]=i;
                        u=v;
                        ok=1;
                        break;
                    }
                    cur[u]=ed[i].second;
                }
                if(!cur[u]&&u<=Y)cur[u]=-1;
            }
            if(!ok&&u<=Y){//上下左右部分
                if(cur[u]==0)cur[u]=-1;
                while(cur[u]>=-4&&cur[u]<=-1){
                    int d=-cur[u]-1,v=ton(u,d);
                    if(v&&W[pos(u,d)]&&lvl[v]==lvl[u]-1){
                        stk[++top]=-(((u-1)<<2)+d+1);
                        u=v;
                        ok=1;
                        break;
                    }
                    cur[u]=-(d+2);
                }
            }
            if(ok)continue;
            register int minl=t;
            for(int i=head[u];i;i=ed[i].second){
                int v=ed[i].first;
                if(W[i])minl=min(minl,lvl[v]);
            }
            if(u<=Y){
                int v=ton(u,0);
                if(v&&W[pos(u,0)])minl=min(minl,lvl[v]);
                v=ton(u,1);
                if(v&&W[pos(u,1)])minl=min(minl,lvl[v]);
                v=ton(u,2);
                if(v&&W[pos(u,2)])minl=min(minl,lvl[v]);
                v=ton(u,3);
                if(v&&W[pos(u,3)])minl=min(minl,lvl[v]);
            }
            if(!--buc[lvl[u]])break;
            lvl[u]=minl+1;
            buc[lvl[u]]++;
            cur[u]=head[u];
            if(u!=s){
                int i=stk[top--];
                if(i>0)u=ed[i^1].first;
                else{
                    int z=-i-1;
                    u=(z>>2)+1;
                }
            }
        }
        return flow;
    }
    #define id(x,y) (((x)-1)*m+(y))
    signed main(){
        freopen("traffic.in","r",stdin);
        freopen("traffic.out","w",stdout);
        tot=2;
        n=read(),m=read(),T=read();
        base=6*N*N,Y=n*m;
        for(register int i=1;i<n;i++){
            for(register int j=1;j<=m;j++){
                w1[i][j]=read();
            }
        }
        for(register int i=1;i<=n;i++){
            for(register int j=1;j<m;j++){
                w2[i][j]=read();
            }
        }
        s=0,t=Y+n*2+m*2+1;
        for(register int i=1;i<n;i++){
            for(register int j=1;j<=m;j++){
                int u=id(i,j),v=id(i+1,j);
                W2[pos(u,0)]=w1[i][j];
                W2[pos(v,2)]=w1[i][j];
            }
        }
        for(register int i=1;i<=n;i++){
            register int j=1;
            for(;j+1<m;j+=2){
                int u=id(i,j),v=id(i,j+1);
                W2[pos(u,1)]=w2[i][j];
                W2[pos(v,3)]=w2[i][j];
                u=id(i,j+1),v=id(i,j+2);
                W2[pos(u,1)]=w2[i][j+1];
                W2[pos(v,3)]=w2[i][j+1];
            }
            for(;j<m;j++){
                int u=id(i,j),v=id(i,j+1);
                W2[pos(u,1)]=w2[i][j];
                W2[pos(v,3)]=w2[i][j];
            }
        }
        int ToT=tot,tail=0;
        while(T--){
            int k=read(),sum=0;
            for(register int i=1;i<=k;i++){
                X[i]=read(),P[i]=read(),C[i]=read();
                sum+=C[i];
            }
            tot=ToT;
            memcpy(W+base,W2+base,(Y<<2)<<2);
            for(register int i=0;i<tail;i++)head[Clear[i]]=0;
            tail=0;
            bool o=sum<(k+1>>1);
            for(register int i=1;i<=k;i++){
                register int w=X[i],p=P[i],c=C[i],ni,nj;
                if(1<=p&&p<=m)ni=1,nj=p;
                else if(m+1<=p&&p<=m+n)ni=p-m,nj=m;
                else if(m+n+1<=p&&p<=m*2+n)ni=n,nj=m*2+n+1-p;
                else ni=m*2+n*2+1-p,nj=1;
                int node=Y+i;
                adde(node,id(ni,nj),w),Clear[tail++]=node,Clear[tail++]=id(ni,nj);
                if(c==o)addf(s,node,0x3f3f3f3f),Clear[tail++]=s;
                else addf(node,t,0x3f3f3f3f),Clear[tail++]=t;
            }
            write(isap());
        }
        fwrite(obuf,1,oh-obuf,stdout);
        return 0;
    }
    

    信息

    ID
    81
    时间
    3000ms
    内存
    512MiB
    难度
    9
    标签
    递交数
    11
    已通过
    3
    上传者