Submission #1221241

#TimeUsernameProblemLanguageResultExecution timeMemory
1221241abczzSaveit (IOI10_saveit)C++20
100 / 100
49 ms9148 KiB
#include "grader.h"
#include "encoder.h"
#include <iostream>
#include <vector>
#include <queue>
#include <array>
#include <algorithm>
#define ll long long

using namespace std;

queue <ll> Q;
vector <ll> adj[1000];
vector <array<ll, 2>> E, V;
array<ll, 9> cnt;
bool B[9];
ll dist[1000], P[1000];
void bfs(ll x) {
  Q.push(x);
  for (int i=0; i<1000; ++i) dist[i] = 1e18, P[i] = -1;
  dist[x] = 0;
  while (!Q.empty()) {
    auto u = Q.front();
    Q.pop();
    for (auto v : adj[u]) {
      if (dist[v] == (ll)1e18) dist[v] = dist[u]+1, P[v] = u, Q.push(v);
    }
  }
}
void encode(int nv, int nh, int ne, int *v1, int *v2){
  E.clear();
  for (int i=0; i<nv; ++i) adj[i].clear();
  for (int i=0; i<ne; ++i) {
    adj[v1[i]].push_back(v2[i]);
    adj[v2[i]].push_back(v1[i]);
  }
  bfs(0);
  for (int i=1; i<nv; ++i) {
    E.push_back({P[i], i});
    for (int j=0; j<10; ++j) {
      if (P[i] & (1LL<<j)) encode_bit(1);
      else encode_bit(0);
    }
  }
  if (nh == 1) return;
  vector <ll> F;
  for (int i=1; i<nh; ++i) {
    bfs(i);
    for (auto [u, v] : E) {
      F.push_back(dist[u]-dist[v]);
    }
  }
  if ((F.size() & 1)) F.push_back(0);
  for (int i=0; i<F.size(); i+=2) {
    ll u = (F[i]+1) * 3 + (F[i+1]+1);
    ++cnt[u];
  }
  for (int i=0; i<9; ++i) V.push_back({cnt[i], i});
  sort(V.begin(), V.end());
  if (V[0][1] > V[1][1]) swap(V[0], V[1]);
  B[V[0][1]] = B[V[1][1]] = 1;
  for (int i=0; i<9; ++i) encode_bit((ll)B[i]);
  for (int i=0; i<F.size(); i+=2) {
    ll u = (F[i]+1) * 3 + (F[i+1]+1);
    ll v = 0;
    if (u == V[0][1]) encode_bit(1), v = 6;
    else if (u == V[1][1]) encode_bit(1), v = 7;
    else {
      if (u < V[0][1]) v = u;
      else if (u < V[1][1]) v = u-1;
      else v = u-2;
    }
    for (int j=2; j>=0; --j) {
      if (v & (1LL<<j)) encode_bit(1);
      else encode_bit(0);
    }
  }
}
#include "grader.h"
#include "decoder.h"
#include <iostream>
#include <vector>
#include <array>
#define ll long long

using namespace std;

vector <array<ll, 2>> e, adj2[1000];
vector <ll> U, X;
ll n, dist2[1000], W[1000];

void dfs(ll u, ll p) {
  for (auto [v, w] : adj2[u]) {
    if (v == p) continue;
    if (dist2[v] == (ll)1e18) {
      dist2[v] = dist2[u]+w;
      dfs(v, u);
    }
  }
}
void solve(ll u) {
  for (int i=0; i<1000; ++i) adj2[i].clear(), dist2[i] = (ll)1e18;
  dist2[u] = 0;
  for (int i=0; i<e.size(); ++i) {
    adj2[e[i][0]].push_back({e[i][1], -W[i]});
    adj2[e[i][1]].push_back({e[i][0], W[i]});
  }
  dfs(u, -1);
  for (int i=0; i<n; ++i) {
    hops(u, i, dist2[i]);
  }
}
void b3(ll u) {
  X.push_back((ll)(u/3)-1);
  X.push_back((ll)(u%3)-1);
}
void decode(int nv, int nh) {
  n = nv;
  for (ll i=1; i<nv; ++i) {
    W[i-1] = -1;
    ll u = 0;
    for (int j=0; j<10; ++j) {
      u += decode_bit() * (1LL<<j);
    }
    e.push_back({u, i});
  }
  solve(0);
  if (nh == 0) return;
  for (int i=0; i<9; ++i) {
    if (decode_bit() == 1) U.push_back(i);
  }
  for (int i=0; i<(nh-1)*(nv-1); i+=2) {
    ll a = decode_bit(), b = decode_bit(), c = decode_bit();
    if (a == 1 && b == 1 && c == 1) {
      c = decode_bit();
      if (!c) b3(U[0]);
      else b3(U[1]);
    }
    else {
      ll u = a*4+b*2+c;
      if (u >= U[0]) ++u;
      if (u >= U[1]) ++u;
      b3(u);
    }
  }
  int k = 0;
  for (int i=1; i<nh; ++i) {
    for (int j=0; j<nv-1; ++j) {
      W[j] = X[k++];
    }
    solve(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...