Submission #566126

#TimeUsernameProblemLanguageResultExecution timeMemory
566126RealSnakeSaveit (IOI10_saveit)C++14
50 / 100
218 ms12396 KiB
#include "bits/stdc++.h" using namespace std; #include "grader.h" #include "encoder.h" void encode(int n, int h, int p, int a[], int b[]) { vector<int> v[n]; for(int i = 0; i < p; i++) { v[a[i]].push_back(b[i]); v[b[i]].push_back(a[i]); } set<int> s; s.insert(0); int par[n] = {}; par[0] = 1; vector<int> v2[n]; while(s.size()) { int x = *s.begin(); s.erase(s.begin()); for(int i : v[x]) { if(!par[i]) { v2[x].push_back(i); par[i] = x + 1; s.insert(i); } } sort(v2[x].begin(), v2[x].end()); } for(int i = 1; i < n; i++) { int x = par[i] - 1; for(int j = 0; j < 10; j++) encode_bit(((x & (1 << j)) > 0)); } int ans[n][h]; for(int i = 0; i < n; i++) { for(int j = 0; j < h; j++) ans[i][j] = 1e9; } set<pair<int, pair<int, int>>> ss; for(int i = 0; i < h; i++) { ss.insert({0, {i, i}}); ans[i][i] = 0; } while(ss.size()) { pair<int, pair<int, int>> p = *ss.begin(); ss.erase(ss.begin()); int x = p.second.first, hub = p.second.second; int cost = p.first; if(cost > ans[x][hub]) continue; for(int i : v[x]) { if(cost + 1 < ans[i][hub]) { ans[i][hub] = cost + 1; ss.insert({cost + 1, {i, hub}}); } } } for(int i = 0; i < h; i++) { int x = ans[0][i]; for(int j = 0; j < 10; j++) encode_bit(((x & (1 << j)) > 0)); s.insert(0); while(s.size()) { x = *s.begin(); s.erase(s.begin()); for(int j : v2[x]) { int dif = ans[j][i] - ans[x][i]; if(dif == 0) encode_bit(0); else { encode_bit(1); if(dif == 1) encode_bit(1); else encode_bit(0); } s.insert(j); } } } }
#include "bits/stdc++.h" using namespace std; #include "grader.h" #include "decoder.h" void decode(int n, int h) { vector<int> v[n]; for(int i = 1; i < n; i++) { int x = 0; for(int j = 0; j < 10; j++) { if(decode_bit()) x += (1 << j); } v[x].push_back(i); } for(int i = 0; i < h; i++) { int b[n]; b[0] = 0; for(int j = 0; j < 10; j++) { if(decode_bit()) b[0] += (1 << j); } set<int> s; s.insert(0); while(s.size()) { int x = *s.begin(); s.erase(s.begin()); hops(i, x, b[x]); for(int j : v[x]) { int dif = decode_bit(); if(dif) { if(!decode_bit()) dif = -1; } b[j] = b[x] + dif; s.insert(j); } } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...