Submission #530767

#TimeUsernameProblemLanguageResultExecution timeMemory
530767Leo121Archery (IOI09_archery)C++14
80 / 100
77 ms2068 KiB
#include <bits/stdc++.h> #include <iostream> #include <limits.h> #include <stdio.h> #include <algorithm> #include <math.h> #include <string.h> #include <string> #include <utility> #include <vector> #include <queue> #include <set> #include <unordered_set> #include <map> #define pb push_back #define bg(v) v.begin() #define all(v) bg(v), v.end() #define mp make_pair #define fi first #define se second #define forn(i, a, b) for(int i=int(a);i<=int(b);++i) #define fora(i, a, b) for(int i=int(a);i>=int(b);--i) #define lb lower_bound #define ub upper_bound using namespace std; typedef long long ll; typedef unsigned long long ull; typedef unsigned int ui; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi; typedef vector<ll> vll; typedef vector<pii> vpii; const int mod = 1e9 + 7; const int movi[4] = {1, -1, 0, 0}; const int movj[4] = {0, 0, -1, 1}; const int lim = 1e5; struct ura{ bool primero, segundo, actual; }; int n, r, res, minimo; int posiciones[2 * lim + 2]; bool ocupados[lim + 2]; vector<ura> casillas; int menor(int pos){ forn(i, 1, n){ ocupados[i] = 0; } int llevados = 0; fora(i, n, 2){ if(!casillas[i - 1].actual && !casillas[i - 1].primero){ llevados ++; } if(!casillas[i - 1].segundo){ llevados ++; } if(llevados){ ocupados[i] = 1; llevados --; } } if(!casillas[0].actual && !casillas[0].primero){ llevados ++; } if(!casillas[0].segundo){ llevados ++; } fora(i, n, 2){ if(!llevados){ break; } if(!ocupados[i]){ ocupados[i] = 1; llevados --; } } fora(i, pos, 2){ if(!ocupados[i]){ return i; } } fora(i, n, pos){ if(!ocupados[i]){ return i; } } } int mayor(int pos){ bool actual = 0; int unos = 0; forn(i, 1, 2 * n){ if(casillas[i - 1].primero){ unos ++; } if(casillas[i - 1].segundo){ unos ++; } if(casillas[i - 1].actual){ actual = 1; } if(unos > 1){ if(i <= n){ casillas.pb({(bool) 1, (bool) 0, (bool) 0}); } unos --; } else if(unos == 1){ if(actual){ if(i <= n){ casillas.pb({(bool) 0, (bool) 0, (bool) 1}); } actual = 0; if(i >= n){ return (n - ((r - i) % n)); } } else{ if(i <= n){ casillas.pb({(bool) 0, (bool) 0, (bool) 0}); } } } else{ if(i <= n){ casillas.pb({(bool) 0, (bool) 0, (bool) 0}); } } } return 1; } int ronda(int pos){ casillas.clear(); forn(i, 1, pos - 1){ casillas.pb({(posiciones[i * 2] < posiciones[1]) ? (bool) 1 : (bool) 0, (posiciones[i * 2 + 1] < posiciones[1]) ? (bool) 1 : (bool) 0, (bool) 0}); } casillas.pb({(bool) 0, (posiciones[pos * 2] < posiciones[1]) ? (bool) 1 : (bool) 0, (bool) 1}); forn(i, pos + 1, n){ casillas.pb({(posiciones[i * 2 - 1] < posiciones[1]) ? (bool) 1 : (bool) 0, (posiciones[i * 2] < posiciones[1]) ? (bool) 1 : (bool) 0, (bool) 0}); } return (posiciones[1] < n + 2) ? mayor(pos) : menor(pos); } int bs(){ int li = 1, ls = n, mitad, auxiliar, res, posres; if(posiciones[1] < n + 2){ posres = n; res = ronda(n); while(li <= ls){ mitad = (li + ls) / 2; auxiliar = ronda(mitad); if(auxiliar > res){ li = mitad + 1; } else{ ls = mitad - 1; res = auxiliar; posres = mitad; } } res = ronda(posres); li = posres + 1; ls = n; while(li <= ls){ mitad = (li + ls) / 2; auxiliar = ronda(mitad); if(auxiliar == res){ posres = mitad; li = mitad + 1; } else{ ls = mitad - 1; } } } else{ posres = 1; while(li <= ls){ mitad = (li + ls) / 2; auxiliar = ronda(mitad); if(auxiliar > mitad){ li = mitad + 1; } else{ posres = mitad; ls = mitad - 1; } } res = ronda(posres); li = posres + 1; ls = n; while(li <= ls){ mitad = (li + ls) / 2; auxiliar = ronda(mitad); if(auxiliar == res){ posres = mitad; li = mitad + 1; } else{ ls = mitad - 1; } } } return posres; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cin >> n >> r; minimo = n; forn(i, 1, 2 * n){ cin >> posiciones[i]; } if(posiciones[1] == 1){ cout << n; return 0; } if(n == 1){ cout << 1; return 0; } cout << bs(); return 0; }

Compilation message (stderr)

archery.cpp: In function 'int menor(int)':
archery.cpp:87:1: warning: control reaches end of non-void function [-Wreturn-type]
   87 | }
      | ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...