Submission #467969

#TimeUsernameProblemLanguageResultExecution timeMemory
467969stefantagaXylophone (JOI18_xylophone)C++14
100 / 100
263 ms580 KiB
#include <cstdio>
#include <cstdlib>
#include "xylophone.h"
#include <bits/stdc++.h>
int doi[10005],trei[10005],v[10005],fr[10005],ok,val1;
int max1(int a,int b)
{
    if (a>b)
    {
        return a;
    }
    return b;
}
int min1(int a,int b)
{
    if (a<b)
    {
        return a;
    }
    return b;
}
int valoare(int a,int b,int c)
{
    int maxim=max1(a,max1(b,c));
    int minim=min1(a,min1(b,c));
    return maxim-minim;
}
void solve(int n) {
    int i,j;
    for (i=1;i<=n-1;i++)
    {
        doi[i]=query(i,i+1);
    }
    for (i=1;i<=n-2;i++)
    {
        trei[i]=query(i,i+2);
    }
    for (i=2;i<=n;i++)
    {
        /// presupun ca pe pozitia i am N
        for (j=1;j<=n;j++)
        {
            v[j]=0;
            fr[j]=0;
        }
        v[i]=n;
        v[i-1]=n-doi[i-1];
        ok=1;
        for (j=i-2;j>=1;j--)
        {
            if (v[j+1]-doi[j]>=1)
            {
                val1=v[j+1]-doi[j];
                if (valoare(val1,v[j+1],v[j+2])==trei[j])
                {
                    v[j]=val1;
                    continue;
                }
            }
            if (v[j+1]+doi[j]<=n)
            {
                val1=v[j+1]+doi[j];
                if (valoare(val1,v[j+1],v[j+2])==trei[j])
                {
                    v[j]=val1;
                    continue;
                }
            }
            ok=0;
            break;
        }
        if (ok==0)
        {
            continue;
        }
        if (i<n)
        {
            v[i+1]=n-doi[i];
            for (j=i+2;j<=n;j++)
            {
                if (v[j-1]-doi[j-1]>=1)
                {
                    val1=v[j-1]-doi[j-1];
                    if (valoare(val1,v[j-1],v[j-2])==trei[j-2])
                    {
                        v[j]=val1;
                        continue;
                    }
                }
                if (v[j-1]+doi[j-1]<=n)
                {
                    val1=v[j-1]+doi[j-1];
                    if (valoare(val1,v[j-1],v[j-2])==trei[j-2])
                    {
                        v[j]=val1;
                        continue;
                    }
                }
                ok=0;
                break;
            }
        }
        if (ok==0)
            {
                continue;
            }
            int poz=n+1;
            for (j=1;j<=n;j++)
            {
                if (v[j]==1)
                {
                    poz=j;
                }
                if (fr[v[j]]!=0)
                {
                    ok=0;
                    break;
                }
                fr[v[j]]=1;
            }
            if (ok==0)
            {
                continue;
            }
            if (poz>i)
            {
                continue;
            }
            for (j=1;j<=n;j++)
            {
                answer(j,v[j]);
            }
            break;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...