Submission #1047825

#TimeUsernameProblemLanguageResultExecution timeMemory
1047825antonParrots (IOI11_parrots)C++17
100 / 100
1990 ms127628 KiB
  #include "encoder.h"
  #include "encoderlib.h"

  #include<bits/stdc++.h>
  using namespace std;

  const int MOD = (1<<8);
  const int LEN = 90;
  struct lInt{
      vector<int> v;
      lInt(){
          v= vector<int>(LEN);
      };
      lInt(long long l){
          v= vector<int>(LEN);
          int i=0;
          while(l>0){
              v[i] = l%MOD;
              l/=MOD;
              i++;
          }
      }
      lInt operator+(const lInt& rh){
          lInt res;
          int carry = 0;
          for(int i = 0; i<LEN; i++){
              int r = v[i] + rh.v[i] + carry;
              res.v[i] = r%MOD;
              carry = r/MOD;
          }
          assert(carry == 0);
          return res;
      }

      bool operator<(const lInt& rh)const{
        for(int i = LEN-1; i>=0; i--){
          if(v[i]!=rh.v[i]){
            return v[i]<rh.v[i];
          }
        }
        return false; 
      }

      long long to_ll(){
          long long res= 0;
          for(int i = LEN-1; i>=0; i--){
              res *= MOD;
              res += v[i];
          }
          return res;
      }
  };

  const int P = 5;
  const int K = (1<<8);
  int N;
  vector<vector<lInt>> dp;

  void calc_dp(){
    for(int i = 0; i<K; i++){
      dp[P*N-1][i].v[0] = 1;
    }

    for(int step = P*N -2; step>=0; step--){
      lInt pref;
      for(int i = K-1; i>=0; i--){
        pref = pref + dp[step+1][i];
        dp[step][i] = pref;
      }
    }
  }
  void encode(int n, int M[])
  {
    N = n;
    dp = vector<vector<lInt>>(P*N + 1, vector<lInt>((1<<8)));
    
    calc_dp();
    lInt requested;
    for(int i = 0; i<N; i++){
      requested.v[N-i-1] = M[i];
    }
    //cout<<requested.to_ll()<<endl;

    int cur_pos =0;
    vector<int> pos;
    lInt counted;
    lInt one;
    one.v[0]= 1;
    requested  = requested + one;
    for(int i = 0; i<P*N; i++){
      while(dp[i][cur_pos]+counted<requested){
        counted = counted + dp[i][cur_pos];
        cur_pos++;
      }
      pos.push_back(cur_pos);
    }

    for(auto e: pos){
      send(e);
      //cout<<e<<endl;
    }


  }
#include "decoder.h"
#include "decoderlib.h"
#include<bits/stdc++.h>
using namespace std;

const int MOD = (1<<8);
const int LEN = 90;
struct lInt{
    vector<int> v;
    lInt(){
        v= vector<int>(LEN);
    };
    lInt(long long l){
        v= vector<int>(LEN);
        int i=0;
        while(l>0){
            v[i] = l%MOD;
            l/=MOD;
            i++;
        }
    }
    lInt operator+(const lInt& rh){
        lInt res;
        int carry = 0;
        for(int i = 0; i<LEN; i++){
            int r = v[i] + rh.v[i] + carry;
            res.v[i] = r%MOD;
            carry = r/MOD;
        }
        assert(carry == 0);
        return res;
    }

    bool operator<(const lInt& rh)const{
      for(int i = LEN-1; i>=0; i--){
        if(v[i]!=rh.v[i]){
          return v[i]<rh.v[i];
        }
      }
      return false; 
    }

    long long to_ll(){
        long long res= 0;
        for(int i = LEN-1; i>=0; i--){
            res *= MOD;
            res += v[i];
        }
        return res;
    }
};

const int P = 5;
const int K = (1<<8);
vector<vector<lInt>> dp2;

void calc_dp2(int N){
  for(int i = 0; i<K; i++){
    dp2[P*N-1][i].v[0] = 1;
  }

  for(int step = P*N -2; step>=0; step--){
    lInt pref;
    for(int i = K-1; i>=0; i--){
      pref = pref + dp2[step+1][i];
      dp2[step][i] = pref;
    }
  }
}

void decode(int N, int L, int X[])
{
  dp2 = vector<vector<lInt>>(P*N + 1, vector<lInt>((1<<8)));
  calc_dp2(N);
  sort(&X[0], &X[L]);
  lInt res;
  int cur =0;
  for(int i = 0; i<L; i++){
    for(int j = cur; j<X[i]; j++){
      res = (res +dp2[i][j]);
      //cout<<"mid "<<res.to_ll()<<endl;
      cur = X[i];
    }
  }

  //cout<<"res "<<res.to_ll()<<endl;
  for(int i = 0; i<N; i++){
    //cout<<res.v[N-i-1]<<" ";
    output(res.v[N-i-1]);
  }
}
#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...