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>
#include "xylophone.h"
#define ll int
using namespace std;
ll a[100005];
bool seen[100005];
ll calc(ll a, ll b, ll dis1, ll dis2)
{
if (a<b)
{
if (dis1==dis2 || dis2==b-a)
return a+dis1;
return a-dis1;
}
if (dis1==dis2 || dis2==a-b)
return a-dis1;
return a+dis1;
}
void solve1(ll L, ll n)
{
for (ll i=L-2; i>=1; i--)
{
ll val=query(i, i+1);
if (a[i+1]-val<0 || seen[a[i+1]-val])
a[i]=a[i+1]+val;
else if (a[i+1]+val>n || seen[a[i+1]+val])
a[i]=a[i+1]-val;
else
a[i]=calc(a[i+1], a[i+2], val, query(i, i+2));
seen[a[i]]=1;
}
}
void solve2(ll L, ll R, ll n)
{
for (ll i=L+2; i<R; i++)
{
ll val=query(i-1, i);
if (a[i-1]-val<0 || seen[a[i-1]-val])
a[i]=a[i-1]+val;
else if (a[i-1]+val>n || seen[a[i-1]+val])
a[i]=a[i-1]-val;
a[i]=calc(a[i-1], a[i-2], val, query(i-2, i));
seen[a[i]]=1;
}
}
void solve3(ll R, ll n)
{
for (ll i=R+2; i<=n; i++)
{
ll val=query(i-1, i);
if (a[i-1]-val<0 || seen[a[i-1]-val])
a[i]=a[i-1]+val;
else if (a[i-1]+val>n || seen[a[i-1]+val])
a[i]=a[i-1]-val;
a[i]=calc(a[i-1], a[i-2], val, query(i-2, i));
seen[a[i]]=1;
}
}
void solve(ll n)
{
// freopen("output.txt", "w", stdout);
srand((ll)time(0));
ll L=1, R=n;
ll lo=L, hi=R, val=query(lo, hi);
while (hi-lo>1)
{
ll mid=(hi+lo)/2;
if (query(L, mid)!=val)
lo=mid;
else hi=mid;
}
if (query(L, lo)!=val)
R=hi;
else R=lo;
lo=L, hi=R;
while (hi-lo>1)
{
ll mid=(hi+lo)/2;
if (query(mid, R)!=val)
hi=mid;
else lo=mid;
}
if (query(hi, R)!=val)
L=lo;
else R=hi;
a[L]=1; a[R]=n;
// cout << L << " " << R << "\n";
if (L>1) a[L-1]=a[L]+query(L-1, L);
a[L+1]=a[L]+query(L, L+1);
if (R<n) a[R+1]=a[R]-query(R, R+1);
ll order[3];
order[0]=0, order[1]=1, order[2]=2;
for (ll i=1; i<=10; i++)
{
ll l=abs(rand())%3, r=abs(rand())%3;
swap(order[l], order[r]);
}
for (ll i=0; i<3; i++)
{
ll t=order[i];
if (t==0)
solve1(L, n);
else if (t==1)
solve2(L, R, n);
else solve3(R, n);
}
// for (ll i=0; i<3; i++)
// cout << order[i] << " ";
// cout << "\n";
// for (ll i=1; i<=n; i++)
// cout << a[i] << " ";
// cout << "\n";
for (ll i=1; i<=n; i++)
answer(i, a[i]);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |