提交时间:2025-10-18 12:52:46

运行 ID: 38580

#include<bits/stdc++.h> using namespace std; #define pii pair<int,int> #define fr first #define sc second #define mk make_pair int read(){int x=0,f=1;char c=getchar();while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;} const int MAXN=4010,inf=1e9; bool AAA; int n,m,as[4][MAXN][MAXN]; bool a[MAXN][MAXN]; int lst[MAXN][MAXN],nxt[MAXN][MAXN]; struct segtree{ #define lson (pos<<1) #define rson (pos<<1|1) pii t[MAXN<<2]; int vis[MAXN<<2]; void init(int pos,int l,int r){ t[pos]={0,0}; if(l==r)return; int mid=(l+r)>>1; init(lson,l,mid),init(rson,mid+1,r); } #define qy(x,y) (x.fr?x.fr*y+x.sc:inf) void update(int pos,int l,int r,pii x){ if(!t[pos].fr){t[pos]=x;return;} if(l==r){ if(qy(t[pos],l)>qy(x,l))t[pos]=x; return; } int mid=(l+r)>>1; if(qy(t[pos],mid)>qy(x,mid))swap(t[pos],x); if(qy(t[pos],l)>qy(x,l))update(lson,l,mid,x); if(qy(t[pos],r)>qy(x,r))update(rson,mid+1,r,x); } int query(int pos,int l,int r,int x){ if(!t[pos].fr)return inf; if(l==r)return qy(t[pos],x); int mid=(l+r)>>1; if(x<=mid)return min(qy(t[pos],x),query(lson,l,mid,x)); else return min(qy(t[pos],x),query(rson,mid+1,r,x)); } }L,R; void slv(){ n=read(),m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){ char c=getchar(); while(c!='0'&&c!='1')c=getchar(); a[i][j]=c=='1',as[0][i][j]=as[1][i][j]=as[2][i][j]=as[3][i][j]=inf; } for(int i=1;i<=n;i++){ lst[i][0]=nxt[i][m+1]=inf; for(int j=1;j<=m;j++) if(a[i][j])lst[i][j]=0; else lst[i][j]=lst[i][j-1]+1; for(int j=m;j>=1;j--) if(a[i][j])nxt[i][j]=0; else nxt[i][j]=nxt[i][j+1]+1; for(int j=1;j<=m;j++){ if(lst[i][j]<inf)lst[i][j]*=lst[i][j]; else lst[i][j]=1e9+(m*m*2); if(nxt[i][j]<inf)nxt[i][j]*=nxt[i][j]; else nxt[i][j]=1e9+(m*m*2); } } for(int j=1;j<=m;j++){ L.init(1,1,m),R.init(1,1,m); for(int i=1;i<=n;i++){ L.update(1,1,n,mk(-2*i,i*i+lst[i][j])); R.update(1,1,n,mk(-2*i,i*i+nxt[i][j])); int l=L.query(1,1,n,i)+i*i,r=R.query(1,1,n,i)+i*i; as[0][i][j]=min({as[0][i][j],l,r}); as[2][i][j]=min({as[2][i][j],l}); as[3][i][j]=min({as[3][i][j],r}); } L.init(1,1,m),R.init(1,1,m); for(int i=n;i>=1;i--){ L.update(1,1,n,mk(-2*i,i*i+lst[i][j])); R.update(1,1,n,mk(-2*i,i*i+nxt[i][j])); int l=L.query(1,1,n,i)+i*i,r=R.query(1,1,n,i)+i*i; as[1][i][j]=min({as[1][i][j],l,r}); as[2][i][j]=min({as[2][i][j],l}); as[3][i][j]=min({as[3][i][j],r}); } } for(int i=1;i<=n;i++)for(int j=1;j<=m;j++){ for(int o=0;o<=3;o++)as[o][0][0]^=as[o][i][j]; } printf("%d %d %d %d",as[0][0][0],as[1][0][0],as[2][0][0],as[3][0][0]); } bool BBB; signed main(){ //freopen("travel.in","r",stdin);freopen("travel.out","w",stdout); slv(); // cerr<<clock()*1.0/CLOCKS_PER_SEC<<"s\n"<<((&AAA)-(&BBB))/1024.0/1024.0<<"MB\n"; return 0; }