제출 #1346602

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

int dx[]={1,-1,0,0},dy[]={0,0,1,-1};
const int N=301;

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;
set<int>all[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;
      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];

int cost(int i,int j){
      int s=ss[j];
      int same=0;
      for(int ccc:all[i]){
            if(all[j].count(ccc)>0) same+=cs[ccc];
      }
      return same;
}

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++){
                  all[i].insert(cc[j][i]);
            }
            for(int ccc:all[i]) ss[i]+=cs[ccc];
      }
      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(){
      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...