답안 #90426

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
90426 2018-12-21T15:52:14 Z Bodo171 코끼리 (Dancing Elephants) (IOI11_elephants) C++14
100 / 100
8318 ms 19436 KB
#include "elephants.h"
#include <iostream>
const int nmax=150005;
const int buck=1200;
const int B=4*buck+5;
using namespace std;
pair<int,int> dp[B][B],b[B][B];
pair<int,int> unde[nmax],v[nmax];
int lg[nmax];
int sz[B];
int n,m,i,j,L,bucks,actbucks;
void baga(int wh,int x,int poz)
{
    sz[wh]++;
    for(int p=sz[wh];p>=1;p--)
    {
        if(b[wh][p-1].first<=x)
        {
            b[wh][p]={x,poz};
            unde[poz]={wh,p};
            return;
        }
        b[wh][p]=b[wh][p-1];
        unde[b[wh][p].second]={wh,p};
    }
}
int cb(int wh,int val)
{
    //resturneaza pozitia primului element mai mare ca val din bucketul wh
    int ret=0;
    for(int p=lg[sz[wh]];p>=0;p--)
        if(ret+(1<<p)<=sz[wh]&&b[wh][ret+(1<<p)].first<=val)
          ret+=(1<<p);
    ret++;
    return ret;
}
void recalc(int wh)
{
    int poz=0;
    b[wh][sz[wh]+1].first=2*1000*1000*1000+5;poz=sz[wh]+1;
    for(int i=sz[wh];i>=1;i--)
    {
        while(b[wh][poz].first>b[wh][i].first+L)
           poz--;
        if(b[wh][i].first+L>=b[wh][poz].first)
            poz++;
        if(poz<=sz[wh])
        {
            dp[wh][i]=dp[wh][poz];
            dp[wh][i].first++;
        }
        else
        {
            dp[wh][i]={1,b[wh][i].first+L};
        }
    }
}
void sterge(int wh,int pp)
{
    for(int p=pp;p<sz[wh];p++)
    {
        unde[b[wh][p+1].second]={wh,p};
        b[wh][p]=b[wh][p+1];
    }
    sz[wh]--;
    recalc(wh);
    return;
}

void ins(int poz,int x)
{
    int wh=0;
    for(int i=1;i<=actbucks&&wh==0;i++)
    {
        if(b[i][sz[i]].first>=x)
        {
            baga(i,x,poz);
            wh=i;
        }
    }
    if(wh==0)
    {
        actbucks++;
        wh=actbucks;
        baga(wh,x,poz);
    }
    recalc(wh);
}
int rec_all()
{
    int ret=0,act=0,poz;
    for(int i=1;i<=bucks;i++)
        if(sz[i])
    {
        if(ret==0)
        {
            act=dp[i][1].second;
            ret=dp[i][1].first;
        }
        else
        {
            poz=cb(i,act);
            if(poz<=sz[i])
            {
                ret+=dp[i][poz].first;
                act=dp[i][poz].second;
            }
        }
    }
    return ret;
}
void rebucket()
{
    bucks=(n/buck+1)+buck;int nr=1;
    actbucks=0;
    for(int i=1;i<=bucks;i++)
    {
       sz[i]=0;
       for(j=nr;j<=min(nr+buck-1,n);j++)
        {
            baga(i,v[j].first,v[j].second);
        }
        if(nr<=n) actbucks++;
        nr+=buck;
        recalc(i);
    }
    rec_all();
}
void init(int N, int Lo, int X[])
{
  n = N;L=Lo;
  for(i=2;i<=n;i++)
    lg[i]=lg[i/2]+1;
  for(i=1;i<=n;i++)
    v[i].first=X[i-1],v[i].second=i;
  rebucket();
}
int cate=0;
int update(int i, int y)
{
    cate++;i++;
   if(cate%buck==0)
   {
       int  nr=0;
       for(int ii=1;ii<=actbucks;ii++)
        for(int jj=1;jj<=sz[ii];jj++)
          v[++nr]=b[ii][jj];
       rebucket();
   }
   sterge(unde[i].first,unde[i].second);
   ins(i,y);
   return rec_all();
}
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 5496 KB Output is correct
2 Correct 5 ms 5496 KB Output is correct
3 Correct 5 ms 5576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 5496 KB Output is correct
2 Correct 5 ms 5496 KB Output is correct
3 Correct 5 ms 5576 KB Output is correct
4 Correct 5 ms 5576 KB Output is correct
5 Correct 5 ms 5576 KB Output is correct
6 Correct 5 ms 5576 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 5496 KB Output is correct
2 Correct 5 ms 5496 KB Output is correct
3 Correct 5 ms 5576 KB Output is correct
4 Correct 5 ms 5576 KB Output is correct
5 Correct 5 ms 5576 KB Output is correct
6 Correct 5 ms 5576 KB Output is correct
7 Correct 702 ms 6836 KB Output is correct
8 Correct 736 ms 7248 KB Output is correct
9 Correct 783 ms 8556 KB Output is correct
10 Correct 603 ms 13324 KB Output is correct
11 Correct 820 ms 13324 KB Output is correct
12 Correct 1786 ms 13324 KB Output is correct
13 Correct 628 ms 13408 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 5496 KB Output is correct
2 Correct 5 ms 5496 KB Output is correct
3 Correct 5 ms 5576 KB Output is correct
4 Correct 5 ms 5576 KB Output is correct
5 Correct 5 ms 5576 KB Output is correct
6 Correct 5 ms 5576 KB Output is correct
7 Correct 702 ms 6836 KB Output is correct
8 Correct 736 ms 7248 KB Output is correct
9 Correct 783 ms 8556 KB Output is correct
10 Correct 603 ms 13324 KB Output is correct
11 Correct 820 ms 13324 KB Output is correct
12 Correct 1786 ms 13324 KB Output is correct
13 Correct 628 ms 13408 KB Output is correct
14 Correct 946 ms 13408 KB Output is correct
15 Correct 984 ms 13408 KB Output is correct
16 Correct 2784 ms 13408 KB Output is correct
17 Correct 2692 ms 13408 KB Output is correct
18 Correct 2984 ms 13408 KB Output is correct
19 Correct 1255 ms 13408 KB Output is correct
20 Correct 2716 ms 13408 KB Output is correct
21 Correct 2845 ms 13408 KB Output is correct
22 Correct 1020 ms 14572 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 5496 KB Output is correct
2 Correct 5 ms 5496 KB Output is correct
3 Correct 5 ms 5576 KB Output is correct
4 Correct 5 ms 5576 KB Output is correct
5 Correct 5 ms 5576 KB Output is correct
6 Correct 5 ms 5576 KB Output is correct
7 Correct 702 ms 6836 KB Output is correct
8 Correct 736 ms 7248 KB Output is correct
9 Correct 783 ms 8556 KB Output is correct
10 Correct 603 ms 13324 KB Output is correct
11 Correct 820 ms 13324 KB Output is correct
12 Correct 1786 ms 13324 KB Output is correct
13 Correct 628 ms 13408 KB Output is correct
14 Correct 946 ms 13408 KB Output is correct
15 Correct 984 ms 13408 KB Output is correct
16 Correct 2784 ms 13408 KB Output is correct
17 Correct 2692 ms 13408 KB Output is correct
18 Correct 2984 ms 13408 KB Output is correct
19 Correct 1255 ms 13408 KB Output is correct
20 Correct 2716 ms 13408 KB Output is correct
21 Correct 2845 ms 13408 KB Output is correct
22 Correct 1020 ms 14572 KB Output is correct
23 Correct 4549 ms 14572 KB Output is correct
24 Correct 4628 ms 14572 KB Output is correct
25 Correct 3628 ms 14572 KB Output is correct
26 Correct 3315 ms 17136 KB Output is correct
27 Correct 4392 ms 17136 KB Output is correct
28 Correct 3704 ms 17136 KB Output is correct
29 Correct 3710 ms 17136 KB Output is correct
30 Correct 3800 ms 17136 KB Output is correct
31 Correct 3700 ms 17136 KB Output is correct
32 Correct 5206 ms 19172 KB Output is correct
33 Correct 5714 ms 19172 KB Output is correct
34 Correct 3385 ms 19172 KB Output is correct
35 Correct 2696 ms 19172 KB Output is correct
36 Correct 2856 ms 19172 KB Output is correct
37 Correct 6429 ms 19172 KB Output is correct
38 Correct 3614 ms 19172 KB Output is correct
39 Correct 3810 ms 19172 KB Output is correct
40 Correct 3546 ms 19436 KB Output is correct
41 Correct 8318 ms 19436 KB Output is correct
42 Correct 8058 ms 19436 KB Output is correct