제출 #1346617

#제출 시각아이디문제언어결과실행 시간메모리
1346617ElayV13Nafta (COI15_nafta)C++20
100 / 100
264 ms141052 KiB
#include <bits/stdc++.h>
using namespace std;

int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
const int N=2501,INF=INT_MAX;

int n,m;
char a[N][N];
bool used[N][N];
int cs[N*N];
int cc[N][N];
int ss[N];
int co=0;
int mnj[N*N];
int mxj[N*N];
int cost[N][N];
bool vis[N*N];

bool go(int x,int y){
      if(min(x,y)>=1&&x<=n&&y<=m&&a[x][y]!='.'&&!used[x][y]) return 1;
      return 0;
}

void dfs(int x,int y){
      cc[x][y]=co;
      mnj[cc[x][y]]=min(mnj[cc[x][y]],y);
      mxj[cc[x][y]]=max(mxj[cc[x][y]],y);
      cs[cc[x][y]]+=(a[x][y]-'0');
      used[x][y]=1;
      for(int i=0;i<4;i++){
            int X=x+dx[i];
            int Y=y+dy[i];
            if(go(X,Y)) dfs(X,Y);
      }
}

int dp[N][N];

void f(int c,int l,int r,int optl,int optr){
      if(l>r) return;
      int mid=(l+r)>>1;
      pair<int,int>best={0,-1};
      for(int i=optl;i<=min(mid,optr);i++) best=max(best,{dp[c-1][i]-cost[i][mid]+ss[mid],i});
      dp[c][mid]=best.first;
      int nwopt=best.second;
      f(c,l,mid-1,optl,nwopt);
      f(c,mid+1,r,nwopt,optr);
}

void solve(){
      cin>>n>>m;
      for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j];
      for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                  if(!used[i][j]&&a[i][j]!='.') co++,dfs(i,j);
            }
      }
      for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++) vis[cc[j][i]]=0;
            for(int j=1;j<=n;j++){
                  if(a[j][i]=='.') continue;
                  if(vis[cc[j][i]]) continue;
                  int l=mnj[cc[j][i]],r=mxj[cc[j][i]];
                  cost[i][l]+=cs[cc[j][i]];
                  cost[i][r+1]-=cs[cc[j][i]];
                  vis[cc[j][i]]=1;
            }
            for(int j=1;j<=m;j++) cost[i][j]+=cost[i][j-1];
      }
      for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++) vis[cc[j][i]]=0;
            for(int j=1;j<=n;j++){
                  if(vis[cc[j][i]]) continue;
                  ss[i]+=cs[cc[j][i]];
                  vis[cc[j][i]]=1;
            }
      }
      for(int i=1;i<=m;i++) dp[1][i]=ss[i];
      for(int c=2;c<=m;c++){
            f(c,1,m,1,m);
      }
      for(int i=1;i<=m;i++){
            int res=0;
            for(int j=1;j<=m;j++) res=max(res,dp[i][j]);
            cout<<res<<"\n";
      } 
}
signed main(){
      for(int i=0;i<N*N;i++) mnj[i]=INF;
      ios_base::sync_with_stdio(0);
      cin.tie(0);
      cout.tie(0);
      int T=1;//cin>>T;
      while(T--) solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...