답안 #74457

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
74457 2018-09-02T05:18:41 Z gs18115 조개 줍기 (KOI17_shell) C++14
0 / 100
227 ms 53704 KB
#include<iostream>
using namespace std;
typedef long long LL;
const LL MAXN=1510;
const LL n=2048;
LL FT[MAXN][MAXN];
void FI(const LL&i,LL j,const LL&dif)
{
    if(j==0)
        return;
    for(;j<MAXN;j+=j&-j)
        FT[i][j]+=dif;
    return;
}
void FS(const LL&i,LL j,LL&SC)
{
    SC=0;
    for(;j>0;j=j&(j-1))
        SC+=FT[i][j];
    return;
}
LL arr[MAXN][MAXN];
LL dp[MAXN][MAXN];
LL S[MAXN],E[MAXN];
char C;
LL ch;
LL A,B;
LL N;
LL i,j;
LL X,Y,x,y,flag;
LL ans;
LL t1,t2,t3;
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin>>N;
    for(i=1;i<=N;i++)
        for(j=1;j<=N;j++)
            cin>>arr[i][j];
    for(i=1;i<=N;i++)
    {
        for(j=1;j<=N;j++)
        {
            dp[i][j]=arr[i][j]+max(dp[i-1][j],dp[i][j-1]);
            FI(i,j,dp[i][j]-dp[i][j-1]);
            ans+=dp[i][j];
        }
    }
    cout<<ans<<endl;
    for(i=0;i<N;i++)
    {
        cin>>C>>X>>Y;
        ch=C=='U'?1LL:-1LL;
        arr[X][Y]+=ch;
        x=X;
        y=Y;
        S[x]=y;
        flag=N;
        while(x<N)
        {
            if(y<N)
            {
                FS(x,y,t1);
                FS(x+1,y,t2);
                FS(x+1,y-1,t3);
                if(t2!=max(t1+ch,t3)+arr[x+1][y])
                    S[++x]=y;
                else
                {
                    FS(x,y+1,t2);
                    FS(x-1,y+1,t3);
                    if(t2!=max(t1+ch,t3)+arr[x][y+1])
                        y++;
                    else
                    {
                        flag=x;
                        break;
                    }
                }
            }
            else
            {
                FS(x,N,t1);
                FS(x+1,N,t2);
                FS(x+1,N-1,t3);
                if(t2!=max(t1+ch,t3)+arr[x+1][y])
                    S[++x]=y;
                else
                {
                    flag=x;
                    break;
                }
            }
        }
        x=X;
        y=Y;
        while(x<=N)
        {
            if(y<N)
            {
                FS(x,y,t1);
                FS(x,y+1,t2);
                FS(x-1,y+1,t3);
                if(t2!=max(t1+ch,t3)+arr[x][y+1])
                    y++;
                else
                    E[x++]=y;
            }
            else
                E[x++]=y;
        }
        for(j=X;j<=flag;j++)
        {
            ans+=ch*(E[j]-S[j]+1);
            FI(j,S[j],ch);
            FI(j,E[j]+1,-ch);
        }
        cout<<ans<<'\n';
    }
    cout<<endl;
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 2552 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 227 ms 53704 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 2552 KB Output isn't correct
2 Halted 0 ms 0 KB -