제출 #1279553

#제출 시각아이디문제언어결과실행 시간메모리
1279553karn7777앵무새 (IOI11_parrots)C++20
81 / 100
6 ms844 KiB
#include<vector> #include<algorithm> #include<utility> #include "encoder.h" #include "encoderlib.h" using namespace std; void encode(int n, int M[]){ int dp[18][14]; for(int i=0;i<=17;i++)for(int j=0;j<=13;j++)dp[i][j]=0; dp[0][0]=1; for(int i=1;i<=17;i++){ for(int j=0;j<=13;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; for(int i=0;i<=(n/3);i++){ vector<int> temp; if(i==n/3){ if(n%3==0)break; if(n%3==1){ ans=M[i*3]; for(int k=0;k<=4;k++)temp.push_back(0); } if(n%3==2){ ans=M[i*3]*256+M[i*3+1]; for(int k=0;k<=9;k++)temp.push_back(0); } }else{ int a=M[i*3],b=M[i*3+1],c=M[i*3+2]; ans=a*256*256+b*256+c; for(int k=0;k<=14;k++)temp.push_back(0); } //Encode ans->temp int sum=0,remaining=12; 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(sum); //cout << sum << " "; } return; }
#include<vector> #include<algorithm> #include<utility> #include "decoder.h" #include "decoderlib.h" using namespace std; void decode(int N, int l, int X[]){ int dp[19][15]; for(int i=0;i<=17;i++)for(int j=0;j<=13;j++)dp[i][j]=0; dp[0][0]=1; for(int i=1;i<=17;i++){ for(int j=0;j<=13;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()/15;tempi++){ int i=tempi*15; vector<int> temp; int tempsum=0; for(int j=i;j<i+15;j++){ temp.push_back(v[j]); tempsum+=v[j]; } temp.insert(temp.begin(),12-tempsum); int ans=0,remaining=12; //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]; // int a,b,c; a=ans/(256*256); ans-=(256*256*a); b=ans/256; c=ans%256; output(a); output(b); output(c); } if(v.size()%15==5){ int ans=0,tempsum=0; vector<int> temp; for(int j=((v.size()/15)*15);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(),12-tempsum); //decode temp to ans int remaining=12; 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(ans); } if(v.size()%15==10){ int ans=0,tempsum=0; vector<int> temp; for(int j=((v.size()/15)*15);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(),12-tempsum); //decode temp to ans int remaining=12; 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(ans/256); output(ans%256); } 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...