제출 #1263835

#제출 시각아이디문제언어결과실행 시간메모리
1263835gustavo_d저장 (Saveit) (IOI10_saveit)C++20
100 / 100
48 ms5952 KiB
#include "grader.h" #include "encoder.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 1000; const int MAXH = 36; vector<int> adjE[MAXN]; bool visE[MAXN]; int distE[MAXN], paiE[MAXN], lastDistE[MAXN], diffs[MAXN]; int n; void bfs(int src, bool updatePai) { for (int i=0; i<n; i++) { visE[i] = false; } visE[src] = true; distE[src] = 0; queue<int> visit; visit.push(src); while (!visit.empty()) { int v = visit.front(); visit.pop(); for (int viz : adjE[v]) { if (visE[viz]) continue; visE[viz] = true; distE[viz] = distE[v] + 1; if (updatePai) { paiE[viz] = v; // cout << "pai: " << v << " de " << viz << endl; } visit.push(viz); } } } void send_int(int val, int bits) { // cout << "envia" << val << endl; for (int b=0; b<bits; b++) { encode_bit(((1 << b) & val) != 0); } } int calculate_encode(vector<int> grp) { int code = 0; for (int i=0, pot=1; i<5; i++, pot*=3) { code += grp[i] * pot; // cerr << '(' << grp[i] << ' ' << pot << ')'; } // cerr << "code=" << code << '\n'; return code; } void encode(int nv, int nh, int ne, int *v1, int *v2){ n = nv; for (int i=0; i<ne; i++) { int u = v1[i], v = v2[i]; adjE[u].push_back(v); adjE[v].push_back(u); } bfs(0, true); for (int i=1; i<n; i++) { // cout << paiE[i] << endl; send_int(paiE[i], 10); } for (int h=1; h<nh; h++) { // cerr << "\n\n\nenvia hub " << h << endl; for (int i=0; i<n; i++) lastDistE[i] = distE[i]; bfs(h, false); for (int i=1; i<n; i++) { int diff = distE[i] - distE[paiE[i]]; diffs[i] = diff; } for (int i=1; i<n; i+=5) { vector<int> grp(5, 0); for (int j=0; j<5 and i+j<n; j++) { grp[j] = diffs[i+j] + 1; // // cerr << grp[j] << ' '; } send_int(calculate_encode(grp), 8); } } return; }
#include "grader.h" #include "decoder.h" #include <bits/stdc++.h> using namespace std; const int MAXN = 1000; vector<int> adj[MAXN]; vector<pair<int, int>> adjDelta[MAXN]; bool vis[MAXN]; int dist[MAXN], pai[MAXN]; int readInt(int bits) { int res = 0; for (int b=0; b<bits; b++) { if (decode_bit()) res += (1 << b); } // cout << "recebe " << res << endl; return res; } void dfs(int v) { for (int viz : adj[v]) { dist[viz] = dist[v] + 1; dfs(viz); } } void dfsDelta(int v) { vis[v] = true; for (auto [viz, delta] : adjDelta[v]) { if (vis[viz]) continue; dist[viz] = dist[v] + delta; dfsDelta(viz); } } vector<int> decode_grp(int code) { vector<int> grp(5, 0); for (int i=4, pot=81; i>=0; i--, pot /= 3) { grp[i] = code / pot; code %= pot; } return grp; } void decode(int nv, int nh) { int n = nv; for (int i=1; i<n; i++) { pai[i] = readInt(10); adj[pai[i]].push_back(i); } dist[0] = 0; dfs(0); for (int i=0; i<n; i++) hops(0, i, dist[i]); for (int h=1; h<nh; h++) { // cerr << "\n\n\nrecebe hub " << h << endl; for (int i=1; i<n; i+=5) { int code = readInt(8); vector<int> grp = decode_grp(code); for (int j=0; j<5 and i + j < n; j++) { int dist = grp[j] - 1; // cerr << grp[j] << ' '; adjDelta[i+j].emplace_back(pai[i+j], -dist); adjDelta[pai[i+j]].emplace_back(i+j, dist); } } dist[h] = 0; dfsDelta(h); for (int i=0; i<n; i++) hops(h, i, dist[i]); for (int i=0; i<n; i++) { vis[i] = false; adjDelta[i].clear(); } // cout << endl << endl; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...