Submission #1044216

#TimeUsernameProblemLanguageResultExecution timeMemory
1044216TsovakNaval battle (CEOI24_battle)C++17
76 / 100
475 ms44816 KiB
// -------------------- Includes -------------------- // #define _CRT_SECURE_NO_WARNINGS #define _USE_MATH_DEFINES #include <iostream> #include <iomanip> #include <cstdio> #include <stdio.h> #include <cstdlib> #include <stdlib.h> #include <array> #include <string> #include <cstring> #include <algorithm> #include <cmath> #include <math.h> #include <set> #include <map> #include <unordered_set> #include <unordered_map> #include <vector> #include <stack> #include <queue> #include <deque> #include <bitset> #include <list> #include <iterator> #include <numeric> #include <complex> #include <tuple> #include <utility> #include <cassert> #include <assert.h> #include <climits> #include <limits.h> #include <ctime> #include <time.h> #include <random> #include <chrono> #include <fstream> using namespace std; // -------------------- Typedefs -------------------- // typedef long long ll; typedef unsigned long long ull; typedef double db; typedef long double ld; // -------------------- Defines -------------------- // #define pr pair #define mpr make_pair #define ff first #define ss second #define mset multiset #define mmap multimap #define uset unordered_set #define umap unordered_map #define umset unordered_multiset #define ummap unordered_multimap #define pqueue priority_queue #define sz(x) (int((x).size())) #define len(x) (int((x).length())) #define all(x) (x).begin(), (x).end() #define clr(x) (x).clear() #define ft front #define bk back #define pf push_front #define pb push_back #define popf pop_front #define popb pop_back #define lb lower_bound #define ub upper_bound #define bs binary_search // -------------------- Constants -------------------- // const int MAX = int(1e9 + 5); const ll MAXL = ll(1e18 + 5); const ll MOD = ll(1e9 + 7); const ll MOD2 = ll(998244353); // -------------------- Functions -------------------- // void fastio() { ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); return; } void precision(int x) { cout << fixed << setprecision(x); return; } ll gcd0(ll a, ll b) { while (b) { a %= b; swap(a, b); } return a; } ll lcm0(ll a, ll b) { return a / gcd0(a, b) * b; } bool is_prime(ll a) { if (a == 1) return false; for (ll i = 2; i * i <= a; i++) if (a % i == 0) return false; return true; } bool is_square(ll a) { ll b = ll(sqrtl(ld(a))); return (b * b == a); } bool is_cube(ll a) { ll b = ll(cbrtl(ld(a))); return (b * b * b == a); } int digit_sum(ll a) { int sum = 0; while (a) { sum += int(a % 10); a /= 10; } return sum; } ll binpow(ll a, int b) { ll ans = 1; while (b) { if (b & 1) ans *= a; b >>= 1; a *= a; } return ans; } ll binpow_mod(ll a, ll b, ll mod) { ll ans = 1; while (b) { if (b & 1) ans = (ans * a) % mod; b >>= 1; a = (a * a) % mod; } return ans; } ll factorial(int a) { ll ans = 1; for (int i = 2; i <= a; i++) ans *= ll(i); return ans; } ll factorial_mod(int a, ll mod) { ll ans = 1; for (int i = 2; i <= a; i++) ans = (ans * ll(i)) % mod; return ans; } // -------------------- Solution -------------------- // const pr<int, pr<int, int>> null = mpr(-1, mpr(-1, -1)); struct ship { int x, y; char d; }; const int N = 200005; ship a[N]; bool used[N]; int n; vector<pr<pr<int, pr<int, int>>, pr<int, int>>> v; vector<pr<int, int>> vv; pr<int, pr<int, int>> col(ship x, ship y) { if (x.d == y.d) return null; if (x.x == y.x) { if (x.d == 'E' || x.d == 'W' || y.d == 'E' || y.d == 'W') return null; if (x.y > y.y) swap(x, y); if (x.d == 'S' && y.d == 'N') return mpr((y.y - x.y) / 2, mpr(x.x, (x.y + y.y) / 2)); return null; } if (x.y == y.y) { if (x.d == 'N' || x.d == 'S' || y.d == 'N' || y.d == 'S') return null; if (x.x > y.x) swap(x, y); if (x.d == 'E' && y.d == 'W') return mpr((y.x - x.x) / 2, mpr((x.x + y.x) / 2, x.y)); return null; } if (x.x - x.y == y.x - y.y) { if (x.x > y.x) swap(x, y); if (x.d == 'E' && y.d == 'N') return mpr(y.x - x.x, mpr(y.x, x.y)); if (x.d == 'S' && y.d == 'W') return mpr(y.x - x.x, mpr(x.x, y.y)); return null; } if (x.x + x.y == y.x + y.y) { if (x.x > y.x) swap(x, y); if (x.d == 'N' && y.d == 'W') return mpr(y.x - x.x, mpr(x.x, y.y)); if (x.d == 'E' && y.d == 'S') return mpr(y.x - x.x, mpr(y.x, x.y)); return null; } return null; } vector<pr<int, int>> vb, vc; void solve() { int i, j; cin >> n; for (i = 1; i <= n; i++) cin >> a[i].x >> a[i].y >> a[i].d; if (n <= 5000) { pr<int, pr<int, int>> e; for (i = 1; i < n; i++) { for (j = i + 1; j <= n; j++) { e = col(a[i], a[j]); if (e == null) continue; v.pb(mpr(e, mpr(i, j))); } } sort(all(v)); int ind = 0; while (ind < sz(v)) { clr(vv); e = v[ind].ff; vv.pb(v[ind].ss); for (i = ind + 1; i < sz(v); i++) { if (v[i].ff != e) break; if (used[v[i].ss.ff] || used[v[i].ss.ss]) continue; vv.pb(v[i].ss); } for (i = 0; i < sz(vv); i++) used[vv[i].ff] = used[vv[i].ss] = true; while (i < sz(v) && (used[v[i].ss.ff] || used[v[i].ss.ss])) i++; ind = i; } for (i = 1; i <= n; i++) if (!used[i]) cout << i << "\n"; return; } for (i = 1; i <= n; i++) vb.pb(mpr(a[i].x + a[i].y, i)); sort(all(vb)); int ind = 0; stack<int> st; while (ind < sz(vb)) { clr(vc); for (i = ind; i < sz(vb); i++) { if (vb[i].ff != vb[ind].ff) break; vc.pb(mpr(a[vb[i].ss].x, vb[i].ss)); } ind = i; sort(all(vc)); for (i = 0; i < sz(vc); i++) { if (a[vc[i].ss].d == 'S') { if (!st.empty() && a[st.top()].d == 'E') { used[vc[i].ss] = used[st.top()] = true; st.pop(); } else st.push(vc[i].ss); } else st.push(vc[i].ss); } while (!st.empty()) st.pop(); } for (i = 1; i <= n; i++) if (!used[i]) cout << i << "\n"; return; } void precalc() { return; } int main() { fastio(); precalc(); int tests = 1, tc; //cin >> tests; for (tc = 1; tc <= tests; tc++) { solve(); } return 0; } /* # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...