답안 #1029867

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1029867 2024-07-21T12:48:20 Z lucri 비교 (balkan11_cmp) C++17
100 / 100
1313 ms 82520 KB
#include "cmp.h"

void remember(int n)
{
    int nr=0;
    int b=0,e=4095,r=(e-b+1)/12+1;
    for(;b<=e;b+=r)
    {
        ++nr;
        if(b<=n&&n<b+r)
        {
            bit_set(nr);
            e=b+r-1;
            break;
        }
    }
    r=(e-b+1)/10+1;
    nr=12;
    for(;b<=e;b+=r)
    {
        ++nr;
        if(b<=n&&n<b+r)
        {
            bit_set(nr);
            e=b+r-1;
            break;
        }
    }
    r=(e-b+1)/8+1;
    nr=22;
    for(;b<=e;b+=r)
    {
        ++nr;
        if(b<=n&&n<b+r)
        {
            bit_set(nr);
            e=b+r-1;
            break;
        }
    }
    r=(e-b+1)/6+1;
    nr=30;
    for(;b<=e;b+=r)
    {
        ++nr;
        if(b<=n&&n<b+r)
        {
            bit_set(nr);
            e=b+r-1;
            break;
        }
    }
}

int compare(int b)
{
    int nr=0;
    int bi=0,ei=4095,r=(ei-bi+1)/12+1;
    if(b<bi+6*r)
    {
        bool ok1=false,ok2=false;
        nr=13;
        for(bi=r*11;bi>=0;bi-=r)
        {
            --nr;
            if(bi<=b&&b<bi+r)
            {
                if(bit_get(nr)==1)
                    ok1=true;
                else
                    ok2=true;
            }
            else if(ok2==true)
            {
                if(bit_get(nr)==1)
                    ok1=true;
            }
        }
        if(ok2==true)
        {
            if(ok1==true)
                return 1;
            else
                return -1;
        }
    }
    else
    {
        bool ok1=false,ok2=false;
        nr=0;
        for(bi=0;bi<=ei;bi+=r)
        {
            ++nr;
            if(bi<=b&&b<bi+r)
            {
                if(bit_get(nr)==1)
                    ok1=true;
                else
                    ok2=true;
            }
            else if(ok2==true)
            {
                if(bit_get(nr)==1)
                    ok1=true;
            }
        }
        if(ok2==true)
        {
            if(ok1==true)
                return -1;
            else
                return 1;
        }
    }
    while(b>=r)
        b-=r;
    bi=0,ei=r-1;
    r=(ei-bi+1)/10+1;
    if(b<bi+5*r)
    {
        bool ok1=false,ok2=false;
        nr=23;
        for(bi=r*9;bi>=0;bi-=r)
        {
            --nr;
            if(bi<=b&&b<bi+r)
            {
                if(bit_get(nr)==1)
                    ok1=true;
                else
                    ok2=true;
            }
            else if(ok2==true)
            {
                if(bit_get(nr)==1)
                    ok1=true;
            }
        }
        if(ok2==true)
        {
            if(ok1==true)
                return 1;
            else
                return -1;
        }
    }
    else
    {
        bool ok1=false,ok2=false;
        nr=12;
        for(bi=0;bi<=ei;bi+=r)
        {
            ++nr;
            if(bi<=b&&b<bi+r)
            {
                if(bit_get(nr)==1)
                    ok1=true;
                else
                    ok2=true;
            }
            else if(ok2==true)
            {
                if(bit_get(nr)==1)
                    ok1=true;
            }
        }
        if(ok2==true)
        {
            if(ok1==true)
                return -1;
            else
                return 1;
        }
    }
    while(b>=r)
        b-=r;
    bi=0,ei=r-1;
    r=(ei-bi+1)/8+1;
    if(b<bi+4*r)
    {
        bool ok1=false,ok2=false;
        nr=31;
        for(bi=r*7;bi>=0;bi-=r)
        {
            --nr;
            if(bi<=b&&b<bi+r)
            {
                if(bit_get(nr)==1)
                    ok1=true;
                else
                    ok2=true;
            }
            else if(ok2==true)
            {
                if(bit_get(nr)==1)
                    ok1=true;
            }
        }
        if(ok2==true)
        {
            if(ok1==true)
                return 1;
            else
                return -1;
        }
    }
    else
    {
        bool ok1=false,ok2=false;
        nr=22;
        for(bi=0;bi<=ei;bi+=r)
        {
            ++nr;
            if(bi<=b&&b<bi+r)
            {
                if(bit_get(nr)==1)
                    ok1=true;
                else
                    ok2=true;
            }
            else if(ok2==true)
            {
                if(bit_get(nr)==1)
                    ok1=true;
            }
        }
        if(ok2==true)
        {
            if(ok1==true)
                return -1;
            else
                return 1;
        }
    }
    while(b>=r)
        b-=r;
    bi=0,ei=r-1;
    r=(ei-bi+1)/6+1;
    if(b<bi+3*r)
    {
        bool ok1=false,ok2=false;
        nr=37;
        for(bi=r*5;bi>=0;bi-=r)
        {
            --nr;
            if(bi<=b&&b<bi+r)
            {
                if(bit_get(nr)==1)
                    ok1=true;
                else
                    ok2=true;
            }
            else if(ok2==true)
            {
                if(bit_get(nr)==1)
                    ok1=true;
            }
        }
        if(ok2==true)
        {
            if(ok1==true)
                return 1;
            else
                return -1;
        }
    }
    else
    {
        bool ok1=false,ok2=false;
        nr=30;
        for(bi=0;bi<=ei;bi+=r)
        {
            ++nr;
            if(bi<=b&&b<bi+r)
            {
                if(bit_get(nr)==1)
                    ok1=true;
                else
                    ok2=true;
            }
            else if(ok2==true)
            {
                if(bit_get(nr)==1)
                    ok1=true;
            }
        }
        if(ok2==true)
        {
            if(ok1==true)
                return -1;
            else
                return 1;
        }
    }
    while(b>=r)
        b-=r;
    return 0;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 1313 ms 82520 KB Output is correct - maxAccess = 10, score = 100