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 <bits/stdc++.h>
#ifndef SKY
#include "messy.h"
#endif // SKY
#include <cstdlib>
using namespace std;
#define ll long long
#define pb push_back
#define N 155
#define ii pair<int,int>
#define fs first
#define sc second
int n,LOG,ask[N];
//hàm thư viện
#ifdef SKY
int per[N];
map<string,int>mp;
void compile_set()
{
}
void add_element(string s)
{
string kq=s;
for(int i=0;i<n;i++)
kq[i]=s[per[i]];
mp[kq]=1;
}
bool check_element(string s)
{
return(mp[s]==1);
}
#endif // SKY
vector<ii>lis[N];
vector<vector<int>>pos[N];
void add()
{
string s="";
for(int i=0;i<n;i++)
s.pb((char)(ask[i]+'0'));
//cout<<s<<endl;
add_element(s);
}
bool check()
{
string s="";
for(int i=0;i<n;i++)
s.pb((char)(ask[i]+'0'));
return check_element(s);
}
vector<int> restore_permutation(int cc, int w, int r)
{
n=cc;
#ifdef SKY
for(int i=0;i<n;i++)
cin>>per[i];
#endif // SKY
LOG=ceil(log2(n));
lis[1].pb({0,n-1});
for(int i=1;i<=LOG;i++)
for(auto cc:lis[i])
if(cc.fs==cc.sc)
{
lis[i+1].pb(cc);
}else
{
int mid=(cc.fs+cc.sc)/2;
lis[i+1].pb({cc.fs,mid});
lis[i+1].pb({mid+1,cc.sc});
// cout<<"cc";
}
for(int i=1;i<=LOG;i++)
for(auto cc:lis[i])
if(cc.fs<cc.sc)
{
memset(ask,0,sizeof(ask));
for(auto u:lis[i])
if(u!=cc)
{
for(int j=u.fs;j<=u.sc;j++)
ask[j]=1;
}
int l=cc.fs,r=cc.sc,mid=(l+r)/2;
for(int j=l;j<=mid;j++)
{
ask[j]=1;
//cout<<l<<" "<<r<<" "<<i<<endl;
add();
ask[j]=0;
}
}
compile_set();
pos[1].pb({});
for(int i=0;i<n;i++)
pos[1][0].pb(i);
for(int i=1;i<=LOG;i++)
for(int j=0;j<lis[i].size();j++)
if(lis[i][j].fs==lis[i][j].sc)
{
pos[i+1].pb(pos[i][j]);
}else
{
int l=lis[i][j].fs,r=lis[i][j].sc,mid=(l+r)/2;
memset(ask,0,sizeof(ask));
for(int k=0;k<lis[i].size();k++)
if(k!=j)
{
for(auto vt:pos[i][k])
ask[vt]=1;
}
vector<int>L,R;
for(auto vt:pos[i][j])
{
ask[vt]=1;
if(check())
L.pb(vt);
else R.pb(vt);
ask[vt]=0;
}
// cout<<l<<" "<<r<<" "<<L.size()<<" "<<R.size()<<endl;
pos[i+1].pb(L);
pos[i+1].pb(R);
}
// for(int i=0;i<n;i++)cout<<lis[LOG+1][i].fs<<endl;//" "<<pos[LOG+1][i].back()<<endl;
// return {1};
vector<int>kq(n);
for(int i=0;i<n;i++)
kq[pos[LOG+1][i].back()]=lis[LOG+1][i].fs;
return kq;
}
#ifdef SKY
int main()
{
freopen("A.inp","r",stdin);
freopen("A.out","w",stdout);
int n;
cin>>n;
vector<int>kq=restore_permutation(n,0,0);
for(int i=0;i<n;i++)cout<<kq[i]<<" ";
}
#endif
Compilation message (stderr)
messy.cpp: In function 'std::vector<int> restore_permutation(int, int, int)':
messy.cpp:109:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
109 | for(int j=0;j<lis[i].size();j++)
| ~^~~~~~~~~~~~~~
messy.cpp:117:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
117 | for(int k=0;k<lis[i].size();k++)
| ~^~~~~~~~~~~~~~
messy.cpp:115:51: warning: unused variable 'mid' [-Wunused-variable]
115 | int l=lis[i][j].fs,r=lis[i][j].sc,mid=(l+r)/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... |