Submission #124490

#TimeUsernameProblemLanguageResultExecution timeMemory
124490DJ035조개 줍기 (KOI17_shell)C++14
100 / 100
487 ms35660 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
const int mx = 1505;

ll dpval = 0;
struct RRBIT{
    int n;
    ll *d;
    int *f;
    RRBIT(){}
    RRBIT(int n, ll *p, int *B):n(n),d(p),f(B){}
    
    void upd(int a, int b, int v){
        dpval += v * (b-a+1);
        for(;a<=n;a+=(a&-a)) f[a] += v;
        for(++b;b<=n;b+=(b&-b)) f[b] -= v;
    }
    ll gsum(int i){
        ll s = d[i];
        for(;i;i-=(i&-i)) s += f[i];
        return s;
    }
} I[mx];

ll dp[mx][mx], sh;
int BIT[mx][mx];

inline int t(int i, int j){
    return I[i].gsum(j);
}

int n;
int s[mx], e[mx];

void input(){
    cin >> n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin >> sh;
            dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + sh;
            dpval += dp[i][j];
        }
        I[i] = RRBIT(n, dp[i], BIT[i]);
    }
    cout << dpval << '\n';
}

void query(){
    char c;
    for(int i=1,x,y;i<=n;i++){
        cin >> c >> x >> y;
        c = (c == 'U');
        s[x] = y; e[x] = y + 1;
        int &sx = s[x], &ex = e[x];
        for(;ex <= n; ex++){
            if(x==1) continue;
            if( t(x, ex-1) + c <= t(x-1, ex) ) break;
            //if(c ? t(x,ex-1) < t(x-1,ex) : t(x,ex-1) <= t(x-1,ex)) break;
        }
        for(int j = x+1; j<=n; ++j){
            int &sj = s[j], &ej = e[j];
            sj = s[j-1]; ej = e[j-1];

            for(;1 < sj && sj < ej; sj++){
                
                if( t(j, sj-1) + !c <= t(j-1, sj) ) break;
                //if(c ? t(j,sj-1) <= t(j-1,sj) : t(j,sj-1) < t(j-1,sj)) break;

            }
            if(sj >= ej) break;

            for(;ej <= n; ej++){
                
                if( t(j, ej-1) + c <= t(j-1, ej) ) break;
                //if(c ? t(j,ej-1) < t(j-1,ej) : t(j,ej-1) <= t(j-1,ej)) break;
            }        
        }
        for(int j=x;j<=n;j++){
            if(s[j] >= e[j]) break;
            I[j].upd(s[j], e[j]-1, 2*c-1);
        }
        cout << dpval << '\n';
    }
}

int main(){
    ios_base::sync_with_stdio(false);cin.tie(0);cout.tie(0);
    input();
    query();
}

Compilation message (stderr)

shell.cpp: In function 'void query()':
shell.cpp:56:14: warning: unused variable 'sx' [-Wunused-variable]
         int &sx = s[x], &ex = e[x];
              ^~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...