이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "icc.h"
#include <iostream>
#include <set>
#include <vector>
using namespace std;
#define vll vector<int>
const int N=200;
int par[N];
int sz[N];
// bool adj[N][N];
// void setRoad(int x,int y)
// {
// }
// int query(int n,int m,int a[],int b[])
// {
// cout<<"Why? asking \n";
// for(int i=0;i<n;i++)
// {
// cout<<a[i]<<' ';
// }
// cout<<endl;
// for(int j=0;j<m;j++)
// {
// cout<<b[j]<<' ';
// }
// cout<<endl;
// for(int i=0;i<n;i++)
// {
// for(int j=0;j<m;j++)
// {
// if(adj[a[i]][b[j]])
// return 1;
// }
// }
// return 0;
// }
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)
{
swap(x,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)
{
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_);
}
int check_edge1(vll& c,vll& d)
{
vll a=modify(c),b=modify(d);
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)
{
a=modify(a);
b=modify(b);
fit=a;
sed=b;
int ind=fix_first(0,((int)a.size())-1);
fit={fit[ind]};
swap(sed,fit);
ind=fix_first(0,((int)b.size())-1);
fit={fit[ind]};
}
void run(int n)
{
n_n_n=n;
init(n);
int q=n-1;
while(q--)
{
// int x_,y_;
// cin>>x_>>y_;
// cout<<"New edge is "<<x_<<' '<<y_<<endl;
// adj[x_][y_]=adj[y_][x_]=1;
vll shif;
shif.push_back(0);
for(int i=1;i<=n;i++)
if(root(i)==i)
shif.push_back(i);
int s=1;
int e=((int)shif.size())-1;
while(s+1<e)
{
int mid=e-1;
vll big;
for(int i=1;i<mid;i++)
big.push_back(shif[i]);
vll pk;
for(int i=mid;i<shif.size();i++)
pk.push_back(shif[i]);
if(check_edge1(big,pk))
e=mid;
else
s=mid;
}
// cout<<"Hello "<<e<<endl;
// for(int i=0;i<shif.size();i++)
// {
// cout<<i<<' '<<shif[i]<<endl;;
// }
vll big;
for(int j=1;j<e;j++)
big.push_back(shif[j]);
vll pk;
for(int j=e;j<shif.size();j++)
pk.push_back(shif[j]);
// cout<<"Big :";
// for(auto i:big)
// {
// cout<<i<<' ';
// }
// cout<<endl;
// cout<<"pk :";
// for(auto i:pk)
// {
// cout<<i<<' ';
// }
// cout<<endl;
between(big,pk);
// cout<<"Big :";
// for(auto i:big)
// {
// cout<<i<<' ';
// }
// cout<<endl;
// cout<<"pk :";
// for(auto i:pk)
// {
// cout<<i<<' ';
// }
// cout<<endl;
// 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);
// }
컴파일 시 표준 에러 (stderr) 메시지
icc.cpp: In function 'void run(int)':
icc.cpp:150:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
150 | for(int i=mid;i<shif.size();i++)
| ~^~~~~~~~~~~~
icc.cpp:166:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
166 | for(int j=e;j<shif.size();j++)
| ~^~~~~~~~~~~~
# | 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... |