제출 #935939

#제출 시각아이디문제언어결과실행 시간메모리
935939noyancanturkNafta (COI15_nafta)C++17
100 / 100
175 ms72268 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; 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; } } if(l<=mid-1)dnc(l,mid-1,optl,opt); if(mid+1<=r)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]='.'; vis[P(0,i)]=vis[P(n+1,i)]=1; } for(int i=1;i<=n;i++){ vis[P(i,0)]=vis[P(i,m+1)]=1; for(int j=1;j<=m;j++){ if((s[i][j]=io.gc())=='.'){ vis[P(i,j)]=1; } } io.gc(); } 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(){ #ifdef Local freopen(".in","r",stdin); freopen(".out","w",stdout); #endif 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...