Submission #205227

#TimeUsernameProblemLanguageResultExecution timeMemory
205227stefdascaSaveit (IOI10_saveit)C++14
100 / 100
263 ms11496 KiB
#include<bits/stdc++.h> #include "grader.h" #include "encoder.h" using namespace std; vector<int> v[1002]; int dist[40][1002], tt[1002], state[1002]; bool viz[1002]; void dfs(int dad, int nod) { viz[nod] = 1; tt[nod] = dad; for(int i = 0; i < v[nod].size(); ++i) if(!viz[v[nod][i]]) dfs(nod, v[nod][i]); } void encode(int n, int h, int m, int *a, int *b) { for(int i = 0; i < m; ++i) { v[a[i]].push_back(b[i]); v[b[i]].push_back(a[i]); } dfs(0, 0); for(int i = 0; i < n; ++i) for(int j = 0; j <= 9; ++j) if(tt[i] & (1<<j)) encode_bit(1); else encode_bit(0); for(int i = 0; i < h; ++i) { dist[i][i] = 1; deque<int> d; d.push_back(i); while(!d.empty()) { int nod = d[0]; d.pop_front(); for(int x = 0; x < v[nod].size(); ++x) { int vecin = v[nod][x]; if(!dist[i][vecin]) { dist[i][vecin] = dist[i][nod] + 1; d.push_back(vecin); } } } for(int j = 0; j < n; ++j) { if(dist[i][j] == dist[i][tt[j]]) state[j] = 0; else if(dist[i][j] > dist[i][tt[j]]) state[j] = 1; else state[j] = 2; } // 5 states with 8 bits for(int j = 0; j < n; j += 5) { int msk = 0; for(int x = j; x < min(n, j + 5); ++x) msk = msk * 3 + state[x]; for(int pw = 0; pw <= 7; ++pw) if(msk & (1<<pw)) encode_bit(1); else encode_bit(0); } } }
#include<bits/stdc++.h> #include "grader.h" #include "decoder.h" using namespace std; vector<int> v[1002]; int tt[1002], dist[40][1002], state[1002]; void dfs(int h, int dad, int nod) { dist[h][nod] = dist[h][tt[nod]] + (state[nod] + 1) % 3 - 1; for(int i = 0; i < v[nod].size(); ++i) { int vecin = v[nod][i]; if(vecin == dad) continue; dfs(h, nod, vecin); } } void decode(int n, int h) { for(int i = 0; i < n; ++i) { int wh = 0; for(int j = 0; j <= 9; ++j) wh = wh + (1<<j) * decode_bit(); tt[i] = wh; v[wh].push_back(i); } for(int i = 0; i < h; ++i) { for(int j = 0; j < n; j += 5) { int val = 0; for(int xx = 0; xx <= 7; ++xx) val = val + decode_bit() * (1<<xx); for(int xx = min(n - 1, j + 4); xx >= j; --xx) { state[xx] = val % 3; val /= 3; } } int nd = i; while(nd != tt[nd]) { dist[i][tt[nd]] = dist[i][nd] - (state[nd] + 1) % 3 + 1; nd = tt[nd]; } dfs(i, 0, 0); for(int j = 0; j < n; ++j) hops(i, j, dist[i][j]); } }

Compilation message (stderr)

encoder.cpp: In function 'void dfs(int, int)':
encoder.cpp:17:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < v[nod].size(); ++i)
                    ~~^~~~~~~~~~~~~~~
encoder.cpp: In function 'void encode(int, int, int, int*, int*)':
encoder.cpp:44:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for(int x = 0; x < v[nod].size(); ++x)
                            ~~^~~~~~~~~~~~~~~

decoder.cpp: In function 'void dfs(int, int, int)':
decoder.cpp:14:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 0; i < v[nod].size(); ++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...