1 条题解
-
0
你们好口牙。
我不会这个题。
我觉得这个题比 https://www.luogu.com.cn/problem/CF1368H1 更困难但是那个是黑。
但是我会卡常口牙。
所以我们卡常吧。
好像过了?
不是 常见数据范围吗?
#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
- 上传者