Submission #331606

#TimeUsernameProblemLanguageResultExecution timeMemory
331606oolimry조개 줍기 (KOI17_shell)C++14
100 / 100
1157 ms44652 KiB
#include <bits/stdc++.h> #define all(x) (x).begin(), (x).end() using namespace std; typedef pair<int,int> ii; typedef long long lint; int n, Q; struct segment{ int tree[3005]; int N; void init(int _N){ N = _N; fill(tree,tree+2*N, 0); } void update(int l, int r, int v){ for(l += N, r += N+1;l < r;l >>= 1, r >>= 1){ if(l&1) tree[l++] += v; if(r&1) tree[--r] += v; } } int query(int i){ int res = 0; for(i += N;i;i >>= 1) res += tree[i]; return res; } } seg[1505]; int arr[1505][1505]; int dp[1505][1505]; lint ans = 0; void update(int R, int C, int v){ int s = C, e = C; arr[R][C] += v; for(int r = R;r <= n;r++){ while(s < e){ int recalc = max(seg[r].query(s-1), seg[r-1].query(s)) + arr[r][s]; int prev = seg[r].query(s); if(recalc != prev) break; s++; } seg[r].update(s, n, v); while(e <= n){ int recalc = max(seg[r].query(e-1), seg[r-1].query(e)) + arr[r][e]; int prev = seg[r].query(e) - v; if(recalc == prev) break; e++; } seg[r].update(e, n, -v); ans += v*(e-s); if(s == e) break; } } int main(){ cin >> n; Q = n; for(int r = 1;r <= n;r++){ for(int c = 1;c <= n;c++){ cin >> arr[r][c]; dp[r][c] = arr[r][c] + max(dp[r-1][c], dp[r][c-1]); ans += dp[r][c]; } } for(int r = 0;r <= n;r++) seg[r].init(n+1); for(int r = 1;r <= n;r++){ for(int c = 1;c <= n;c++){ seg[r].update(c,c,dp[r][c]); } } cout << ans << "\n"; while(Q--){ char cmd; int R, C; cin >> cmd >> R >> C; if(cmd == 'U') update(R, C, 1); if(cmd == 'D') update(R, C, -1); cout << ans << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...