제출 #931068

#제출 시각아이디문제언어결과실행 시간메모리
931068noyancanturkNafta (COI15_nafta)C++17
100 / 100
191 ms150436 KiB
#ifndef Local
    #pragma GCC optimize("O3,unroll-loops")
    const int lim=2e3+100;
#else
    const int lim=1e3+3;
#endif

#include "bits/stdc++.h"
using namespace std;

#define int int64_t
#define pb push_back

int mod=1e9+7;
//const int mod=(1ll<<61)-1;

using pii=pair<int,int>;

string s[lim];

int n,m,gn=0;
bool vis[lim*lim];
int parent[lim*lim];
vector<int>val,ll,rr;

void dfs(int node,int par){
    vis[node]=1;
    int x=node/lim,y=node%lim;
    parent[node]=parent[par];
    val.back()+=s[x][y]-'0';
    ll.back()=min(ll.back(),y);
    rr.back()=max(rr.back(),y);
    for(int dd:{1,-1,lim,-lim}){
        if(!vis[node+dd]){
            dfs(node+dd,node);
        }
    }
}

#define P(i,j) ((i)*lim+(j))

int g[lim][lim];

int dp[lim][lim],curl;

inline void dnc(int l,int r,int optl,int optr){
    int mid=(l+r)>>1;
    if(r<l)return;
    int opt=min(optr,mid-1);
    dp[curl][mid]=g[mid][opt]+dp[curl-1][opt];
    for(int i=opt;optl<=i;i--){
        if(dp[curl][mid]<g[mid][i]+dp[curl-1][i]){
            dp[curl][mid]=g[mid][i]+dp[curl-1][i];
            opt=i;
        }
    }
    dnc(l,mid-1,optl,opt);
    dnc(mid+1,r,opt,optr);
}

inline void solve(){
    cin>>n>>m;
    s[0]=s[n+1]=string(m+2,'.');
    for(int i=1;i<=n;i++){
        cin>>s[i];
        s[i]='.'+s[i]+'.';
    }
    for(int i=0;i<=n+1;i++){
        for(int j=0;j<=m+1;j++){
            if(s[i][j]=='.'){
                vis[P(i,j)]=1;
            }
        }
    }
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(!vis[P(i,j)]){
                parent[P(i,j)]=gn++;
                val.pb(0);
                ll.pb(INT_MAX);
                rr.pb(-1);
                dfs(P(i,j),-1);
            }
        }
    }
    int*lp=ll.data(),*rp=rr.data(),*valp=val.data();
    for(int i=0;i<gn;i++){
        g[lp[i]][0]+=valp[i];
        g[lp[i]][lp[i]]-=valp[i];
        g[rp[i]+1][0]-=valp[i];
        g[rp[i]+1][lp[i]]+=valp[i];
    }
    for(int i=0;i<=m;i++){
        for(int j=1;j<=m;j++){
            g[i][j]+=g[i][j-1];
        }
    }
    for(int i=0;i<=m;i++){
        for(int j=1;j<=m;j++){
            g[j][i]+=g[j-1][i];
        }
    }
    for(int i=0;i<=m;i++){
        for(int j=0;j<=m;j++){
            dp[i][j]=LLONG_MIN;
        }
    }
    dp[0][0]=0;
    for(int i=1;i<=m;i++){
        dp[0][i]=g[i][0];
    }
    cout<<*max_element(dp[0]+1,dp[0]+m+1)<<"\n";
    for(int i=1;i<m;i++){
        curl=i;
        dnc(i,m,1,m);
        cout<<*max_element(dp[i]+i+1,dp[i]+m+1)<<"\n";
    }
}

signed main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#ifdef Local  
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
#else
    
#endif
    int t=1;
    //cin>>t;
    while (t--)
    {
        solve();
    }
}

컴파일 시 표준 에러 (stderr) 메시지

nafta.cpp: In function 'void solve()':
nafta.cpp:29:28: warning: array subscript -1 is below array bounds of 'int64_t [4410000]' {aka 'long int [4410000]'} [-Warray-bounds]
   29 |     parent[node]=parent[par];
      |                  ~~~~~~~~~~^
nafta.cpp:23:5: note: while referencing 'parent'
   23 | int parent[lim*lim];
      |     ^~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...