답안 #235583

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
235583 2020-05-28T16:36:39 Z Coroian_David 앵무새 (IOI11_parrots) C++11
100 / 100
296 ms 98032 KB
    #include <bits/stdc++.h>
    #include "encoder.h"
    #include "encoderlib.h"
     
    #define MAX_N 64
     
    using namespace std;
     
    int n;
    void aduna(unsigned char a[], unsigned char b[])
    {
        int i = 1;
        int t = 0;
        for(i = 1; i <= max(a[0], b[0]) || t; i ++)
        {
            a[i] += b[i] + t;
            t = 0;
     
            if(a[i] > 9)
            {
                t = a[i] / 10;
                a[i] %= 10;
            }
        }
     
        a[0] = i - 1;
    }
     
    bool cmp(unsigned char a[], unsigned char b[])
    {
        if(a[0] > b[0])
            return 1;
     
        if(a[0] < b[0])
            return 0;
     
        for(int i = a[0]; i >= 1; i --)
        {
            if(a[i] != b[i])
                return (a[i] > b[i]);
        }
     
        return 1;
    }
     
    void copyV(unsigned char a[], unsigned char b[])
    {
        for(int i = 1; i <= a[0]; i ++)
            a[i] = 0;
     
        a[0] = b[0];
        for(int i = 1; i <= b[0]; i ++)
            a[i] = b[i];
    }
     
    void scade(unsigned char a[], unsigned char b[])
    {
        int t = 0;
        for(int i = 1; i <= b[0] || t; i ++)
        {
            int x = (int)a[i] - (int)t - (int)b[i];
     
            t = 0;
            if(x < 0)
            {
                t = 1;
                x += 10;
            }
     
            a[i] = x;
        }
     
        while(a[0] > 1 && a[a[0]] == 0)
            a[0] --;
    }
     
    struct nr
    {
        unsigned char v[200];
     
        void operator +=(nr &x)
        {
            aduna(v, x.v);
        }
     
        void operator -=(nr &x)
        {
            scade(v, x.v);
        }
     
        void operator =(nr &x)
        {
            copyV(v, x.v);
        }
     
        bool operator >= (nr &x)
        {
            return cmp(v, x.v);
        }
    };
     
    nr dp[255 + 1][MAX_N * 5 + 1];
    nr sdp[255 + 1][MAX_N * 5 + 1];
    nr mdp[255 + 1][MAX_N * 5 + 1];
     
    nr p2;
    nr cod;
    nr s;
     
    int done;
     
    void getDp()
    {
        if(done == 1)
            return;
     
        done = 1;
     
        dp[0][0].v[0] = 1;
        dp[0][0].v[1] = 1;
        sdp[0][0].v[0] = 1;
        sdp[0][0].v[1] = 1;
     
     
       // cout << n << "\n";
     
        int nn = 64;
        for(int i = 0; i < 255; i ++)
        {
            for(int j = 0; j <= nn * 5; j ++)
            {
               // if(i >= 150)
                //cout << i << " " << j << " " << n << "\n";
     
                if(j > 0)
                {
                    sdp[i][j] += sdp[i][j - 1];
                    mdp[i][j] += mdp[i][j - 1];
                }
     
                dp[i][j] = sdp[i][j];
                dp[i][j] -= mdp[i][j];
     
                if(n == 0)
                    cout << dp[i][j].v[0] << " " << dp[i][j].v[1] << " " << dp[i][j].v[2] << "\n";
     
                if(dp[i][j].v[0] != 0)
                {
                    sdp[i + 1][j] += dp[i][j];
     
                    if(j + 256 <= nn * 5)
                        mdp[i + 1][j + 256] += dp[i][j];
                }
            }
        }
    }
     
    void afis(nr a)
    {
        for(int i = a.v[0]; i >= 1; i --)
            cout << (int)a.v[i];
        cout << "\n";
    }
     
    void encode(int N, int M[])
    {
        n = N;
        getDp();
     
        int k = 0;
        int a[700];
        for(int i = 0; i < N; i ++)
        {
            for(int j = 7; j >= 0; j --)
                a[++ k] = (((1 << j) & M[i]) != 0);
        }
     
        memset(p2.v, 0, sizeof(p2.v));
        memset(cod.v, 0, sizeof(cod.v));
        memset(s.v, 0, sizeof(s.v));
     
        p2.v[0] = 1;
        p2.v[1] = 1;
     
        cod.v[0] = 1;
        cod.v[1] = 0;
     
        s.v[0] = 1;
        s.v[1] = 0;
     
        for(int i = k; i >= 1; i --)
        {
            if(a[i] != 0)
                cod += p2;
     
            p2 += p2;
        }
     
        int sum = 5 * n;
        for(int i = 0; i <= 255; i ++)
        {
            int last = 0;
            for(int j = 0; j <= n * 5 && j <= sum; j ++)
            {
               // cout << " SUNTEM IN  " << i << "  CR " << j << "\n";
     
                if(cod >= s)
                    last = j;
     
                else
                {
                    s -= dp[255 - i - 1][sum - last];
                    break;
                }
     
               // cout << " URM ADUNS \n";
     
                s += dp[255 - i - 1][sum - j];
     
               // cout << " GATA ADUN\n";
            }
     
            //afis(s);
     
          //  cout << " PENTRU FRECVENTA LUI " << i << " ESTE " << last << "\n";
     
            sum -= last;
            for(int j = 1; j <= last; j ++)
                send(i);
        }
     
        //cout << "RAMAS == 0: " << sum << "\n";
     
        //afis(cod);
        //afis(s);
    }
    #include "decoder.h"
    #include "decoderlib.h"
    #include <bits/stdc++.h>
     
    #define MAX_N 64
     
    using namespace std;
    int n;
    void aduna(unsigned char a[], unsigned char b[])
    {
        int i = 1;
        int t = 0;
        for(i = 1; i <= max(a[0], b[0]) || t; i ++)
        {
            a[i] += b[i] + t;
            t = 0;
     
            if(a[i] > 9)
            {
                t = a[i] / 10;
                a[i] %= 10;
            }
        }
     
        a[0] = i - 1;
    }
     
    bool cmp(unsigned char a[], unsigned char b[])
    {
        if(a[0] > b[0])
            return 1;
     
        if(a[0] < b[0])
            return 0;
     
        for(int i = a[0]; i >= 1; i --)
        {
            if(a[i] != b[i])
                return (a[i] > b[i]);
        }
     
        return 1;
    }
     
    void copyV(unsigned char a[], unsigned char b[])
    {
        for(int i = 1; i <= a[0]; i ++)
            a[i] = 0;
     
        a[0] = b[0];
        for(int i = 1; i <= b[0]; i ++)
            a[i] = b[i];
    }
     
    void scade(unsigned char a[], unsigned char b[])
    {
        int t = 0;
        for(int i = 1; i <= b[0] || t; i ++)
        {
            int x = (int)a[i] - (int)t - (int)b[i];
     
            t = 0;
            if(x < 0)
            {
                t = 1;
                x += 10;
            }
     
            a[i] = x;
        }
     
        while(a[0] > 1 && a[a[0]] == 0)
            a[0] --;
    }
     
    struct nr
    {
        unsigned char v[200];
     
        void operator +=(nr &x)
        {
            aduna(v, x.v);
        }
     
        void operator -=(nr &x)
        {
            scade(v, x.v);
        }
     
        void operator =(nr &x)
        {
            copyV(v, x.v);
        }
     
        bool operator >= (nr &x)
        {
            return cmp(v, x.v);
        }
    };
     
    nr dp[255 + 1][MAX_N * 5 + 1];
    nr sdp[255 + 1][MAX_N * 5 + 1];
    nr mdp[255 + 1][MAX_N * 5 + 1];
     
    nr p2;
    nr cod;
    nr s;
     
    int done;
     
    void getDp()
    {
        if(done == 1)
            return;
     
        done = 1;
     
        dp[0][0].v[0] = 1;
        dp[0][0].v[1] = 1;
        sdp[0][0].v[0] = 1;
        sdp[0][0].v[1] = 1;
     
     
       // cout << n << "\n";
     
        int nn = 64;
        for(int i = 0; i < 255; i ++)
        {
            for(int j = 0; j <= nn * 5; j ++)
            {
               // if(i >= 150)
                //cout << i << " " << j << " " << n << "\n";
     
                if(j > 0)
                {
                    sdp[i][j] += sdp[i][j - 1];
                    mdp[i][j] += mdp[i][j - 1];
                }
     
                dp[i][j] = sdp[i][j];
                dp[i][j] -= mdp[i][j];
     
                if(n == 0)
                    cout << dp[i][j].v[0] << " " << dp[i][j].v[1] << " " << dp[i][j].v[2] << "\n";
     
                if(dp[i][j].v[0] != 0)
                {
                    sdp[i + 1][j] += dp[i][j];
     
                    if(j + 256 <= nn * 5)
                        mdp[i + 1][j + 256] += dp[i][j];
                }
            }
        }
    }
     
     
     
    nr p[600];
    nr sp;
    nr tmp;
     
    int apel;
     
    void decode(int N, int L, int X[])
    {
        n = N;
     
        getDp();
     
        int ap[256];
        for(int i = 0; i <= 255; i ++)
            ap[i] = 0;
     
        for(int i = 0; i < L; i ++)
            ap[X[i]] ++;
     
        memset(s.v, 0, sizeof(s.v));
     
        int sum = 5 * n;
        for(int i = 0; i <= 255; i ++)
        {
            int last = 0;
            for(int j = 0; j < ap[i]; j ++)
                s += dp[255 - i - 1][sum - j];
     
            sum -= ap[i];
        }
     
        apel ++;
        if(apel == 1)
        {
            p[0].v[0] = 1;
            p[0].v[1] = 1;
            for(int i = 1; i <= 520; i ++)
            {
                p[i].v[0] = 1;
                p[i].v[1] = 0;
                p[i] += p[i - 1];
                p[i] += p[i - 1];
            }
        }
     
        memset(sp.v, 0, sizeof(sp.v));
        sp.v[0] = 1;
        sp.v[1] = 0;
     
        int a[600];
        memset(a, 0, sizeof(a));
     
        for(int i = n * 8 - 1; i >= 0; i --)
        {
            tmp = sp;
            tmp += p[i];
            if(s >= tmp)
            {
                sp += p[i];
                a[i] = 1;
            }
        }
     
        for(int i = n * 8 - 1; i >= 0; i -= 8)
        {
     
            int nr = 0;
            for(int x = 7, j = 0; x >= 0; x --, j ++)
                nr += (a[i - j] << x);
     
            output(nr);
        }
    }

Compilation message

decoder.cpp: In function 'void decode(int, int, int*)':
decoder.cpp:183:17: warning: unused variable 'last' [-Wunused-variable]
             int last = 0;
                 ^~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 198 ms 97140 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 205 ms 97776 KB Output is correct
2 Correct 203 ms 97776 KB Output is correct
3 Correct 211 ms 97864 KB Output is correct
4 Correct 209 ms 97776 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 200 ms 97776 KB Output is correct
2 Correct 202 ms 97784 KB Output is correct
3 Correct 207 ms 97776 KB Output is correct
4 Correct 206 ms 97776 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 205 ms 97776 KB Output is correct
2 Correct 205 ms 97776 KB Output is correct
3 Correct 215 ms 97776 KB Output is correct
4 Correct 227 ms 97776 KB Output is correct
5 Correct 222 ms 97776 KB Output is correct
6 Correct 225 ms 98032 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 207 ms 97776 KB Output is correct - P = 5.000000
2 Correct 223 ms 97776 KB Output is correct - P = 5.000000
3 Correct 228 ms 98032 KB Output is correct - P = 5.000000
4 Correct 262 ms 98032 KB Output is correct - P = 5.000000
5 Correct 279 ms 98032 KB Output is correct - P = 5.000000
6 Correct 296 ms 98032 KB Output is correct - P = 5.000000
7 Correct 289 ms 98032 KB Output is correct - P = 5.000000