Submission #404246

#TimeUsernameProblemLanguageResultExecution timeMemory
404246lyc조개 줍기 (KOI17_shell)C++14
100 / 100
586 ms35308 KiB
#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for (int i=(a);i>=(b);--i)

const int mxN = 1505;

int N, A[mxN][mxN], dp[mxN][mxN];

struct Fenwick {
    int ft[mxN];

    Fenwick() {
        memset(ft,0,sizeof ft);
    }

    void update(int a, int b) {
        for (; a <= N; a += a&-a) ft[a] += b;
    }

    void update(int a, int b, int c) {
        update(a,c);
        update(b+1,-c);
    }

    long long query(int a) {
        long long r = 0;
        for (; a; a -= a&-a) r += ft[a];
        return r;
    }
} ft[mxN];

long long S = 0;

int main() {
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);

    cin >> N;
    FOR(i,1,N){
        FOR(j,1,N){
            cin >> A[i][j];
            dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + A[i][j];

            ft[i].update(j,j,dp[i][j]);
            S += dp[i][j];
        }
    }

    cout << S << '\n';
    FOR(i,1,N){
        char op;
        int R, C, V;
        cin >> op >> R >> C;
        V = (op == 'U' ? 1 : -1);

        A[R][C] += V;

        int s = C, e = C+1;
        while (R <= N) {
            while (s < e) {
                int ov = ft[R].query(s);
                int nv = max(ft[R-1].query(s), ft[R].query(s-1)) + A[R][s];
                //TRACE(R _ s _ ov _ nv);
                if (nv != ov) break;
                ++s;
            }

            if (s < e) {
                while (e <= N) {
                    int ov = ft[R].query(e);
                    int nv = max(ft[R-1].query(e), ft[R].query(e-1)+V) + A[R][e];
                    //TRACE(R _ e _ ov _ nv);
                    if (nv == ov) break;
                    ++e;
                }

                ft[R].update(s,e-1,V);
                //TRACE(R _ "UPDATE [)" _ s _ e);
                S += (e-s) * V;
                ++R;
            } else break;
        }

        cout << S << '\n';
    }
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...