Submission #564351

#TimeUsernameProblemLanguageResultExecution timeMemory
564351blueCity (JOI17_city)C++17
100 / 100
474 ms60832 KiB
#include "Encoder.h" #include <vector> #include <algorithm> #include <iostream> #include <set> #include <cassert> using namespace std; namespace{ using vi = vector<int>; using vvi = vector<vi>; #define sz(x) int(x.size()) const int abits = 19; const int mx = (1<<abits); using ll = long long; using vll = vector<ll>; int N; vi edge[mx]; vll code(mx, 0); vll dfsind(mx, 0); vll subtree(mx, 1); vll fakesubtree(mx, 1); // int ct = -1; vll getsizes() { double base = 1.03; set<ll> res; res.insert(1); while(res.empty() || *res.rbegin() < mx) { ll curr = *res.rbegin(); res.insert(max(curr+1, ll(curr*base))); } vll resvec; for(ll k : res) resvec.push_back(k); return resvec; } vll sizes; void dfs(int u, int p, int firstind) { // cerr << "dfs " << u << '\n'; dfsind[u] = firstind; firstind++; for(int v : edge[u]) { if(v == p) continue; dfs(v, u, firstind); subtree[u] += subtree[v]; firstind += subtree[v]; } // if(dfsind[u] == 366) // cerr << u << " : " << subtree[u] << " -> "; auto z = lower_bound(sizes.begin(), sizes.end(), (ll) subtree[u]); assert(z != sizes.end() && *z >= subtree[u]); subtree[u] = *z; assert(subtree[u] <= mx); fakesubtree[u] = z - sizes.begin(); // if(dfsind[u] == 366) // cerr << subtree[u] << '\n'; } } void Encode(int N_, int A[], int B[]) { N = N_; sizes = getsizes(); cerr << sz(sizes) << '\n'; // for(int z : sizes) // cerr << z << ' '; // cerr << '\n'; for(int e = 0; e < N-1; e++) { edge[A[e]].push_back(B[e]); edge[B[e]].push_back(A[e]); } // cerr << "done\n"; dfs(0, -1, 0); // cerr << "done2\n"; for(int i = 0; i < N; i++) { // cerr << i << " : " << dfsind[i] << ' ' << subtree[i] << ' ' << ((dfsind[i]<<18) | subtree[i]) << '\n'; Code(i, (fakesubtree[i] << abits) | dfsind[i]); } }
#include "Device.h" #include <vector> #include <algorithm> #include <iostream> #include <set> using namespace std; namespace { using vi = vector<int>; using vvi = vector<vi>; using ll = long long; using vll = vector<ll>; #define sz(x) int(x.size()) const int abits = 19; const int mx = (1<<abits); vll getsizes() { double base = 1.03; set<ll> res; res.insert(1); while(res.empty() || *res.rbegin() < mx) { ll curr = *res.rbegin(); res.insert(max(curr+1, ll(curr*base))); } vll resvec; for(ll k : res) resvec.push_back(k); return resvec; } vll sizes; } void InitDevice() { sizes = getsizes(); } int Answer(long long S, long long T) { // cerr << "query : " << S << ' ' << T << '\n'; // // bool flag = 1; ll s_st = sizes[S>>abits]; ll s_ind = S & ((1<<abits) - 1); ll t_st = sizes[T>>abits]; ll t_ind = T & ((1<<abits) - 1); // if(flag) // { // cerr << "bad query\n"; // cerr << "\n\n"; // cerr << S << ' ' << T << " : " << s_ind << ' ' << s_st << " | " << t_ind << ' ' << t_st << "\n"; // cerr << (T>>18) << '\n'; // } if(t_ind <= s_ind && s_ind < t_ind + t_st) { // if(flag)cerr << "case : 0\n"; return 0; } else if(s_ind <= t_ind && t_ind < s_ind + s_st) { // if(flag)cerr << "case : 1\n"; return 1; } else { // if(flag)cerr << "case : 2\n"; return 2; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...