Submission #530273

#TimeUsernameProblemLanguageResultExecution timeMemory
530273Leo121Archery (IOI09_archery)C++14
82 / 100
76 ms3508 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, numero1, 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 + 1){ if(!ocupados[i]){ return i; } } } int mayor(int pos){ bool numero1 = 0, actual = 0; int unos = 1; bool primero, segundo; forn(i, 1, 2 * n){ if(i == 1){ primero = casillas[i - 1].primero; segundo = casillas[i - 1].segundo; if(primero == 1){ unos ++; } if(segundo == 1){ unos ++; } numero1 = casillas[i - 1].numero1; actual = casillas[i - 1].actual; } else{ if(casillas[i - 1].primero){ unos ++; } if(casillas[i - 1].segundo){ unos ++; } if(casillas[i - 1].actual){ actual = 1; } if(casillas[i - 1].numero1){ numero1 = 1; } } if(unos > 1){ casillas.pb({1, 0, 0, 0}); unos --; } else if(unos == 1){ if(actual){ casillas.pb({0, 0, 0, 1}); actual = 0; if(i >= n){ return (n - ((r - i) % n)); } } else{ casillas.pb({0, 0, 0, 0}); } } else{ casillas.pb({0, 0, 0, 0}); } } return 1; } int ronda(int pos){ casillas.clear(); forn(i, 1, pos - 1){ casillas.pb({(posiciones[i * 2] < posiciones[1]) ? 1 : 0, (posiciones[i * 2 + 1] < posiciones[1]) ? 1 : 0, (posiciones[i * 2] == 1 || posiciones[i * 2 + 1] == 1) ? 1 : 0, 0}); } casillas.pb({0, (posiciones[pos * 2] < posiciones[1]) ? 1 : 0, (posiciones[pos * 2] == 1) ? 1 : 0, 1}); forn(i, pos + 1, n){ casillas.pb({(posiciones[i * 2 - 1] < posiciones[1]) ? 1 : 0, (posiciones[i * 2] < posiciones[1]) ? 1 : 0, (posiciones[i * 2 - 1] == 1 || posiciones[i * 2] == 1) ? 1 : 0, 0}); } int aux; if(posiciones[1] >= n + 2){ aux = menor(pos); } else{ aux = mayor(pos); } return aux; } 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; } } li = posres; 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{ 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; } cout << bs(); return 0; }

Compilation message (stderr)

archery.cpp: In function 'int mayor(int)':
archery.cpp:89:10: warning: variable 'numero1' set but not used [-Wunused-but-set-variable]
   89 |     bool numero1 = 0, actual = 0;
      |          ^~~~~~~
archery.cpp: In function 'int ronda(int)':
archery.cpp:142:58: warning: narrowing conversion of '((posiciones[(i * 2)] < posiciones[1]) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  142 |         casillas.pb({(posiciones[i * 2] < posiciones[1]) ? 1 : 0, (posiciones[i * 2 + 1] < posiciones[1]) ? 1 : 0, (posiciones[i * 2] == 1 || posiciones[i * 2 + 1] == 1) ? 1 : 0, 0});
      |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:142:107: warning: narrowing conversion of '((posiciones[((i * 2) + 1)] < posiciones[1]) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  142 |         casillas.pb({(posiciones[i * 2] < posiciones[1]) ? 1 : 0, (posiciones[i * 2 + 1] < posiciones[1]) ? 1 : 0, (posiciones[i * 2] == 1 || posiciones[i * 2 + 1] == 1) ? 1 : 0, 0});
      |                                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:142:171: warning: narrowing conversion of '(((posiciones[(i * 2)] == 1) || (posiciones[((i * 2) + 1)] == 1)) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  142 |         casillas.pb({(posiciones[i * 2] < posiciones[1]) ? 1 : 0, (posiciones[i * 2 + 1] < posiciones[1]) ? 1 : 0, (posiciones[i * 2] == 1 || posiciones[i * 2 + 1] == 1) ? 1 : 0, 0});
      |                                                                                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:144:59: warning: narrowing conversion of '((posiciones[(pos * 2)] < posiciones[1]) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  144 |     casillas.pb({0, (posiciones[pos * 2] < posiciones[1]) ? 1 : 0, (posiciones[pos * 2] == 1) ? 1 : 0, 1});
      |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:144:95: warning: narrowing conversion of '((posiciones[(pos * 2)] == 1) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  144 |     casillas.pb({0, (posiciones[pos * 2] < posiciones[1]) ? 1 : 0, (posiciones[pos * 2] == 1) ? 1 : 0, 1});
      |                                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:146:62: warning: narrowing conversion of '((posiciones[((i * 2) - 1)] < posiciones[1]) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  146 |         casillas.pb({(posiciones[i * 2 - 1] < posiciones[1]) ? 1 : 0, (posiciones[i * 2] < posiciones[1]) ? 1 : 0, (posiciones[i * 2 - 1] == 1 || posiciones[i * 2] == 1) ? 1 : 0, 0});
      |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:146:107: warning: narrowing conversion of '((posiciones[(i * 2)] < posiciones[1]) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  146 |         casillas.pb({(posiciones[i * 2 - 1] < posiciones[1]) ? 1 : 0, (posiciones[i * 2] < posiciones[1]) ? 1 : 0, (posiciones[i * 2 - 1] == 1 || posiciones[i * 2] == 1) ? 1 : 0, 0});
      |                                                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:146:171: warning: narrowing conversion of '(((posiciones[((i * 2) - 1)] == 1) || (posiciones[(i * 2)] == 1)) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  146 |         casillas.pb({(posiciones[i * 2 - 1] < posiciones[1]) ? 1 : 0, (posiciones[i * 2] < posiciones[1]) ? 1 : 0, (posiciones[i * 2 - 1] == 1 || posiciones[i * 2] == 1) ? 1 : 0, 0});
      |                                                                                                                    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp: In function 'int menor(int)':
archery.cpp:87:1: warning: control reaches end of non-void function [-Wreturn-type]
   87 | }
      | ^
archery.cpp: In function 'int bs()':
archery.cpp:201:6: warning: 'posres' may be used uninitialized in this function [-Wmaybe-uninitialized]
  201 |   li = posres + 1;
      |   ~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...