답안 #7571

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
7571 2014-08-11T09:25:45 Z dohyun0324 코끼리 (Dancing Elephants) (IOI11_elephants) C++14
26 / 100
9000 ms 25320 KB
#include "elephants.h"
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int ix,iy,n,l,m,r,p=1,q,k,a[150010],d[150010],dap,leng[150010],a2[150010];
struct data
{
    int c,x,y,len,val;
}ar[400][800];
void balance(int sx,int sy,int slen)
{
    if(ar[sx][sy].c>slen){
        while(ar[sx][sy].c>slen){
            sy--;
            if(sy==0){sx--; sy=leng[sx];}
            if(ar[sx][sy].c==0){ sx--; sy=leng[sx];}
        }
        sy++;
        if(sy==leng[sx]+1) sx++, sy=1;
    }
    else{
        while(ar[sx][sy].c<=slen){
            if(ar[sx][sy].c==0) sx++, sy=1;
            else{
                sy++;
                if(sy==leng[sx]+1) sx++, sy=1;
            }
        }
    }
    ix=sx; iy=sy;
}
void erase1(int x)
{
    int i,j,*e,pos,b,kx,ky;
    e=upper_bound(d+1,d+p+1,x);
    pos=e-d-1;
    while(!leng[pos]) pos--;
    for(i=1;i<=leng[pos];i++){
        if(ar[pos][i].c==x) break;
    }
    b=i;
    for(i=b;i<=leng[pos];i++){
        ar[pos][i].c=ar[pos][i+1].c; ar[pos][i].x=ar[pos][i+1].x; ar[pos][i].y=ar[pos][i+1].y; ar[pos][i].len=ar[pos][i+1].len; ar[pos][i].val=ar[pos][i+1].val;
    }
    if(b==1){
        d[pos]=ar[pos][1].c;
    }
    leng[pos]--;
    if(b==1) return;
    kx=ar[pos][b-1].x; ky=ar[pos][b-1].y;
    if(ky>leng[kx]) ky=leng[kx];
    if(ky==0){kx--; ky=leng[kx];}
    balance(kx,ky,ar[pos][b-1].len);
    kx=ix; ky=iy;
    for(i=b-1;i>=1;i--){
        kx=ix; ky=iy;
        while(ar[kx][ky].c-ar[pos][i].c>l){
            ky--;
            if(ky==0){kx--; ky=leng[kx];}
            if(ar[kx][ky].c==0){ kx--; ky=leng[kx];}
        }
        ky++;
        if(ky==leng[kx]+1){kx++; ky=1;}
        if(kx==p+1){
            ar[pos][i].val=0;
            continue;
        }
        if(kx>pos){
            ar[pos][i].x=kx;
            ar[pos][i].y=ky;
            ar[pos][i].len=ar[pos][i].c+l;
            ar[pos][i].val=0;
            continue;
        }
        ar[pos][i].x=ar[kx][ky].x;
        ar[pos][i].y=ar[kx][ky].y;
        ar[pos][i].len=ar[kx][ky].len;
        ar[pos][i].val=ar[kx][ky].val+1;
    }
}
void insert1(int x)
{
    int i,j,*e,pos,b,kx,ky,sx,sy,slen;
    e=upper_bound(d+1,d+p+1,x);
    pos=e-d-1;
    if(pos==0) pos=1, d[1]=x;
    for(i=1;i<=leng[pos];i++){
        if(ar[pos][i].c>x || ar[pos][i].x==0) break;
    }
    b=i;
    sx=ar[pos][b].x; sy=ar[pos][b].y; slen=ar[pos][b].len;
    for(i=leng[pos]+1;i>=b+1;i--){
        ar[pos][i].c=ar[pos][i-1].c; ar[pos][i].x=ar[pos][i-1].x; ar[pos][i].y=ar[pos][i-1].y; ar[pos][i].len=ar[pos][i-1].len; ar[pos][i].val=ar[pos][i-1].val;
    }
    ar[pos][b].c=x;
    if(b==1) d[pos]=ar[pos][b].c;
    leng[pos]++;
    if(b==leng[pos]) sx=pos+1, sy=1, slen=ar[pos][b].c+l;
    balance(sx,sy,slen);
    kx=ix; ky=iy;
    for(i=b;i>=1;i--){
        while(ar[kx][ky].c-ar[pos][i].c>l){
            ky--;
            if(ky==0){kx--; ky=leng[kx];}
            if(ar[kx][ky].c==0){ kx--; ky=leng[kx];}
        }
        ky++;
        if(ky==leng[kx]+1){kx++; ky=1;}
        if(kx==p+1){
            ar[pos][i].x=kx;
            ar[pos][i].y=1;
            ar[pos][i].len=ar[pos][i].c+l;
            ar[pos][i].val=0;
            continue;
        }
        if(kx>pos){
            ar[pos][i].x=kx;
            ar[pos][i].y=ky;
            ar[pos][i].len=ar[pos][i].c+l;
            ar[pos][i].val=0;
            continue;
        }
        ar[pos][i].x=ar[kx][ky].x;
        ar[pos][i].y=ar[kx][ky].y;
        ar[pos][i].len=ar[kx][ky].len;
        ar[pos][i].val=ar[kx][ky].val+1;
    }
}
void query()
{
    int kx,ky,i,j,sx,sy,slen;
    for(i=1;;i++){
        if(leng[i]!=0) break;
    }
    kx=i; ky=1;
    while(1){
        if(kx==p-1) kx=p-1;
        sx=ar[kx][ky].x; sy=ar[kx][ky].y; slen=ar[kx][ky].len; dap+=ar[kx][ky].val+1;
        if(sy>leng[sx]) sy=leng[sx];
        if(sy==0){sx--; sy=leng[sx];}
        balance(sx,sy,slen);
        kx=ix; ky=iy;
        if(kx==p+1) break;
    }
}
void reset()
{
    int i,j,kx,ky;
    r=1;
    for(i=1;i<=n;i++){
        for(j=r;j<=n;j++){
            if(a[j]-a[i]>l) break;
        }
        r=j;
        if(q==k) p++, q=0;
        q++;
        if(r==n+1){
            ar[p][q].x=n/k+1;
            if(n%k!=0) ar[p][q].x++;
            ar[p][q].y=1;
            ar[p][q].c=a[i];
            leng[p]++;
            r--;
            continue;
        }
        ar[p][q].x=(r-1)/k+1;
        ar[p][q].y=r%k; if(ar[p][q].y==0) ar[p][q].y=k;
        ar[p][q].c=a[i];
        leng[p]++;
        r--;
    }
    for(i=p;i>=1;i--){
        for(j=leng[i];j>=1;j--){
            if(i==ar[i][j].x){
                kx=ar[i][j].x; ky=ar[i][j].y;
                if(ar[kx][ky].x==0){ar[i][j].len=ar[i][j].c+l; continue;}
                ar[i][j].x=ar[kx][ky].x; ar[i][j].y=ar[kx][ky].y; ar[i][j].val=ar[kx][ky].val+1; ar[i][j].len=ar[kx][ky].len;
            }
            else{
                ar[i][j].len=ar[i][j].c+l;
            }
        }
        d[i]=ar[i][1].c;
    }
    ar[p+1][1].c=2147483647;
}
void init(int N, int L, int X[])
{
    int i,j,kx=1,ky=0,w;
    n = N;
    l=L;
    for(i=1; i<=N; i++)
    {
        a[i]=X[i-1];
        a[i]++;
        a2[i]=a[i];
    }
    k=sqrt(n);
    if(k*k<n) k++;
    reset();
}

int update(int s, int t)
{
    int i=0,j,kx=1,ky=0,w;
    s++;
    t++; i++;
    erase1(a2[s]);
    insert1(t);
    dap=0;
    query();
    a2[s]=t;
    if(i%k==0)
    {
        kx=1, ky=0, w=0;
        while(1)
        {
            while(ky==leng[kx]) kx++, ky=0;
            ky++;
            if(kx>=p+1) break;
            a[++w]=ar[kx][ky].c;
        }
        memset(leng,0,sizeof leng);
        memset(ar,0,sizeof ar);
        p=1, q=0;
        reset();
    }
    return dap;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 25320 KB Output is correct
2 Correct 0 ms 25320 KB Output is correct
3 Correct 0 ms 25320 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 25320 KB Output is correct
2 Correct 0 ms 25320 KB Output is correct
3 Correct 0 ms 25320 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 576 ms 25320 KB Output is correct
2 Correct 748 ms 25320 KB Output is correct
3 Correct 1756 ms 25320 KB Output is correct
4 Runtime error 28 ms 25316 KB SIGSEGV Segmentation fault
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 32 ms 25320 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 9000 ms 25316 KB Program timed out
2 Halted 0 ms 0 KB -