제출 #1174974

#제출 시각아이디문제언어결과실행 시간메모리
1174974iulia_morariu앵무새 (IOI11_parrots)C++20
100 / 100
1805 ms20820 KiB
#include <iostream> #include <vector> #include <algorithm> #include <climits> #include <cmath> // #include "decoder.h" // #include "decoderlib.h" #include "encoder.h" #include "encoderlib.h" //#include <bits/stdc++.h> #define in cin #define out cout using namespace std; const int B = 10; // baza vector<short> operator/(vector<short> & a, int b){ int t = 0; vector<short> c; for(int i = a.size() - 1; i >= 0; i--){ t = t * B + a[i]; c.push_back(t / b); t %= b; } reverse(c.begin(), c.end()); while(!c.empty() && c.back() == 0) c.pop_back(); return c; } vector<short> operator+(vector<short> & a, vector<short> & b){ int t = 0; vector<short> sl; for(int i = 0; i < max(a.size(), b.size()) || t > 0; i++){ if(i < a.size()) t += a[i]; if(i < b.size()) t += b[i]; sl.push_back(t % B); t /= B; } return sl; } vector<short> operator-(vector<short> a, vector<short> & b){ // am grija ca a >= b vector<short> sl; for(int i = 0; i < a.size(); i++){ if(i < b.size()) sl.push_back(a[i] - b[i]); else sl.push_back(a[i]); if(sl.back() < 0){ sl[i] += B; a[i + 1]--; } } while(sl.size() > 1 && sl.back() == 0) sl.pop_back(); return sl; } vector<short> operator*(vector<short> & a, vector<short> & b){ vector<short> c(a.size() + b.size() - 1, 0); int t = 0; for(int i = 0; i < a.size(); i++){ for(int j = 0; j < b.size(); j++){ c[i + j] += a[i] * b[j]; } } for(int i = 0; i <= a.size() + b.size() - 2 || t > 0; i++){ if(i < c.size()){ t += c[i]; c[i] = t % B; t /= B; }else{ c.push_back(t % B); t /= B; } } return c; } bool mai_mic_egal(vector<short> & a, vector<short> & b){ if(a.size() != b.size()) return a.size() < b.size(); for(int i = a.size() - 1; i >= 0; i--){ if(a[i] != b[i]) return a[i] < b[i]; } return a < b; } vector<short> dp[5 * 64 + 1][256]; void calculeaza_dp(int n){ // cerr << "INTRAT\n"; // dp[i][j] = cate siruri sunt de i elemente cu ultimul elemnt j if(dp[1][0].empty()){ for(int i = 0; i <= 5 * n; i++){ for(int j = 0; j <= 255; j++){ dp[i][j].push_back(0); } } for(int j = 0; j <= 255; j++){ dp[1][j][0] = 1; } for(int i = 2; i <= 5 * n; i++){ for(int j = 0; j <= 255; j++){ dp[i][j] = dp[i - 1][j]; if(j > 0) dp[i][j] = dp[i][j] + dp[i][j - 1]; } } } // cerr << "IESIT\n"; } void encode(int N, int M[]){ vector<bool> b; for(int i = 0; i < N; i++){ int cnt = 0; while(M[i]){ b.push_back(M[i] % 2); M[i] /= 2; cnt++; } while(cnt < 8){ b.push_back(0); cnt++; } } // cout << "b : "; // bunbun // for(int i = 0; i < b.size(); i++) cout << b[i]; // cout << '\n'; vector<short> nr; nr.push_back(0); vector<short> P; P.push_back(1); // 2 ^ ceva vector<short> doi; doi.push_back(2); // 2 for(int i = b.size() - 1; i >= 0; i--){ if(b[i]) nr = nr + P; P = P * doi; } calculeaza_dp(N); // nr.clear(); // nr.push_back(1); // cout << "nr : "; // for(int i = nr.size() - 1; i >= 0; i--) cout << nr[i]; // cout << '\n'; int last = 255; vector<short> sending; // ce send for(int i = 5 * N; i >= 1; i--){ // cout << "i = " << i << " nr = "; // for(int j = nr.size() - 1; j >= 0; j--) cout << nr[j]; // cout << '\n'; for(int c = 0; c <= last; c++){ if(mai_mic_egal(nr, dp[i][c])){ // sending.push_back(c); send(c); last = c; break; } nr = nr - dp[i][c]; } } // cout << "Osa send : "; // for(int i = 0; i < sending.size(); i++) cout << sending[i] << " "; // cout << '\n'; // for(int i = 0; i < sending.size(); i++) send( sending[i] ); }
#include <iostream> #include <vector> #include <algorithm> #include <climits> #include <cmath> #include "decoder.h" #include "decoderlib.h" // #include "encoder.h" // #include "encoderlib.h" //#include <bits/stdc++.h> #define in cin #define out cout using namespace std; const int B = 10; // baza vector<short> operator/(vector<short> & a, int b){ int t = 0; vector<short> c; for(int i = a.size() - 1; i >= 0; i--){ t = t * B + a[i]; c.push_back(t / b); t %= b; } reverse(c.begin(), c.end()); while(!c.empty() && c.back() == 0) c.pop_back(); return c; } vector<short> operator+(vector<short> & a, vector<short> & b){ int t = 0; vector<short> sl; for(int i = 0; i < max(a.size(), b.size()) || t > 0; i++){ if(i < a.size()) t += a[i]; if(i < b.size()) t += b[i]; sl.push_back(t % B); t /= B; } return sl; } vector<short> operator-(vector<short> a, vector<short> & b){ // am grija ca a >= b vector<short> sl; for(int i = 0; i < a.size(); i++){ if(i < b.size()) sl.push_back(a[i] - b[i]); else sl.push_back(a[i]); if(sl.back() < 0){ sl[i] += B; a[i + 1]--; } } while(sl.size() > 1 && sl.back() == 0) sl.pop_back(); return sl; } vector<short> operator*(vector<short> & a, vector<short> & b){ vector<short> c(a.size() + b.size() - 1, 0); int t = 0; for(int i = 0; i < a.size(); i++){ for(int j = 0; j < b.size(); j++){ c[i + j] += a[i] * b[j]; } } for(int i = 0; i <= a.size() + b.size() - 2 || t > 0; i++){ if(i < c.size()){ t += c[i]; c[i] = t % B; t /= B; }else{ c.push_back(t % B); t /= B; } } return c; } bool mai_mic_egal(vector<short> & a, vector<short> & b){ if(a.size() != b.size()) return a.size() < b.size(); for(int i = a.size() - 1; i >= 0; i--){ if(a[i] != b[i]) return a[i] < b[i]; } return a < b; } vector<short> dp[5 * 64 + 1][256]; void calculeaza_dp(int n){ // cerr << "INTRAT\n"; // dp[i][j] = cate siruri sunt de i elemente cu ultimul elemnt j if(dp[1][0].empty()){ for(int i = 0; i <= 5 * n; i++){ for(int j = 0; j <= 255; j++){ dp[i][j].push_back(0); } } for(int j = 0; j <= 255; j++){ dp[1][j][0] = 1; } for(int i = 2; i <= 5 * n; i++){ for(int j = 0; j <= 255; j++){ dp[i][j] = dp[i - 1][j]; if(j > 0) dp[i][j] = dp[i][j] + dp[i][j - 1]; } } } // cerr << "IESIT\n"; } void decode(int N, int L, int X[]){ calculeaza_dp(N); sort(X + 0, X + L); // cout << "primesc X : "; // for(int i = 0; i < L; i++) cout << X[i] << " "; // cout << '\n'; // cout << "dp[2][0] = "; // for(int k = dp[2][0].size() - 1; k >= 0; k--) cout << dp[2][0][k]; // cout << '\n'; vector<short> nr; nr.push_back(0); for(int i = 1; i <= L; i++){ for(int j = 0; j < X[i - 1]; j++){ nr = nr + dp[i][j]; } } // cout << "nr : "; // for(int i = nr.size() - 1; i >= 0; i--) cout << nr[i]; // cout << '\n'; vector<bool> b; while(!nr.empty() && nr.back() > 0){ // cout << "nr : "; // for(int i = nr.size() - 1; i >= 0; i--) cout << nr[i]; // cout << '\n'; b.push_back(nr[0] % 2); nr = (nr / 2); } while(b.size() != 8 * N) b.push_back(0); reverse(b.begin(), b.end()); // cout << "b : "; // for(int i = 0; i < b.size(); i++) cout << b[i]; // cout << '\n'; // vector<short> jucu; for(int i = 0; i < b.size(); i += 8){ int x = 0; for(int j = 0; j < 8; j++){ x = x + (1 << j) * b[i + j]; } // jucu.push_back(x); output(x); } // cout << "M este : "; // for(int i = 0; i < jucu.size(); i++) cout << jucu[i] << " "; // cout << '\n'; // for(int i = 0; i < jucu.size(); i++) output(jucu[i]); }
#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...