제출 #1358836

#제출 시각아이디문제언어결과실행 시간메모리
1358836NewtonabcNafta (COI15_nafta)C++20
100 / 100
213 ms83528 KiB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=2e3+10;
ll w[N][N],p[N][N],dp[N][N];
int fl,fr;
bool vs[N][N];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
void f(int i,int l,int r,int opl,int opr){
    if(l>r) return;
    int mid=(l+r)/2;
    pair<ll,int> pi={LLONG_MIN,0};
    for(int j=opl;j<=min(mid,opr);j++){
        pair<ll,int> cand={dp[i-1][j]+p[j][mid],-j};
        pi=max(pi,cand);
    }
    dp[i][mid]=pi.first;
    int opt=-pi.second;
    if(l==r) return;
    f(i,l,mid-1,opl,opt);
    f(i,mid+1,r,opt,opr);
}
int main(){
    int n,m; cin>>n >>m;
    vector<string> v;
    for(int i=0;i<n;i++){
        string s; cin>>s;
        v.push_back(s);
    }
    vector<tuple<ll,ll,ll>> ck;
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            if(vs[i][j] || v[i][j]=='.') continue;
            queue<pair<int,int>> q;
            ll sum=0;
            q.push({i,j}),fl=fr=j;
            vs[i][j]=1;
            while(!q.empty()){
                auto [x,y]=q.front();
                q.pop();
                fl=min(fl,y),fr=max(fr,y);
                sum+=v[x][y]-'0';
                for(int i=0;i<4;i++){
                    int nx=x+dx[i];
                    int ny=y+dy[i];
                    if(nx<0 || nx>=n || ny<0 || ny>=m) continue;
                    if(vs[nx][ny] || v[nx][ny]=='.') continue;
                    vs[nx][ny]=true;
                    q.push({nx,ny});
                }
            }
            fl++,fr++;
            ck.push_back({fl,fr,sum});
            p[0][fl]+=sum,p[0][fr+1]-=sum;
            p[fl][fl]-=sum,p[fl][fr+1]+=sum;
        }
    }
    for(int i=0;i<=m;i++){
        for(int j=0;j<=m;j++){
            if(i-1>=0) p[i][j]+=p[i-1][j];
            if(j-1>=0) p[i][j]+=p[i][j-1];
            if(i-1>=0 && j-1>=0) p[i][j]-=p[i-1][j-1];
        }
    }
    for(int i=1;i<=m;i++){
        f(i,0,m,0,m);
    }
    for(int i=1;i<=m;i++){
        ll cd=LLONG_MIN;
        for(int j=0;j<=m;j++) cd=max(cd,dp[i][j]);
        cout<<cd <<"\n";
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…