제출 #1337685

#제출 시각아이디문제언어결과실행 시간메모리
1337685karn7777앵무새 (IOI11_parrots)C++20
100 / 100
8 ms964 KiB
#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#include "encoder.h"
#include "encoderlib.h"
using namespace std;
void encode(int n, int M[]){
#define int long long
    int dp[27][23];
    for(int i=0;i<=26;i++)for(int j=0;j<=20;j++)dp[i][j]=0;
    dp[0][0]=1;
    for(int i=1;i<=26;i++){
        for(int j=0;j<=20;j++){
            int sum=0;
            for(int k=0;k<=j;k++)sum+=dp[i-1][k];
            dp[i][j]=sum;
        }
    }
    vector<int> v;
    //encodes M to v
    int ans=0;
    for(int i=0;i<=(n/5);i++){
        vector<int> temp;
        if(i==n/5){
            if(n%5==0)break;
            if(n%5==1){
                ans=M[i*5];
                for(int k=0;k<5;k++)temp.push_back(0);
            }
            if(n%5==2){
                ans=M[i*5]*256+M[i*5+1];
                for(int k=0;k<10;k++)temp.push_back(0);
            }
            if(n%5==3){
                ans=M[i*5]*256*256+M[i*5+1]*256+M[i*5+2];
                for(int k=0;k<15;k++)temp.push_back(0);
            }
            if(n%5==4){
                int triple=256*256*256;
                ans=M[i*5]*triple+M[i*5+1]*256*256+M[i*5+2]*256+M[i*5+3];
                for(int k=0;k<20;k++)temp.push_back(0);
            }
        }else{
            int harn=256*256;
            int triple=harn*256;
            harn=harn*harn;
            int a=M[i*5],b=M[i*5+1],c=M[i*5+2],d=M[i*5+3],e=M[i*5+4];
            ans=a*harn+b*triple+c*256*256+d*256+e;
            for(int k=0;k<25;k++)temp.push_back(0);
        }
        //cout << endl;
        //cout << "ans"<< ans << endl;
        //Encode ans->temp
        int sum=0,remaining=19;
        for(int j=temp.size()-1;j>0;j--){
            for(int k=0;k<remaining;k++){
                if(sum+dp[j+1][remaining-k]<=ans){
                    sum+=dp[j+1][remaining-k];
                    temp[j]=k+1;
                }
                else break;
            }
            remaining-=temp[j];
        }
        temp[0]=ans-sum;
        for(auto x:temp)v.push_back(x);
    }
    //
    //for(auto x:v)cout << x << " ";
    //cout << endl;
    int sum=0;
    for(auto x:v){
        sum+=x;
        send((signed)(sum));
        //cout << sum << " ";
    }
    #undef int
    return;
}

#include<iostream>
#include<vector>
#include<algorithm>
#include<utility>
#include "decoder.h"
#include "decoderlib.h"
using namespace std;
void decode(int N, int l, int X[]){
    #define int long long
    int dp[27][23];
    for(int i=0;i<=26;i++)for(int j=0;j<=20;j++)dp[i][j]=0;
    dp[0][0]=1;
    for(int i=1;i<=26;i++){
        for(int j=0;j<=20;j++){
            int sum=0;
            for(int k=0;k<=j;k++)sum+=dp[i-1][k];
            dp[i][j]=sum;
        }
    }
    vector<int> v;
    for(int i=0;i<l;i++){
        v.push_back(X[i]);
    }
    sort(v.begin(),v.end());
    int last=0,temp=0;
    for(int i=0;i<v.size();i++){
        int temp=v[i]-last;
        last=v[i];
        v[i]=temp;
    }
    for(int tempi=0;tempi<v.size()/25;tempi++){
        int i=tempi*25;
        vector<int> temp;
        int tempsum=0;
        for(int j=i;j<i+25;j++){
            temp.push_back(v[j]);
            tempsum+=v[j];
        }
        temp.insert(temp.begin(),19-tempsum);
        int ans=0,remaining=19;
        //decode temp into ans
        for(int j=temp.size()-1;j>=2;j--){
            for(int k=temp[j]-1;k>=0;k--){
                ans+=dp[j][remaining-k];
            }
            remaining-=temp[j];
        }
        ans+=temp[1];
        //
        long long harn=256*256;
        long long triple=256*256*256;
        harn=harn*harn;
        int a=ans/(harn);
        ans%=(harn);
        int b=ans/(triple);
        ans%=(triple);
        int c=ans/(256*256);
        ans%=(256*256);
        int d=ans/256;
        ans%=256;
        int e=ans;
        output((signed)a);
        output((signed)b);
        output((signed)c);
        output((signed)d);
        output((signed)e);
    }
    if(v.size()%25==5){
        int ans=0,tempsum=0;
        vector<int> temp;
        for(int j=((v.size()/25)*25);j<v.size();j++){
                temp.push_back(v[j]);
                tempsum+=v[j];
        }
        for(int i=0;i<20;i++)temp.push_back(0);
        temp.insert(temp.begin(),19-tempsum);
        //decode temp to ans
        int remaining=19;
        for(int j=temp.size()-1;j>=2;j--){
            for(int k=temp[j]-1;k>=0;k--){
                ans+=dp[j][remaining-k];
            }
            remaining-=temp[j];
        }
        ans+=temp[1];
        //
        output((signed)ans);
    }
    if(v.size()%25==10){
        int ans=0,tempsum=0;
        vector<int> temp;
        for(int j=((v.size()/25)*25);j<v.size();j++){
                temp.push_back(v[j]);
                tempsum+=v[j];
        }
        for(int i=0;i<15;i++)temp.push_back(0);
        temp.insert(temp.begin(),19-tempsum);
        //decode temp to ans
        int remaining=19;
        for(int j=temp.size()-1;j>=2;j--){
            for(int k=temp[j]-1;k>=0;k--){
                ans+=dp[j][remaining-k];
            }
            remaining-=temp[j];
        }
        ans+=temp[1];
        //
        output((signed)ans/256);
        output((signed)ans%256);
    }
    if(v.size()%25==15){
        int ans=0,tempsum=0;
        vector<int> temp;
        for(int j=((v.size()/25)*25);j<v.size();j++){
                temp.push_back(v[j]);
                tempsum+=v[j];
        }
        for(int i=0;i<10;i++)temp.push_back(0);
        temp.insert(temp.begin(),19-tempsum);
        //decode temp to ans
        int remaining=19;
        for(int j=temp.size()-1;j>=2;j--){
            for(int k=temp[j]-1;k>=0;k--){
                ans+=dp[j][remaining-k];
            }
            remaining-=temp[j];
        }
        ans+=temp[1];
        //
        output((signed)ans/(256*256));
        ans%=(256*256);
        output((signed)ans/256);
        ans%=256;
        output((signed)ans);
    }
    if(v.size()%25==20){
        int ans=0,tempsum=0;
        vector<int> temp;
        for(int j=((v.size()/25)*25);j<v.size();j++){
                temp.push_back(v[j]);
                tempsum+=v[j];
        }
        for(int i=0;i<5;i++)temp.push_back(0);
        temp.insert(temp.begin(),19-tempsum);
        //decode temp to ans
        int remaining=19;
        for(int j=temp.size()-1;j>=2;j--){
            for(int k=temp[j]-1;k>=0;k--){
                ans+=dp[j][remaining-k];
            }
            remaining-=temp[j];
        }
        ans+=temp[1];
        //
        output((signed)((ans/(256*256))/256));
        ans%=(256*256*256);
        output((signed)ans/(256*256));
        ans%=(256*256);
        output((signed)ans/(256));
        ans%=(256);
        output((signed)ans);
    }
    #undef int
    return;
}
#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...