Submission #932980

#TimeUsernameProblemLanguageResultExecution timeMemory
932980idiotcomputerNafta (COI15_nafta)C++11
34 / 100
125 ms113344 KiB
#include <bits/stdc++.h> using namespace std; #define pii pair<int,int> #define f first #define s second #define pb push_back const int mxN = 4*1e6; const int mxS = 2000; int R,S; int sums[mxN]; pii bounds[mxN]; int grid[mxN]; int vis[mxN]; int cnt = 0; void bfs(int node){ queue<int> queue; queue.push(node); int curr,r,s; bounds[cnt].f = mxS+1; bounds[cnt].s = -1; while (queue.size() > 0){ curr = queue.front(); queue.pop(); if (vis[curr] != -1 || grid[curr] == -1){ continue; } vis[curr] = cnt; sums[cnt] += grid[curr]; r = curr / S; s = curr % S; bounds[cnt].f = min(bounds[cnt].f, s); bounds[cnt].s = max(bounds[cnt].s, s); if (r > 0){ queue.push(curr - S); } if (r < R-1){ queue.push(curr+S); } if (s > 0){ queue.push(curr-1); } if (s < S-1){ queue.push(curr+1); } } cnt++; } int res[mxS+1]; int tres[mxS+1]; int addon[mxS+1]; vector<vector<int>> cont(mxS); void dcdp(int l, int r, int sl, int sr){ int m = (l+r)/2; for (int idx : cont[m]){ addon[bounds[idx].f-1] += sums[idx]; } tres[m] = 0; int cadd = 0; int bidx = -1; for (int i = m-1; i >= sl; i--){ cadd += addon[i]; if (res[i] + cadd > tres[m]){ tres[m] = res[i] + cadd; bidx = i; } } for (int idx : cont[m]){ addon[bounds[idx].f-1] -= sums[idx]; } if (l != m){ dcdp(l,m-1,sl,bidx); } if (r != m){ dcdp(m+1,r,bidx,sr); } } int main() { memset(sums,0,sizeof(sums)); for (int i =0; i < mxN; i++){ vis[i] = -1; } ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> R >> S; string row; for (int i =0; i < R; i++){ cin >> row; for (int j =0; j < S; j++){ if (row[j] == '.'){ grid[i*S+j] = -1; } else { grid[i*S+j] = row[j]-'0'; } } } for (int i = 0; i < R*S; i++){ if (vis[i] == -1 && grid[i] != -1){ bfs(i); } } for (int i =0; i < cnt; i++){ bounds[i].f += 1; bounds[i].s += 1; for (int j = bounds[i].f; j <= bounds[i].s; j++){ cont[j].pb(i); } } memset(res,0,sizeof(res)); memset(addon,0,sizeof(addon)); int tot; for (int i = 0; i < S; i++){ dcdp(0,S,0,S); tot = 0; for (int j = 0; j <= S; j++){ /// cout << tres[j] << " "; tot = max(tot,tres[j]); } // cout << '\n'; cout << tot << '\n'; swap(tres,res); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...