#include<bits/stdc++.h>
#include "icc.h"
#define I inline void
#define S struct
#define vi vector<int>
#define vii vector<pair<int,int>>
#define pii pair<int,int>
#define pll pair<ll,ll>
using namespace std ;
using ll = long long ;
using ld = long double ;
const int N = 1e5 + 7 , mod = 1e9 + 7 ;
const int inf = N ;
// How interesting!
int n ;
int fat[N] ;
vector<pair<int,int> > ed ;
int U , V ;
inline int find(int x){return fat[x] = (x == fat[x] ? x : find(fat[x])) ; }
void link(int u , int v){
u = find(u) ;
v = find(v) ;
if(u!=v)
fat[u] = v;
}
/*
bool ok(int u , int v){
if( u == U && v == V)
return 1 ;
if(u == V && v == U)
return 1;
return 0 ;
}
void setRoad(int u , int v){
if(ok(u , v)){
cout<<"ok " << u <<" " << v <<"\n" ;
link(u , v) ;
}
else{
cout<< u <<" "<< v <<">>" ;
cout<<"bad" ;
exit(0) ;
}
}
int query(int x , int y , vector<int> v1 , vector<int> v2){
set<int> st ;
for(auto u : v1)
st.insert(find(u)) ;
for(auto u : v2){
if(st.find(find(u)) != st.end())
return 1 ;
}
int m1 = 0 , m2 = 0 ;
for(auto u : v1)
if(u == U || u == V)
m1 = 1;
for(auto u : v2)
if(u == U || u == V)
m2 = 1 ;
if( m1 == 1 && m2 == 1 ){
return 1 ;
}
return 0 ;
}*/
int query1(int x , int y , vector<int> v1 , vector<int> v2){
//return query(x , y , v1 , v2) ;
int *v11;
int *v22 ;
v11 = new int[x] ;
v22 = new int [y] ;
for(int i = 0 ;i < x ; ++ i)
v11[i] = v1[i] ;
for(int i = 0 ;i < y ; ++ i)
v22[i] = v2[i] ;
return query(x , y , v11 , v22) ;
}
void divide(vector<vector<int> > &vec){
vector<vector<int> > ret ;
int sz = (int) vec.size() ;
for(int i = 0 ;i < sz ; ++ i){
int sz2 = (int) vec[i].size() ;
vector<int> lhs, rhs ;
for(int j = 0 ;j < sz2 ;++ j){
if(j < sz2 / 2 )
lhs.push_back(vec[i][j]) ;
else
rhs.push_back(vec[i][j]) ;
}
if(lhs.size())
ret.push_back(lhs) ;
if(rhs.size())
ret.push_back(rhs) ;
}
vec = ret ;
}
vector<int> chd(int x){
vector<int> ret ;
for(int i = 1 ;i <= n; ++ i){
if(find(i) == x)
ret.push_back(i) ;
}
return ret ;
}
int conquer(vector<vector<int> > &vec, int lmt = 1000000){
int ret = 0 ;
vector<int> lhs, rhs ;
for(int i = 0 ; i < min(lmt , (int) vec.size() ) ; ++ i){
for(auto u : vec[i]){
if(i&1)
for(auto v : chd(u))
rhs.push_back(v) ;
else for(auto v : chd(u))
lhs.push_back(v) ;
}
}
return query1(lhs.size() , rhs.size() , lhs , rhs ) ;
}
vector<int> qur(vector<int> ve){
vector<int> ret ;
for(auto u : ve)
for(auto v : chd(u))
ret.push_back(v) ;
return ret;
}
void getRoad(vector<int> v1, vector<int> v2){
vector<int> now = v1, oth = v2 ;
int lo = 1 , hi = v1.size() ;
int u = 0 , v = 0 ;
while(lo<=hi){
int mid = (lo+hi)>>1;
vector<int> nnow ;
for(int i = 0 ; i < mid ; ++ i)
nnow.push_back(now[i]) ;
if(query1(nnow.size() ,oth.size(),nnow,oth)){
hi = mid - 1;
u = nnow.back() ;
}else{
lo = mid + 1;
}
}
swap(now,oth) ;
swap(u , v) ;
lo = 1, hi = (int) now.size() ;
while(lo<=hi){
int mid = (lo+hi)>>1;
vector<int> nnow ;
for(int i = 0 ; i < mid ; ++ i)
nnow.push_back(now[i]) ;
if(query1(nnow.size() ,oth.size(),nnow,oth)){
hi = mid - 1;
u = nnow.back() ;
}else{
lo = mid + 1;
}
}
setRoad(u , v) ;
link(u , v) ;
}
void divide_or_conquer(vector<int> hs){
vector<vector<int> > dac { hs } ;
divide(dac) ;
while(!conquer(dac))divide(dac) ;
int lo = 1, hi = (int) dac.size() ;
int lst = (int) dac.size() ;
while(lo<=hi){
int mid = (lo+hi) >> 1;
if(conquer(dac, mid)){
lst = mid ;
hi = mid - 1;
}else lo = mid + 1;
}
getRoad(qur(dac[lst-2]) , qur(dac[lst-1]) ) ;
}
void run(int x){
n = x;
for(int i = 1;i <= n; ++ i)
fat[i] = i ;
for(int r = 0 ; r < n - 1; ++ r){
//U = ed[r].first ;
//V = ed[r].second ;
vector<int> v ;
for(int i = 1;i <= n; ++ i){
if(i == fat[i])
v.push_back(i) ;
}
random_shuffle(v.begin() , v.end()) ;
divide_or_conquer(v) ;
}
}
Compilation message
icc.cpp: In function 'int conquer(std::vector<std::vector<int> >&, int)':
icc.cpp:119:13: warning: unused variable 'ret' [-Wunused-variable]
119 | int ret = 0 ;
| ^~~
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
9 ms |
512 KB |
Ok! 136 queries used. |
2 |
Correct |
8 ms |
512 KB |
Ok! 130 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
57 ms |
640 KB |
Ok! 620 queries used. |
2 |
Correct |
57 ms |
760 KB |
Ok! 663 queries used. |
3 |
Correct |
58 ms |
636 KB |
Ok! 671 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
179 ms |
1028 KB |
Ok! 1507 queries used. |
2 |
Correct |
216 ms |
1016 KB |
Ok! 1543 queries used. |
3 |
Correct |
206 ms |
996 KB |
Ok! 1734 queries used. |
4 |
Correct |
191 ms |
1016 KB |
Ok! 1611 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
191 ms |
1048 KB |
Ok! 1581 queries used. |
2 |
Correct |
197 ms |
968 KB |
Ok! 1688 queries used. |
3 |
Correct |
207 ms |
1040 KB |
Ok! 1711 queries used. |
4 |
Correct |
190 ms |
1016 KB |
Ok! 1623 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
211 ms |
1016 KB |
Ok! 1692 queries used. |
2 |
Correct |
210 ms |
1016 KB |
Ok! 1689 queries used. |
3 |
Correct |
217 ms |
1016 KB |
Ok! 1595 queries used. |
4 |
Correct |
205 ms |
1028 KB |
Ok! 1701 queries used. |
5 |
Correct |
188 ms |
1016 KB |
Ok! 1571 queries used. |
6 |
Correct |
199 ms |
1016 KB |
Ok! 1584 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
212 ms |
1016 KB |
Too many queries! 1696 out of 1625 |
2 |
Halted |
0 ms |
0 KB |
- |