Submission #18035

#TimeUsernameProblemLanguageResultExecution timeMemory
18035ainta여왕벌 (KOI15_queen)C++98
101 / 100
3050 ms56548 KiB
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;
int n, Q, Sx[710][710], Sy[710][710];
char p[710][710][28];
struct A{
    int a, b, c;
    A operator +(const A &x){
        A t;
        t.a = a+x.a, t.b = b+x.b, t.c = c+x.c;
        return t;
    }
    A operator -(const A &x){
        A t;
        t.a = a-x.a, t.b = b-x.b, t.c = c-x.c;
        return t;
    }
};
A Start(A x, int num){
    A t;
    t.a = min(x.a, num);
    t.b = min(x.b, num - t.a);
    t.c = min(x.c, num - t.a - t.b);
    return t;
}
A End(A x, int num){
    A t;
    t.c = min(x.c, num);
    t.b = min(x.b, num - t.c);
    t.a = min(x.a, num - t.c - t.b);
    return t;
}
int Num(A x){
    int cnt = x.a + x.b + x.c;
    return x.a * (cnt+cnt+3-x.a) / 2 + x.b;
}
void Addx(int x, int by, int ey, A tp, int c){
    Sx[x][by + tp.a]+=c;
    Sx[x][by + tp.a + tp.b]+=c;
    Sx[x][by + tp.a + tp.b + tp.c]-= c*2;
}
void Addy(int y, int bx, int ex, A tp, int c){
    Sy[bx][y]+=2*c;
    Sy[bx + tp.c][y]-=c;
    Sy[bx + tp.c + tp.b][y]-= c;
}
void Add(A *tp, int k, int ck){
    if(k == 0)tp->a += ck;
    else if(k == 1)tp->b += ck;
    else tp->c += ck;
}
void Do(int bx, int by, int ex, int ey, vector<A> &ret, vector<int>C){
    int i, j, k, cnt = ex-bx+ey-by+1, mx, my, cnt2, sz, pv;
    A tp, tp2, tp3, tp4, tp5, tres;
    ret.resize((cnt+1)*(cnt+2)/2);
    if(bx == ex){
        for(i=0;i<=cnt;i++){
            for(j=0;j<=cnt - i;j++){
                k = cnt-i-j;
                tp.a=i,tp.b=j,tp.c=k;
                ret[Num(tp)] = tp;
            }
        }
        return;
    }
    if(by == ey){
        for(i=0;i<=cnt;i++){
            for(j=0;j<=cnt - i;j++){
                k = cnt-i-j;
                tp.a=i,tp.b=j,tp.c=k;
                ret[Num(tp)] = tp;
            }
        }
        return;
    }
    if(bx + 1 == ex && by + 1 == ey){
        int t, tw[3], l, pv = 0;
        for(i=0;i<=3;i++){
            for(j=0;j<=3-i;j++){
                k = 3-i-j;
                tp.a=i,tp.b=j,tp.c=k;
                tp2 = tp;
                for(l=0;l<i;l++)tw[l]=0;
                for(l=i;l<i+j;l++)tw[l]=1;
                for(l=i+j;l<3;l++)tw[l]=2;
                Add(&tp2, tw[1], -1);
                t = p[ex][ey][tw[0]*9+tw[1]*3+tw[2]];
                if(t == 'L')Add(&tp2, tw[0], 1);
                if(t == 'D')Add(&tp2, tw[1], 1);
                if(t == 'U')Add(&tp2, tw[2], 1);
                ret[Num(tp)] = tp2;
                Addx(ex, ey, ey, tp2 - Start(tp2, 1) - End(tp2, 1), C[pv]);
                pv++;
            }
        }
        return;
    }
    mx = (bx + ex + 1)>>1, my = (by + ey + 1)>>1;
    vector<int>CNT;
    vector<A>res, res2, res3, res4;
    cnt2 = mx-bx+my-by+1;
    sz = (cnt2+1)*(cnt2+2)/2;
    CNT.resize(sz);
    res.resize(sz);
    res2.resize(sz);
    res3.resize(sz);
    res4.resize(sz);
    pv = 0;
    for(i=0;i<=cnt;i++){
        for(j=0;j<=cnt-i;j++){
            k = cnt - i -j;
            tp.a = i,tp.b = j, tp.c =k;
            tp2 = tp - Start(tp, ex-mx) - End(tp, ey-my);
            CNT[Num(tp2)]+=C[pv];
            pv++;
        }
    }
 
 
 
    Do(bx,by,mx,my, res, CNT);
 
    for(i=0;i<sz;i++)CNT[i]=0;
    pv = 0;
    for(i=0;i<=cnt;i++){
        for(j=0;j<=cnt-i;j++){
            k = cnt - i -j;
            tp.a = i,tp.b = j, tp.c =k;
            tp2 = tp - Start(tp, ex-mx) - End(tp, ey-my);
            tp = Start(tp, ex-mx) + Start(res[Num(tp2)], my - by + 1);
            CNT[Num(tp)] += C[pv];
            pv++;
        }
    }
 
    Do(mx,by,ex,my,res2, CNT);
 
    for(i=0;i<sz;i++)CNT[i]=0;
    pv = 0;
    for(i=0;i<=cnt;i++){
        for(j=0;j<=cnt-i;j++){
            k = cnt - i - j;
            tp.a = i,tp.b = j, tp.c = k;
            tp2 = tp - Start(tp, ex-mx) - End(tp, ey-my);
            tp = End(res[Num(tp2)], mx - bx + 1) + End(tp, ey-my);
            CNT[Num(tp)] += C[pv];
            pv++;
        }
    }
    Do(bx,my,mx,ey,res3, CNT);
 
 
 
    for(i=0;i<sz;i++)CNT[i]=0;
    pv = 0;
    for(i=0;i<=cnt;i++){
        for(j=0;j<=cnt-i;j++){
            k = cnt - i - j;
            tp.a = i,tp.b = j, tp.c = k;
            tp2 = tp - Start(tp, ex-mx) - End(tp, ey-my);
            tp3 = Start(tp, ex-mx) + Start(res[Num(tp2)], my - by + 1);
            tp4 = End(res[Num(tp2)], mx - bx + 1) + End(tp, ey-my);
            tp = End(res2[Num(tp3)], ex - mx + 1) + Start(res3[Num(tp4)], ey - my + 1) - Start(res3[Num(tp4)], 1);
            CNT[Num(tp)] += C[pv];
            pv++;
        }
    }
    Do(mx,my,ex,ey,res4, CNT);
 
    pv = 0;
    for(i=0;i<=cnt;i++){
        for(j=0;j<=cnt-i;j++){
            k = cnt - i - j;
            tp.a = i,tp.b = j, tp.c = k;
            tp2 = tp - Start(tp, ex-mx) - End(tp, ey-my);
            tp3 = Start(tp, ex-mx) + Start(res[Num(tp2)], my - by + 1);
            tp4 = End(res[Num(tp2)], mx - bx + 1) + End(tp, ey-my);
            tp5 = End(res2[Num(tp3)], ex - mx + 1) + Start(res3[Num(tp4)], ey - my + 1) - Start(res3[Num(tp4)], 1);
            tres = Start(res2[Num(tp3)], my - by) + res4[Num(tp5)] + End(res3[Num(tp4)], mx - bx);
            ret[Num(tp)] = tres;
            pv++;
        }
    }
}
int main(){
    int i, j, a, b, c;
    scanf("%d%d",&n,&Q);
    for(i=2;i<=n;i++){
        for(j=2;j<=n;j++){
            scanf("%s",p[i][j]);
        }
    }
    A tp;
    vector<A> ret;
    vector<int> C;
    C.resize((n+n)*(n+n+1)/2);
    while(Q--){
        scanf("%d%d%d",&a,&b,&c);
        tp.a = a, tp.b = b, tp.c = c;
        C[Num(tp)]++;
        Addy(1, 1, n, Start(tp, n), 1);
        Addx(1, 2, n, End(tp, n-1), 1);
    }
    Do(1, 1, n, n, ret, C);
    for(i=1;i<=n;i++)for(j=1;j<=n;j++)Sx[i][j]+=Sx[i][j-1];
    for(i=1;i<=n;i++)for(j=1;j<=n;j++)Sy[i][j]+=Sy[i-1][j];
    for(i=1;i<=n;i++){
        for(j=1;j<=n;j++){
            printf("%d ",Sx[i][j]+Sy[i][j]+1);
        }
        printf("\n");
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...