# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1160579 | hainam2k9 | Xylophone (JOI18_xylophone) | C++20 | 0 ms | 0 KiB |
#include <xylophone.h>
#include <bits/stdc++.h>
#define tt cin.tie(0), cout.tie(0), ios_base::sync_with_stdio(0)
#define fo freopen((NAME+".INP").c_str(), "r", stdin), freopen((NAME+".OUT").c_str(), "w", stdout)
#define ll long long
#define ull unsigned long long
#define i128 __int128
#define db long double
#define sz(a) ((int)(a).size())
#define pb emplace_back
#define pf emplace_front
#define pob pop_back
#define pof pop_front
#define lb lower_bound
#define ub upper_bound
#define fi first
#define se second
#define ins emplace
#define mp make_pair
using namespace std;
const int MOD = 1e9+7, MAXN = 1e5+5;
const string NAME = "";
int seg2[5005],seg3[5005],a[5005];
bool vis[5005];
//int num[5005];
//int query(int l, int r){
// int x;
// cout << l << " " << r << endl;
// cin >> x;
// return x;
//}
//void answer(int pos, int x){
// num[pos]=x;
//}
bool check(int n, int pos){
memset(vis,0,sizeof(vis));
a[pos]=1;
bool ok=1;
if(pos!=1) a[pos-1]=seg2[pos-1]+1;
for(int i = pos-2; i>0&&ok; --i){
if(seg3[i]==seg2[i]){
if(a[i+1]<a[i+2]) a[i]=a[i+1]+seg2[i], ok&=a[i]>a[i+2];
else a[i]=a[i+1]-seg2[i], ok&=a[i]<a[i+2];
}else if(seg3[i]==seg2[i+1]){
if(a[i+1]<a[i+2]) a[i]=a[i+1]+seg2[i], ok&=a[i]>a[i+1]&&a[i]<a[i+2];
else a[i]=a[i+1]-seg2[i], ok&=a[i]<a[i+1]&&a[i]>a[i+2];
}else{
if(a[i+1]<a[i+2]) a[i]=a[i+1]-seg2[i];
else a[i]=a[i+1]-seg2[i];
}
ok&=a[i]>0&&a[i]<=n;
if(a[i]>0&&a[i]<=n) ok&=!vis[a[i]], vis[a[i]]=1;
}
a[pos+1]=seg2[pos]+1;
for(int i = pos+2; i<=n&&ok; ++i){
if(seg3[i-2]==seg2[i-2]){
if(a[i-2]<a[i-1]) a[i]=a[i-1]-seg2[i-1], ok&=a[i]>a[i-2]&&a[i]<a[i-1];
else a[i]=a[i-1]+seg2[i-1], ok&=a[i]<a[i-2]&&a[i]>a[i-1];
}else if(seg3[i]==seg2[i-1]){
if(a[i-2]<a[i-1]) a[i]=a[i-1]-seg2[i-1], ok&=a[i]<a[i-2];
else a[i]=a[i-1]+seg2[i-1], ok&=a[i]>a[i-2];
}else{
if(a[i-2]<a[i-1]) a[i]=a[i-1]+seg2[i-1];
else a[i]=a[i-1]-seg2[i-1];
}
ok&=a[i]>0&&a[i]<=n;
if(a[i]>0&&a[i]<=n) ok&=!vis[a[i]], vis[a[i]]=1;
}
return ok;
}
void solve(int n){
for(int i = 1; i<n; ++i){
seg2[i]=query(i,i+1);
if(i<n-1) seg3[i]=query(i,i+2);
}
if(check(n,1)){
for(int i = 1; i<=n; ++i)
answer(i,a[i]);
return;
}
for(int i = 1; i<n-1; ++i)
if((seg3[i]==seg2[i]||seg3[i]==seg2[i+1])&&check(n,i+1)){
for(int i = 1; i<=n; ++i)
answer(i,a[i]);
return;
}
}
//int main()
//{
// tt;
// if(fopen((NAME + ".INP").c_str(), "r")) fo;
// solve(5);
// for(int i = 1; i<=5; ++i)
// cout << num[i] << " ";
//}
////1
////4
////4
////4
////2
////2
////1