Submission #530283

#TimeUsernameProblemLanguageResultExecution timeMemory
530283Leo121Archery (IOI09_archery)C++14
80 / 100
80 ms2024 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(i == 1){ if(casillas[i - 1].primero == 1){ unos ++; } if(casillas[i - 1].segundo == 1){ unos ++; } 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(unos > 1){ casillas.pb({1, 0, 0}); unos --; } else if(unos == 1){ if(actual){ casillas.pb({0, 0, 1}); actual = 0; if(i >= n - 2){ return (n - ((r - i) % n)); } } else{ casillas.pb({0, 0, 0}); } } else{ casillas.pb({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, 0}); } casillas.pb({0, (posiciones[pos * 2] < posiciones[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, 0}); } int aux; 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; 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 ronda(int)':
archery.cpp:136:58: warning: narrowing conversion of '((posiciones[(i * 2)] < posiciones[1]) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  136 |         casillas.pb({(posiciones[i * 2] < posiciones[1]) ? 1 : 0, (posiciones[i * 2 + 1] < posiciones[1]) ? 1 : 0, 0});
      |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:136:107: warning: narrowing conversion of '((posiciones[((i * 2) + 1)] < posiciones[1]) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  136 |         casillas.pb({(posiciones[i * 2] < posiciones[1]) ? 1 : 0, (posiciones[i * 2 + 1] < posiciones[1]) ? 1 : 0, 0});
      |                                                                   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:138:59: warning: narrowing conversion of '((posiciones[(pos * 2)] < posiciones[1]) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  138 |     casillas.pb({0, (posiciones[pos * 2] < posiciones[1]) ? 1 : 0, 1});
      |                     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:140:62: warning: narrowing conversion of '((posiciones[((i * 2) - 1)] < posiciones[1]) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  140 |         casillas.pb({(posiciones[i * 2 - 1] < posiciones[1]) ? 1 : 0, (posiciones[i * 2] < posiciones[1]) ? 1 : 0, 0});
      |                      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:140:107: warning: narrowing conversion of '((posiciones[(i * 2)] < posiciones[1]) ? 1 : 0)' from 'int' to 'bool' [-Wnarrowing]
  140 |         casillas.pb({(posiciones[i * 2 - 1] < posiciones[1]) ? 1 : 0, (posiciones[i * 2] < posiciones[1]) ? 1 : 0, 0});
      |                                                                       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~
archery.cpp:142:9: warning: unused variable 'aux' [-Wunused-variable]
  142 |     int aux;
      |         ^~~
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...