제출 #515946

#제출 시각아이디문제언어결과실행 시간메모리
515946600Mihnea저장 (Saveit) (IOI10_saveit)C++17
100 / 100
268 ms10584 KiB
#include "grader.h" #include "encoder.h" #include <bits/stdc++.h> using namespace std; void encode(int nv, int nh, int ne, int *v1, int *v2) { const int STORING_BITS = 10; vector<vector<int>> g(nv); vector<int> parrent(nv, -2); vector<bool> vis(nv, 0); for (int i = 0; i < ne; i++) { g[v1[i]].push_back(v2[i]); g[v2[i]].push_back(v1[i]); } function<void(int)> dfs = [&] (int a) { vis[a] = 1; for (auto &b : g[a]) { if (!vis[b]) { parrent[b] = a; dfs(b); } } }; parrent[0] = -1; dfs(0); int cnt = 0; for (int i = 1; i < nv; i++) { for (int bit = 0; bit < STORING_BITS; bit++) { if (parrent[i] & (1 << bit)) { encode_bit(1); cnt++; } else { encode_bit(0); cnt++; } } } vector<int> stored; for (int i = 0; i < nh; i++) { vector<int> d(nv, -1); queue<int> q; q.push(i); d[i] = 0; while (!q.empty()) { int a = q.front(); q.pop(); for (auto &b : g[a]) { if (d[b] == -1) { d[b] = 1 + d[a]; q.push(b); } } } for (int i = 1; i < nv; i++) { int dif = d[i] - d[parrent[i]]; stored.push_back(dif + 1); } } for (int l = 0; l < (int) stored.size(); l += 3) { int r = min((int) stored.size(), l + 2); int num = 0; for (int j = l; j <= r; j++) { num = num * 3 + stored[j]; } for (int bit = 0; bit < 5; bit++) { encode_bit(num % 2); num /= 2; } } }
#include "grader.h" #include "decoder.h" #include <bits/stdc++.h> using namespace std; void decode(int nv, int nh) { const int STORING_BITS = 10; vector<int> parrent(nv, 0); parrent[0] = -1; for (int i = 1; i < nv; i++) { for (int bit = 0; bit < STORING_BITS; bit++) { int x = decode_bit(); parrent[i] += (1 << bit) * x; } } vector<int> stored(nh * (nv - 1)); for (int l = 0; l < (int) stored.size(); l += 3) { int r = min((int) stored.size(), l + 2); int num = 0; for (int bit = 0; bit < 5; bit++) { num += (1 << bit) * decode_bit(); } for (int j = r; j >= l; j--) { stored[j] = num % 3; num /= 3; } } int po = 0; for (int r = 0; r < nh; r++) { vector<vector<pair<int, int>>> g(nv); for (int i = 1; i < nv; i++) { int dif = stored[po++] - 1; int j = parrent[i]; g[i].push_back({j, dif}); g[j].push_back({i, -dif}); } const int TOKEN = -(int) 1e9; vector<int> sol(nv, TOKEN); sol[r] = 0; function<void(int)> explore = [&] (int a) { for (auto &b : g[a]) { if (sol[b.first] == TOKEN) { sol[b.first] = sol[a] - b.second; explore(b.first); } } }; explore(r); for (int i = 0; i < nv; i++) { hops(r, i, sol[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...