제출 #1160605

#제출 시각아이디문제언어결과실행 시간메모리
1160605hainam2k9Xylophone (JOI18_xylophone)C++20
100 / 100
60 ms460 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, vis[1]=1;
    bool ok=1;
    if(pos!=1) a[pos-1]=seg2[pos-1]+1, ok&=!vis[a[pos-1]], vis[a[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, ok&=!vis[a[pos+1]], vis[a[pos+1]]=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-2]==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
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...