Submission #427431

#TimeUsernameProblemLanguageResultExecution timeMemory
427431AugustinasJucasStations (IOI20_stations)C++14
0 / 100
80 ms684 KiB
#include "stations.h" #include <bits/stdc++.h> using namespace std; const int dydis = 1000; vector<int> gr[dydis]; int enter[dydis]; int leave[dydis]; vector<int> ret (dydis); int dbInd = 0; void dfs(int v, int came){ enter[v] = dbInd++; for(auto x : gr[v]){ if(x == came) continue; dfs(x, v); } leave[v] = dbInd; ret[v] = enter[v] * dydis + leave[v] - 1; //cout << "enter " << v << " - " << enter[v] << ", o leave " << leave[v]-1 << endl; } void dfs1(int v, int came, int as){ ret[v] = as; for(auto x : gr[v]){ if(x == came) continue; dfs1(x, v, as+1); } } vector<int> label(int n, int k, vector<int> u, vector<int> v) { int mxsz = 0; for(int i = 0; i < n; i++){ gr[i].clear(); gr[i].clear(); } dbInd = 0; ret.resize(n); for(int i = 0; i < n-1; i++){ gr[u[i]].push_back(v[i]); gr[v[i]].push_back(u[i]); } for(int i = 0; i < n; i++) mxsz = max(mxsz, (int)gr[i].size()); //int st = 0; //for(int i = 0; i < n; i++) if(gr[i].size() == 1) st = i; //dfs1(st, -1, 1); for(int i = 0; i < n; i++) ret[i] = i + 1; return ret; } /* int find_next_station(int s, int t, vector<int> c) { int enterS = s / 1000; int leaveS = s % 1000; int enterT = t / 1000; int leaveT = t % 1000; // cout << "kitas einant is " << s << " i " << t << " yra:\n"; if(enterS <= enterT && leaveT <= leaveS){ // cout << enterS << " yra " << enterT << " tevas\n"; for(auto x : c){ int e = x / 1000; int l = x % 1000; if(e <= enterT && leaveT <= l && !(e <= enterS && leaveS <= l)){ // cout << "ret " << x << endl << endl; return x; } } }else{ // eisiu aukstyn for(auto x : c){ int e = x / 1000; int l = x % 1000; if(e <= enterS && leaveS <= l){ // cout << "ret " << x << endl << endl; return x; } } } return c[0]; } */ int lg2(int x){ int ret = 0; while(x != 0){ ret++; x = x >> 1; } return ret; } int find_next_station(int s, int t, vector<int> c) { int h1 = lg2(s); int h2 = lg2(t); //cout << s << " -> " << t << ", ret = "; if(h1 >= h2){ // s zemiau cout << s/2 << endl; return s / 2; } // dabar s bus auksciau! int reiks = ((s << (h2 - h1)) ^ t); int aukBit = -1; for(int i = 0; i < 30; i++) if((1 << i) & reiks) aukBit = i; //cout << "reiks = " << reiks << ", aukbit = " << aukBit << endl; if(aukBit < h2-h1){ // s yra tevas int pl = ((bool)(t & (1 << (h2 - h1-1)))); cout << s*2 + pl << endl; return s * 2 + pl; }else{ cout << s / 2 << endl ; return s / 2; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...