Submission #160802

# Submission time Handle Problem Language Result Execution time Memory
160802 2019-10-30T02:21:27 Z Leonardo_Paes Xylophone (JOI18_xylophone) C++17
0 / 100
3 ms 404 KB
#include <bits/stdc++.h>
#include "xylophone.h"
 
using namespace std;
 
const int maxn = 5e3+10;
 
int n, res[maxn], pos[maxn];
 
inline void find_1(){
    int ini=1, fim=n, meio, ans=-1;
 
    while(ini<=fim){
        meio = (ini+fim) >> 1;
        if(query(meio, n)>=(n-1)){
            ans = meio;
            ini = meio+1;
        }
        else{
            fim = meio-1;
        }
    }
 
    pos[1] = ans;
    res[ans] = 1;
}
 
inline void find_n(){
    int ini=pos[1]+1, fim=n, meio, ans=-1;
 
    while(ini<=fim){
        meio = (ini+fim) >> 1;
        if(query(pos[1], meio)>=(n-1)){
            ans = meio;
            fim = meio-1;
        }
        else{
            ini = meio+1;
        }
    }
 
    pos[n] = ans;
    res[ans] = n;
}
 
inline void solve_left(int j, int k){
    if(j<=1 or res[j-1]!=0) return;
 
    int i = j-1;
    int diff1 = query(i, j);
 
    if((res[k] + diff1) > n or pos[res[j] + diff1]!=0){
        res[i] = res[j] - diff1;
        pos[res[i]] = i;
    }
    else if((res[k] - diff1) < 1 or pos[res[j] - diff1]!=0){
        res[i] = res[j] + diff1;
        pos[res[i]] = i;
    }
    else{
        int diff2 = query(i, k);
 
        if(diff1 + abs(res[j]-res[k]) == diff2){
            if(res[k]<res[j]){
                res[i] = res[j] + diff1;
                pos[res[i]] = i;
            }
            else{
                res[i] = res[j] - diff1;
                pos[res[i]] = i;
            }
        }
        else{
            if(res[k]<res[j]){
                res[i] = res[j] - diff1;
                pos[res[i]] = i;
            }
            else{
                res[i] = res[j] + diff1;
                pos[res[i]] = i;
            }
        }
 
    }
    solve_left(i, j);
}
 
inline void solve_right(int j, int k){
    if(k>=n or res[k+1]!=0) return;
 
    int l = k+1;
    int diff1 = query(k, l);
 
    if((res[k] + diff1) > n or pos[res[k] + diff1]!=0){
        res[l] = res[k] - diff1;
        pos[res[l]] = l;
    }
    else if((res[k] - diff1) < 1 or pos[res[k] - diff1]!=0){
        res[l] = res[k] + diff1;
        pos[res[l]] = l;
    }
    else{
        int diff2 = query(j, l);
 
        if(diff1 + abs(res[j]-res[k]) == diff2){
            if(res[k]>res[j]){
                res[l] = res[k] + diff1;
                pos[res[l]] = l;
            }
            else{
                res[l] = res[k] - diff1;
                pos[res[l]] = l;
            }
        }
        else{
            if(res[k]>res[j]){
                res[l] = res[k] - diff1;
                pos[res[l]] = l;
            }
            else{
                res[l] = res[k] + diff1;
                pos[res[l]] = l;
            }
        }
 
    }
    solve_right(k, l);
}
 
void solve(int N){
    n = N;
    find_1();
    find_n();
 
    int diff;
 
    if(pos[1]+1 <= n and res[pos[1]+1] == 0){
        diff = query(pos[1], pos[1]+1);
        res[pos[1]+1] = 1 + diff;
        pos[1+diff] = pos[1]+1;
    }
 
    if(pos[1]-1 >= 1 and res[pos[1]-1] == 0){
        diff = query(pos[1]-1, pos[1]);
        res[pos[1]-1] = 1 + diff;
        pos[1+diff] = pos[1]-1;
    }
 
    if(pos[n]+1 <=n and res[pos[n]+1] == 0){
        diff = query(pos[n], pos[n]+1);
        res[pos[n]+1] = n - diff;
        pos[n-diff] = pos[n]+1;
    }
 
    if(pos[n]-1 >= 1 and res[pos[n]-1] == 0){
        diff = query(pos[n]-1, pos[n]);
        res[pos[n]-1] = n - diff;
        pos[n-diff] = pos[n] - 1;
    }
 
    solve_left(pos[1]-1, pos[1]);
    solve_left(pos[n]-1, pos[n]);
    solve_right(pos[n], pos[n]+1);
 
    for(int i=1; i<=n; i++){
        answer(i, res[i]);
    }
}
# Verdict Execution time Memory Grader output
1 Correct 2 ms 404 KB Output is correct
2 Correct 2 ms 248 KB Output is correct
3 Incorrect 3 ms 248 KB Wrong Answer [7]
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 404 KB Output is correct
2 Correct 2 ms 248 KB Output is correct
3 Incorrect 3 ms 248 KB Wrong Answer [7]
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 2 ms 404 KB Output is correct
2 Correct 2 ms 248 KB Output is correct
3 Incorrect 3 ms 248 KB Wrong Answer [7]
4 Halted 0 ms 0 KB -