Submission #56004

#TimeUsernameProblemLanguageResultExecution timeMemory
56004moonrabbit2조개 줍기 (KOI17_shell)C++11
100 / 100
563 ms27324 KiB
#include <bits/stdc++.h>
#define N 1505
using namespace std;
typedef long long ll;
int n,x,y,d,a[N][N],ddp[N][N],tree[N][N],s[N],e[N];
ll ans;
char c;
// [s,e] add v
void add(int x,int s,int e,int v)
{
    for(;s<=n;s+=s&-s)
        tree[x][s]+=v;
    for(;e<=n;e+=e&-e)
        tree[x][e]-=v;
}
int dp(int x,int y)
{
    int res=ddp[x][y];
    for(;y;y-=y&-y)
        res+=tree[x][y];
    return res;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>a[i][j];
            ddp[i][j]=a[i][j]+max(ddp[i-1][j],ddp[i][j-1]);
            ans+=ddp[i][j];
        }
    }
    cout<<ans<<'\n';
    for(int q=1;q<=n;q++){
        cin>>c>>x>>y;
        d=(c=='U'?1:-1);
        for(int i=1;i<=n;i++)
            s[i]=n+1,e[i]=0;
        s[x]=e[x]=y;
        for(int xx=x,yy=y;;){
            if(yy<n&&max(dp(xx-1,yy+1),dp(xx,yy))+d==max(dp(xx-1,yy+1),dp(xx,yy)+d))
                yy++;
            else
                xx++;
            if(xx>n)
                break;
            e[xx]=yy;
        }
        for(int xx=x,yy=y;;){
            if(xx<n&&max(dp(xx+1,yy-1),dp(xx,yy))+d==max(dp(xx+1,yy-1),dp(xx,yy)+d)){
                xx++;
            }
            else
                yy++;
            if(yy>n||e[xx]<yy)
                break;
            s[xx]=min(s[xx],yy);
        }
        for(int i=x;i<=n;i++){
            if(s[i]<=e[i]){
                ans+=(e[i]-s[i]+1)*d;
                add(i,s[i],e[i]+1,d);
            }
        }
        cout<<ans<<'\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...