This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "highway.h"
#include <bits/stdc++.h>
using namespace std;
//macros
typedef long long ll;
typedef pair<int, int> ii;
typedef tuple<int, int, int> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define RE(a,c) REP(a,0,c)
#define RE1(a,c) REP(a,1,c+1)
#define REI(a,b,c) REP(a,b,c+1)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define pb push_back
#define fi first
#define se second
#define sz size()
//===================//
// begin program //
//===================//
const int MX = 5e5;
int n, m, a, b;
vi w, u, v;
vi group, visited;
vii adj[MX];
ll dist;
bool sameGroup() {
RE(i,m) {
if(group[u[i]] != group[v[i]]) w[i] = 0;
else w[i] = 1;
}
dist = ask(w);
return dist%2;
}
int findSubtree(int edge, int u, int p) {
vii binS;
queue<ii> q; q.push({u, p}); binS.pb({edge, u});
while(!q.empty()) {
ii p = q.front(); q.pop();
for(ii v:adj[p.fi]) if(v.fi != p.se) {
q.push({v.fi, p.fi});
binS.pb({v.se, v.fi});
}
}
int lb=0, ub=binS.sz-1;
while(lb != ub) {
int mid = (lb+ub+1)/2;
RE(i,n) w[i] = 0;
REP(i,mid,binS.sz) w[binS[i].fi] = 1;
if(ask(w) == dist) ub = mid-1;
else lb = mid;
}
return binS[lb].se;
}
void find_pair(int N, vi U, vi V, int A, int B) {
n=N; a=A; b=B; u=U; v=V;
m = u.sz;
w.assign(m, 0);
RE(i,m) {
adj[u[i]].pb({v[i], i});
adj[v[i]].pb({u[i], i});
}
if(A == 1 && B == 2) {
group.resize(n);
int XOR=0;
RE(i,17) {
int bit = (1<<i);
RE(j,n) group[j] = (j&bit)==0;
if(sameGroup()) XOR |= bit;
}
visited.assign(n, 0);
RE(i,n) {
if(visited[i]) continue;
if((i^XOR) < n) {
group[i] = 0; group[i^XOR] = 1;
visited[i] = visited[i^XOR] = 1;
} else {
group[i] = 0;
visited[i] = 1;
}
}
int ones=0;
RE(i,n) if(group[i]) ones++;
while(ones != 1) {
set<int> rem;
RE(i,n) {
if(group[i] && rem.sz != ones/2) {
rem.insert(i);
group[i] = 0;
}
}
if(!sameGroup()) {
RE(i,n) group[i] = 0;
for(int i:rem) group[i] = 1;
}
ones=0;
RE(i,n) if(group[i]) ones++;
}
int ans = 0;
RE(i,n) if(group[i]) ans = i;
answer(ans, ans^XOR);
return;
}
dist = ask(w);
RE(i,m) w[i] = 1;
int ones = n;
while(ones != 1) {
set<int> rem;
RE(i,m) if(w[i] && rem.sz < ones/2) {
w[i] = 0;
rem.insert(i);
}
if(dist == ask(w)) {
RE(i,n) w[i] = 0;
for(int i:rem) w[i] = 1;
}
ones = 0;
RE(i,m) if(w[i]) ones++;
}
RE(i,m) if(w[i]) {
answer(findSubtree(i, u[i], v[i]), findSubtree(i, v[i], u[i]));
}
}
Compilation message (stderr)
highway.cpp: In function 'void find_pair(int, vi, vi, int, int)':
highway.cpp:95:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
if(group[i] && rem.sz != ones/2) {
~~~~~~~^~~~~~~~~
highway.cpp:118:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
RE(i,m) if(w[i] && rem.sz < ones/2) {
~~~~~~~^~~~~~~~| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |