# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1170205 | Zbyszek99 | Two Antennas (JOI19_antennas) | C++20 | 0 ms | 0 KiB |
#include "minerals.h"
#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define ff first
#define ss second
#define vi vector<int>
#define vl vector<long long>
#define pii pair<int,int>
#define pll pair<long long, long long>
#define pb push_back
#define rep(i, b) for(int i = 0; i < (b); ++i)
#define rep2(i,a,b) for(int i = a; i <= (b); ++i)
#define rep3(i,a,b,c) for(int i = a; i <= (b); i+=c)
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define siz(x) (int)(x).size()
#define forall(it,x) for(auto& it:(x))
using namespace std;
//mt19937 mt;void random(){mt.seed(chrono::time_point_cast<chrono::milliseconds>(chrono::high_resolution_clock::now()).time_since_epoch().count());}
//ll rand(ll a, ll b) {return a + (mt() % (b-a+1));}
const int INF = 1e9+50;
const ll INF_L = 1e18+40;
const ll MOD = 1e9+7;
bool is_on[86001];
map<int,int> rel_poz;
int ask(int x)
{
//cout << x << " x\n";
if(is_on[x]) is_on[x] = 0;
else is_on[x] = 1;
return Query(rel_poz[x]);
}
pii seg[86001];
int cur_pref[86001];
void Solve(int n)
{
int cur_dif = 0;
int cur = 1;
int cur2 = n+1;
rep2(i,1,n*2)
{
int nd = Query(i);
if(nd == cur_dif)
{
rel_poz[cur2] = i;
cur2++;
}
else
{
rel_poz[cur] = i;
cur++;
cur_dif = nd;
}
}
rep2(i,1,n*2) Query(i);
rep2(i,1,n)
{
seg[i] = {n+1,2*n};
}
int ans_count = 0;
rep2(i,n+1,(3*n+1)/2)
{
cur_dif = ask(i);
}
vector<pii> prefs = {{n+1,n*2}};
rep2(i,1,n)
{
cur_pref[i] = 0;
}
while(ans_count != n)
{
ans_count = 0;
rep2(i,1,n)
{
if(seg[i].ff != seg[i].ss)
{
int new_dif = ask(i);
int mid = (prefs[cur_pref[i]].ff + prefs[cur_pref[i]].ss)/2;
if(is_on[i])
{
if(new_dif > cur_dif)
{
seg[i].ff = mid+1;
}
else
{
seg[i].ss = mid;
}
}
else
{
if(new_dif < cur_dif)
{
seg[i].ff = mid+1;
}
else
{
seg[i].ss = mid;
}
}
// ask(i);
}
else
{
ans_count++;
}
}
vector<pii> new_pref;
forall(it,prefs)
{
if(it.ff == it.ss) continue;
int mid = (it.ff+it.ss)/2;
rep2(i,(it.ff+mid)/2+1,mid)
{
cur_dif = ask(i);
}
rep2(i,mid+1,(mid+1+it.ss)/2)
{
cur_dif = ask(i);
}
new_pref.pb({it.ff,mid});
new_pref.pb({mid+1,it.ss});
}
prefs = new_pref;
vector<pii> vsort;
rep2(i,1,n)
{
if(seg[i].ff != seg[i].ss)
{
vsort.pb({seg[i].ff,i});
}
}
sort(all(vsort));
int cur_p = 0;
forall(it,vsort)
{
while(prefs[cur_p].ff != seg[it.ss].ff)
{
cur_p++;
}
cur_pref[it.ss] = cur_p;
}
}
rep2(i,1,n)
{
// cerr << rel_poz[i] << " " << rel_poz[seg[i].ff] << " seg\n";
Answer(rel_poz[i],rel_poz[seg[i].ff]);
}
}