Submission #1084383

#TimeUsernameProblemLanguageResultExecution timeMemory
1084383vjudge1Nafta (COI15_nafta)C++17
100 / 100
312 ms106440 KiB
#include <bits/stdc++.h> using namespace std; #define int long long #define ld long double #define ar array const int LOG = 20; const int MOD = 1e9 + 7; const int INF = 1e18; const int N = 3005; int n, m; string s[N]; int mx, mn, sum; void dfs(int x,int y){ if(x < 0 || x >= n || y < 0 || y >= m || s[x][y] == '.')return; mn = min(mn, y); mx = max(mx, y); sum += s[x][y] - '0'; s[x][y] = '.'; dfs(x + 1, y);dfs(x - 1, y); dfs(x, y + 1);dfs(x, y - 1); } namespace fewwy{ int bit[N]; void upd(int i,int v){ for(i++;i < N;i += i & -i)bit[i] += v; } int qry(int i){ int ans = 0; for(i++;i;i -= i & -i)ans += bit[i]; return ans; } int qry(int l,int r){ return qry(r) - qry(l - 1); } }; int C[N][N]; int dp[N][N]; void f(int l,int r,int tl,int tr,int j){ if(l > r)return; int tm = (l+ r) / 2; int opt = tl; for(int i = tl;i <= min(tm, tr);i++){ if(dp[i - 1][j - 1] + C[i][tm] > dp[tm][j]){ dp[tm][j] = dp[i - 1][j - 1] + C[i][tm]; opt = i; } } f(l, tm - 1, tl, opt, j); f(tm + 1, r, opt, tr, j); } bool comp(ar<int, 3> a, ar<int, 3> b ){ return a[1] < b[1]; } void skibidisigmaohiorizz(vector<ar<int, 3>> &e){ sort(e.begin(), e.end(), comp); for(auto [l, r, v]: e)fewwy::upd(l, v); int k = 0; for(int j = 1;j <= m;j++){ while(k < e.size() && e[k][1] < j){ fewwy::upd(e[k][0], -e[k][2]); ++k; } for(int i = 1;i <= j;i++)C[i][j] = fewwy::qry(i, j); } } signed main() { cin>>n>>m; for(int i = 0;i < n;i++)cin>>s[i]; vector<ar<int, 3> > e; for(int i = 0;i < n;i++){ for(int j = 0;j < m;j++){ if(s[i][j] == '.')continue; sum = 0, mx = j, mn = j; dfs(i, j); e.push_back({++mn, ++mx, sum}); } } skibidisigmaohiorizz(e); for(int i = 1;i <= m;i++){ f(1, m, 1, m, i); int mx = 0; for(int j = 1;j <= m;j++)mx = max(mx, dp[j][i]); cout<<mx<<'\n'; } }

Compilation message (stderr)

nafta.cpp: In function 'void skibidisigmaohiorizz(std::vector<std::array<long long int, 3> >&)':
nafta.cpp:68:17: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::array<long long int, 3> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   68 |         while(k < e.size() && e[k][1] < j){
      |               ~~^~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...