제출 #935931

#제출 시각아이디문제언어결과실행 시간메모리
935931noyancanturkNafta (COI15_nafta)C++17
100 / 100
155 ms76440 KiB
#ifndef Local
    #pragma GCC optimize("O3,unroll-loops")
    const int lim=2e3+5;
#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>;
    
char s[lim][lim];
    
int n,m,gn=0;
bool vis[lim*lim];
int parent[lim*lim];
vector<int>val,ll,rr;
    
inline 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);
}
struct inpout{
    static const int sz=1<<16;
    char inp[sz];
    int curc=0,len=0;
    inline char gc(){
        if(curc==len){
            len=(int)fread(inp,1,sz,stdin);
            curc=0;
            if(!len)return -1;
        }
        return inp[curc++];
    }
    inline void readstr(char*c,int ll){
        for(int i=0;i<ll;i++){
            c[i]=gc();
        }
        gc();
    }
    inline int readint(){
        char c=gc();
        bool isneg=(c=='-');
        int ans=0;
        if(!isneg)ans=c-'0';
        c=gc();
        while('0'<=c&&c<='9'){
            ans=10*ans+c-'0';
            c=gc();
        }
        if(isneg)return -ans;
        return ans;
    }
    char out[sz];
    int curind=0;
    inline void flush(){
        fwrite(out,1,curind,stdout);
        curind=0;
    }
    inline void putchar(char c){
        out[curind++]=c;
        if(curind==sz)flush();
    }
    char temp[10];
    inline void putint(int i){
        int lll=0;
        while(i){
            temp[lll++]=(i%10)+'0';
            i/=10;
        }
        while(lll){
            putchar(temp[--lll]);
        }
        putchar('\n');
    }
}io;
inline void solve(){
    n=io.readint(),m=io.readint();
    for(int i=0;i<m+2;i++){
        s[0][i]=s[n+1][i]='.';
    }
    for(int i=1;i<=n;i++){
        io.readstr(s[i]+1,m);
        s[i][0]=s[i][m+1]='.';
    }
    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]=INT_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 'int [4020025]' [-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...