# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1088701 | 2024-09-14T20:11:45 Z | juansigler | Infinite Race (EGOI24_infiniterace2) | C++14 | 0 ms | 0 KB |
#include <limits.h> #include <math.h> #include <stdio.h> #include <algorithm> #include <complex> #include <iomanip> #include <iostream> #include <map> #include <numeric> #include <queue> #include <set> #include <sstream> #include <stack> #include <string> #include <unordered_map> #include <unordered_set> #include <utility> #include <vector> using namespace std; typedef long long int lld; typedef long double llf; typedef pair<int, int> pii; int minLaps(const vector<int> &overtakes) { int n = overtakes.size(); int ans = 0; bool iAmFirst = false; for (auto overtake : overtakes) { if (overtake == 1) { // Aka alcanzo al oponente ans += (iAmFirst ? 1 : 0); iAmFirst = true; } else { // El oponente alcanzo a Aka iAmFirst = false; } } return ans; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, m; cin >> n; cin >> m; set<int> antes, despues; for (int i = 1; i < n; ++i) { despues.insert(i); } int ans = 0; for (int i = 0; i < m; ++i) { int x; cin >> x; int p = abs(x), sign = (x < 0 ? -1 : 1); if (despues.count(p) > 0) { if (sign > 0) { // Alcanzo a alguien que está despues de mi despues.erase(p); antes.insert(p); } else { // Alguien que está después de mí me alcanza // No-op } } else { if (sign > 0) { // Alcanzo alguien que estaba atras de mi // Debo dar la vuelta para eso, además todos los que // Estaban antes, se pasan a estar después despues.merge(antes); // mezclo todo despues.erase(p); ans++; antes.insert(p); } else { // Alguien que está detrás de mí me alcanza antes.erase(p); despues.insert(p); } } } cout << ans << endl; return 0; }