Submission #366591

#TimeUsernameProblemLanguageResultExecution timeMemory
366591kostia244Saveit (IOI10_saveit)C++17
100 / 100
823 ms20716 KiB
#include "grader.h"
#include "encoder.h"
#include<bits/stdc++.h>
using namespace std;
namespace {
const int N = 1585;
const int SZ = 1 + (N*32)/30;
const uint ful = (1u<<30)-1;
struct big_int {
	uint a[SZ];
	big_int() {
		memset(a, 0, sizeof a);
	}
	void triple() {
		for(int i = 0; i < SZ; i++) a[i] *= 3;
		for(int i = 0; i+1 < SZ; i++) {
			a[i+1] += a[i]>>30;
			a[i] &= ful;
		}
	}
	void add(uint x) {
		int co = x;
		for(int i = 0; co;) {
			a[i] += co;
			co = a[i]>>30;
			a[i] &= ful;
		}
	}
	friend big_int operator+(big_int x, const big_int &y) {
		uint co = 0;
		for(int i = 0; i < SZ; i++) {
			x.a[i] += y.a[i]+co;
			co = x.a[i]>>30;
			x.a[i] &= ful;
		}
		return x;
	}
	friend bool operator<=(const big_int &a, const big_int &b) {
		int pos = SZ-1;
		while(pos >= 0 && a.a[pos] == b.a[pos]) pos--;
		return pos == -1 || a.a[pos] <= b.a[pos];
	}
	void send() {
		for(int i = 0; i < N; i++) {
			int val = a[i/30];
			val >>= i%30;
			encode_bit(val&1);
		}
	}
	void get() {
		for(int i = 0; i < N; i++) {
			int val = decode_bit();
			val <<= i%30;
			a[i/30] |= val;
		}
	}
	void print() {
		for(int i = 0; i < 30; i++) cout << ((a[0]>>i)&1);cout << endl;
	}
};
int n, par[N];
vector<int> g[N];
template<int build_tree>
void bfs(int v) {
	vector<int> dist(n+1, -1);
	queue<int> q;
	auto enq = [&](int v, int d, int P) {
		if(dist[v] != -1) return;
		dist[v] = d;
		if(build_tree) par[v] = P;
		q.push(v);
	};
	enq(v, 0, -1);
	while(!q.empty()) {
		int v = q.front();q.pop();
		for(auto i : g[v]) enq(i, dist[v]+1, v);
	}
	//for(int i = 0; i < n; i++) cout << dist[i] << " "; cout << endl;
	if(build_tree) {
		for(int i = 1; i < n; i++)
			for(int j = 0; j < 10; j++)
				encode_bit((par[i]>>j)&1);
	} else {
		for(int i = 0; i < 10; i++) encode_bit((dist[0]>>i)&1);
		big_int res;
		for(int i = 1; i < n; i++) {
			res.triple();
			res.add(1 + dist[i] - dist[par[i]]);
			//cout << v << " | " << i << " | " << 1 + dist[i] - dist[par[i]] << " res " << dist[i] << endl;
		}
		//cout << v << " res " << res.a[0] << endl;
		res.send();
	}
}
};
void encode(int V, int H, int E, int *v1, int *v2){
	n = V;
	for(int i = 0; i < E; i++) g[v1[i]].push_back(v2[i]);
	for(int i = 0; i < E; i++) g[v2[i]].push_back(v1[i]);
	bfs<1>(0);
	for(int i = 1; i < H; i++) bfs<0>(i);
	return;
}
#include "grader.h"
#include "decoder.h"
#include<bits/stdc++.h>
using namespace std;
namespace {
const int N = 1585;
const int SZ = 1 + (N*32)/30;
const uint ful = (1u<<30)-1;
struct big_int {
	uint a[SZ];
	big_int() {
		memset(a, 0, sizeof a);
	}
	void triple() {
		for(int i = 0; i < SZ; i++) a[i] *= 3;
		for(int i = 0; i+1 < SZ; i++) {
			a[i+1] += a[i]>>30;
			a[i] &= ful;
		}
	}
	void add(uint x) {
		int co = x;
		for(int i = 0; co;) {
			a[i] += co;
			co = a[i]>>30;
			a[i] &= ful;
		}
	}
	friend big_int operator+(big_int x, const big_int &y) {
		uint co = 0;
		for(int i = 0; i < SZ; i++) {
			x.a[i] += y.a[i]+co;
			co = x.a[i]>>30;
			x.a[i] &= ful;
		}
		return x;
	}
	friend bool operator<=(const big_int &a, const big_int &b) {
		int pos = SZ-1;
		while(pos >= 0 && a.a[pos] == b.a[pos]) pos--;
		return pos == -1 || a.a[pos] <= b.a[pos];
	}
	void send() {
		for(int i = 0; i < N; i++) {
			int val = a[i/30];
			val >>= i%30;
			encode_bit(val&1);
		}
	}
	void get() {
		for(int i = 0; i < N; i++) {
			int val = decode_bit();
			val <<= i%30;
			a[i/30] |= val;
		}
	}
	void print() {
		for(int i = 0; i < 30; i++) cout << ((a[0]>>i)&1);cout << endl;
	}
};
int n, h, d21[N], par[N];
vector<int> g[N], ord;
void dfs(int v) {
	ord.push_back(v);
	for(int i : g[v]) dfs(i);
}
big_int pws[N];
}
void decode(int nv, int nh) {
	n = nv;
	h = nh;
	d21[0] = 0;
	for(int i = 1; i < n; i++) {
		for(int j = 0; j < 10; j++) {
			par[i] |= decode_bit()<<j;
		}
		g[par[i]].push_back(i);
	}
	dfs(0);
	//cout << "pT2\n";
	for(auto i : ord) if(i) d21[i] = d21[par[i]] + 1;
	for(int i = 0; i < n; i++) hops(0, i, d21[i]);
	pws[0].add(1);
	for(int i = 1; i < n; i++) pws[i] = pws[i-1], pws[i].triple();
	for(int hl = 1; hl < h; hl++) {
		memset(d21, 0, sizeof d21);
		for(int j = 0; j < 10; j++) d21[0] |= decode_bit()<<j;
		big_int dif;
		//cout << dif.a[0] << " - " << dif.a[1] << " - " << dif.a[2] << " - " << dif.a[3] << endl;
		dif.get();
		//cout << hl << " == " << dif.a[0] << endl;
		//cout << dif.a[0] << " - " << dif.a[1] << " - " << dif.a[2] << " - " << dif.a[3] << endl;
		big_int cur;
		for(int i = 1; i < n; i++) {
			int CCC = 0;
			big_int &cp = pws[n-i-1], nxt;
			//cout << cur.a[0] << " " << cp.a[0] << " " << dif.a[0] << endl;
			while(nxt = cur+cp, nxt <= dif) {
				cur = nxt;
				//cout << "inc\n";
				d21[i]++;
			}
			//cout << cur.a[0] << endl;
			//cout << hl << " : " << i << " : " << d21[i] << endl;
		}
		for(auto i : ord) if(i) {
			d21[i] -= 1;
			d21[i] += d21[par[i]];
			//cout << hl << " " << i << " res " << d21[i] << endl;
		}
		for(int i = 0; i < n; i++) hops(hl, i, d21[i]);
	}
}

Compilation message (stderr)

encoder.cpp: In member function 'void {anonymous}::big_int::print()':
encoder.cpp:58:3: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   58 |   for(int i = 0; i < 30; i++) cout << ((a[0]>>i)&1);cout << endl;
      |   ^~~
encoder.cpp:58:53: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   58 |   for(int i = 0; i < 30; i++) cout << ((a[0]>>i)&1);cout << endl;
      |                                                     ^~~~

decoder.cpp: In member function 'void {anonymous}::big_int::print()':
decoder.cpp:58:3: warning: this 'for' clause does not guard... [-Wmisleading-indentation]
   58 |   for(int i = 0; i < 30; i++) cout << ((a[0]>>i)&1);cout << endl;
      |   ^~~
decoder.cpp:58:53: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'for'
   58 |   for(int i = 0; i < 30; i++) cout << ((a[0]>>i)&1);cout << endl;
      |                                                     ^~~~
decoder.cpp: In function 'void decode(int, int)':
decoder.cpp:95:8: warning: unused variable 'CCC' [-Wunused-variable]
   95 |    int CCC = 0;
      |        ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...