이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#ifndef SKY
#include "doll.h"
#endif // SKY
using namespace std;
#define N 1000010
#define ll long long
#define fs first
#define sc second
#define ii pair<int,int>
#define pb push_back
int n,q,dem=0,root[N];
vector<int>lis[N];
vector<ii>flow_out[N];
vector<int>a,C,X,Y;
#ifdef SKY
void answer(vector<int>C,vector<int>X,vector<int>Y)
{
for(auto u:C)cout<<u<<" ";cout<<endl;
for(int i=0;i<X.size();i++)cout<<X[i]<<" "<<Y[i]<<endl;
}
#endif // SKY
void my_answer(vector<int>C,vector<int>X,vector<int>Y)
{
assert(X.size()<=q*2);
answer(C,X,Y);
}
struct haha
{
int child[2]={},tt=0;
}node[N];
void build(int u,int h)
{
if(h==0)
return;
node[u].child[0]=++dem;
node[u].child[1]=++dem;
build(node[u].child[0],h-1);
build(node[u].child[1],h-1);
}
ii DFS(int u)
{
if(node[u].child[0]==0)
{
ii res={u,node[u].tt};
node[u].tt^=1;
return res;
}
node[u].tt^=1;
return DFS(node[u].child[(node[u].tt^1)]);
}
void solve(int u)
{
int k=ceil(log2(lis[u].size()));
dem++;
C[u]=-dem;
int moc=dem;
root[u]=moc;
build(moc,k-1);
while(1)
{
ii cc=DFS(moc);
if(!flow_out[u].empty()&&cc==flow_out[u][0])
break;
//cout<<"cc\n";
flow_out[u].pb(cc);
}
for(auto cc:flow_out[u])
node[cc.fs].child[cc.sc]=moc;
int pos=dem;
while(!lis[u].empty())
{
ii cc=flow_out[u].back();
flow_out[u].pop_back();
int i=lis[u].back();
lis[u].pop_back();
if(i==q-1)
{
node[cc.fs].child[cc.sc]=0;
}else
{
node[cc.fs].child[cc.sc]=-a[i+1];
}
}
}
void create_circuit(int cc, vector<int> vec)
{
a=vec;
n=cc;
q=a.size();
// cout<<m<<" "<<n<<endl;
for(int i=0;i<q;i++)
lis[a[i]].pb(i);
// for(int i=1;i<=n;i++)cout<<lis[i].size()<<endl;
C.resize(n+1,0);
C[0]=a[0];
for(int i=1;i<=n;i++)
if(!lis[i].empty())
{
if(lis[i].size()==1)
{
if(lis[i].back()!=q-1)
C[i]=a[lis[i].back()+1];
continue;
}
solve(i);
}
for(int i=1;i<=dem;i++)
X.pb(-node[i].child[0]),Y.pb(-node[i].child[1]);
my_answer(C,X,Y);
}
#ifdef SKY
int main()
{
freopen("A.inp","r",stdin);
freopen("A.out","w",stdout);
ios::sync_with_stdio(0);
cin.tie(NULL);
cout.tie(NULL);
int m,n;
cin>>m>>n;
vector<int>a;
for(int i=1;i<=n;i++)
{
int u;
cin>>u;
a.pb(u);
}
create_circuit(m,a);
return 0;
}
#endif
컴파일 시 표준 에러 (stderr) 메시지
In file included from /usr/include/c++/10/cassert:44,
from /usr/include/x86_64-linux-gnu/c++/10/bits/stdc++.h:33,
from doll.cpp:1:
doll.cpp: In function 'void my_answer(std::vector<int>, std::vector<int>, std::vector<int>)':
doll.cpp:31:20: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
31 | assert(X.size()<=q*2);
| ~~~~~~~~^~~~~
doll.cpp: In function 'void solve(int)':
doll.cpp:80:9: warning: unused variable 'pos' [-Wunused-variable]
80 | int pos=dem;
| ^~~
# | 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... |