#include "icc.h"
#include <bits/stdc++.h>
using namespace std;
#define vll vector<int>
#define all(a) (a).begin(), (a).end()
mt19937 RNG(chrono::steady_clock::now().time_since_epoch().count());
#define NEX(v) shuffle(all(v), RNG);
const int N=200;
int par[N];
int sz[N];
void init(int n)
{
for(int i=1;i<=n;i++)
{
par[i]=i;
sz[i]=1;
}
}
int root(int x)
{
return (par[x]==x?x:par[x]=root(par[x]));
}
void join(int x,int y)
{
x=root(x);
y=root(y);
if(x!=y)
{
par[x]=y;
sz[y]+=sz[x];
}
}
int n_n_n;
vll modify(vll& a)
{
vll b;
for(auto i:a)
for(int j=1;j<=n_n_n;j++)
if(root(j)==i)
b.push_back(j);
return b;
}
int check_edge(vll& a,vll& b)
{
if(a.size()==0 or b.size()==0)
{
return 0;
}
int n=a.size();
int m=b.size();
int a_[n];
for(int i=0;i<n;i++)
a_[i]=a[i];
int b_[m];
for(int i=0;i<m;i++)
b_[i]=b[i];
return query(n,m,a_,b_);
}
vll fit,sed;
int fix_first(int l,int r)
{
if(l==r)
return l;
int mid=(l+r)/2;
vll cur;
for(int i=l;i<=mid;i++)
cur.push_back(fit[i]);
if(check_edge(cur,sed))
return fix_first(l,mid);
else
return fix_first(mid+1,r);
}
void between(vll& a,vll& b)
{
fit=a;
sed=b;
int ind=fix_first(0,((int)a.size())-1);
// cout<<"Hello "<<' '<<ind<<' '<<a[ind]<<endl;
fit={fit[ind]};
swap(sed,fit);
ind=fix_first(0,((int)b.size())-1);
// cout<<"Hello "<<' '<<ind<<' '<<b[ind]<<endl;
fit={fit[ind]};
}
bool found_=0;
void solve(vll& big)
{
int mos=big.back();
int lg=log2(mos);
vll bits;
for(int j=0;j<=lg;j++)
{
bits.push_back(j);
}
NEX(bits);
for(auto j:bits)
{
vll a,b;
for(auto i:big)
{
if((1ll<<j)&i)
{
a.push_back(i);
}
else
{
b.push_back(i);
}
}
vll c=modify(a),d=modify(b);
if(check_edge(c,d))
{
between(c,d);
return;
}
}
}
void run(int n)
{
n_n_n=n;
init(n);
int q=n-1;
while(q--)
{
// cout<<"Add edge \n";
// int x_,y_;
// cin>>x_>>y_;
// ka[x_][y_]=1;
// ka[y_][x_]=1;
vll big;
for(int i=1;i<=n;i++)
if(par[i]==i)
big.push_back(i);
// for(auto i:big)
// {
// cout<<i<<' ';
// }
// cout<<endl;
// cout<<"HEllo "<<check_edge(a,b)<<endl;;
found_=0;
solve(big);
// cout<<"edge is "<<fit[0]<<' '<<sed[0]<<endl;
join(fit[0],sed[0]);
setRoad(fit[0],sed[0]);
// break;
}
}
// int main()
// {
// int n;
// cin>>n;
// run(n);
// }
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
636 KB |
Ok! 102 queries used. |
2 |
Correct |
4 ms |
604 KB |
Ok! 97 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
24 ms |
604 KB |
Ok! 548 queries used. |
2 |
Correct |
30 ms |
604 KB |
Ok! 715 queries used. |
3 |
Correct |
29 ms |
644 KB |
Ok! 674 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
71 ms |
628 KB |
Ok! 1347 queries used. |
2 |
Correct |
105 ms |
852 KB |
Ok! 1756 queries used. |
3 |
Correct |
82 ms |
604 KB |
Ok! 1531 queries used. |
4 |
Correct |
84 ms |
604 KB |
Ok! 1529 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
79 ms |
600 KB |
Ok! 1471 queries used. |
2 |
Correct |
85 ms |
604 KB |
Ok! 1534 queries used. |
3 |
Correct |
87 ms |
600 KB |
Ok! 1583 queries used. |
4 |
Correct |
77 ms |
604 KB |
Ok! 1450 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
89 ms |
600 KB |
Ok! 1574 queries used. |
2 |
Correct |
88 ms |
616 KB |
Ok! 1600 queries used. |
3 |
Correct |
99 ms |
616 KB |
Ok! 1678 queries used. |
4 |
Correct |
88 ms |
624 KB |
Ok! 1594 queries used. |
5 |
Correct |
81 ms |
600 KB |
Ok! 1469 queries used. |
6 |
Correct |
92 ms |
624 KB |
Ok! 1611 queries used. |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
89 ms |
604 KB |
Ok! 1603 queries used. |
2 |
Correct |
86 ms |
628 KB |
Ok! 1572 queries used. |