제출 #874212

#제출 시각아이디문제언어결과실행 시간메모리
87421212345678앵무새 (IOI11_parrots)C++17
100 / 100
1016 ms92288 KiB
#include "encoder.h" #include "encoderlib.h" #include <bits/stdc++.h> #pragma GCC optimize ("O3", "unroll-loops") using namespace std; const int nx=65, kx=256; struct bignum { vector<int> val; bignum(): val(nx, 0){} bignum(int x) { val.assign(nx, 0); for (int i=0; i<nx&&x>0; i++) { val[i]=x%kx; x/=kx; } } bignum &operator+=(const bignum &rhs) { int carry=0; for (int i=0; i<nx; i++) { val[i]+=rhs.val[i]+carry; carry=val[i]/kx; val[i]-=carry*kx; } return *this; } bignum &operator-=(const bignum &rhs) { int carry=0; for (int i=0; i<nx; i++) { val[i]-=rhs.val[i]+carry; carry=0; if (val[i]<0) { val[i]+=kx; carry++; } } return *this; } friend bignum operator+(const bignum &lhs, const bignum &rhs) {return bignum(lhs)+=rhs;} friend bignum operator-(const bignum &lhs, const bignum &rhs) {return bignum(lhs)+=rhs;} int cmp(const bignum &rhs) { for (int i=nx-1; i>=0; i--) { if (val[i]<rhs.val[i]) return -1; if (val[i]>rhs.val[i]) return 1; } return 0; } bool operator<(const bignum &rhs) {return cmp(rhs)==-1;} bool operator>(const bignum &rhs) {return cmp(rhs)==1;} bool operator<=(const bignum &rhs) {return cmp(rhs)!=1;} bool operator>=(const bignum &rhs) {return cmp(rhs)!=-1;} bool operator==(const bignum &rhs) {return cmp(rhs)==0;} bool operator!=(const bignum &rhs) {return cmp(rhs)!=0;} }; vector<vector<bignum>> dp(580, vector<bignum> (270)); bool ok; void encode(int N, int M[]) { bignum vl, tmp; if (!ok) { ok=1; for (int i=0; i<580; i++) { for (int j=0; j<=min(i, 269); j++) { if (j==0||j==i) dp[i][j]=1; else dp[i][j]=dp[i-1][j]+dp[i-1][j-1]; } } } for (int i=0; i<N; i++) vl.val[i]=M[N-1-i]; vector<int> s(kx+1); int left=320; for (int i=0; i<kx; i++) { tmp=0; for (int j=left; j>=0; j--) { if (dp[kx-i-1+left-j][kx-i-1]+tmp>vl) { vl-=tmp; s[i]=j; left-=j; break; } tmp+=dp[kx-i-1+left-j][kx-i-1]; } } s[kx]=left; for (int i=0; i<kx; i++) for (int j=0; j<s[i+1]; j++) send(i); }
#include "decoder.h" #include "decoderlib.h" #include <bits/stdc++.h> #pragma GCC optimize ("O3", "unroll-loops") using namespace std; const int nx=65, kx=256; struct bignum { vector<int> val; bignum(): val(nx, 0){} bignum(int x) { val.assign(nx, 0); for (int i=0; i<nx&&x>0; i++) { val[i]=x%kx; x/=kx; } } bignum &operator+=(const bignum &rhs) { int carry=0; for (int i=0; i<nx; i++) { val[i]+=rhs.val[i]+carry; carry=val[i]/kx; val[i]-=carry*kx; } return *this; } bignum &operator-=(const bignum &rhs) { int carry=0; for (int i=0; i<nx; i++) { val[i]-=rhs.val[i]+carry; carry=0; if (val[i]<0) { val[i]+=kx; carry++; } } return *this; } friend bignum operator+(const bignum &lhs, const bignum &rhs) {return bignum(lhs)+=rhs;} friend bignum operator-(const bignum &lhs, const bignum &rhs) {return bignum(lhs)+=rhs;} int cmp(const bignum &rhs) { for (int i=nx-1; i>=0; i--) { if (val[i]<rhs.val[i]) return -1; if (val[i]>rhs.val[i]) return 1; } return 0; } bool operator<(const bignum &rhs) {return cmp(rhs)==-1;} bool operator>(const bignum &rhs) {return cmp(rhs)==1;} bool operator<=(const bignum &rhs) {return cmp(rhs)!=1;} bool operator>=(const bignum &rhs) {return cmp(rhs)!=-1;} bool operator==(const bignum &rhs) {return cmp(rhs)==0;} bool operator!=(const bignum &rhs) {return cmp(rhs)!=0;} }; vector<vector<bignum>> dp(580, vector<bignum> (270)); bool ok2; void decode(int N, int L, int X[]) { bignum res=0; if (!ok2) { ok2=1; for (int i=0; i<580; i++) { for (int j=0; j<=min(i, 269); j++) { if (j==0||j==i) dp[i][j]=1; else dp[i][j]=dp[i-1][j]+dp[i-1][j-1]; } } } int sm=0; vector<int> s(kx+1, 0); for (int i=0; i<L; i++) s[X[i]+1]++, sm++; s[0]=320-sm; int left=320; for (int i=0; i<=kx; i++) { for (int j=left; j>s[i]; j--) { res+=dp[kx-i-1+left-j][kx-i-1]; } left-=s[i]; } //res+=s[kx]; vector<int> ans(N, 0); for (int i=0; i<N; i++) ans[N-1-i]=res.val[i]; for (int i=0; i<N; i++) output(ans[i]); } /* 10 1 1 2 1 2 3 1 7 10 9 */
#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...