Submission #987487

#TimeUsernameProblemLanguageResultExecution timeMemory
987487Essa2006Fish (IOI08_fish)C++17
100 / 100
475 ms49812 KiB
#include<bits/stdc++.h> using namespace std; #define ll long long #define endl '\n' #define FF first #define SS second #define all(a) a.begin(), a.end() const int N = 1 << 19; int n, o, mod; vector<int> S(2 * N, 1); void update(int id, int c) { id += N; S[id] += c; while (id /= 2) { S[id] = (ll) S[id * 2] * S[id * 2 + 1] % mod; } } int get(int id, int u, int v, int l, int r) { if (l > v || r < u) { return 1; } if (l >= u && r <= v) { return S[id]; } int md = (l + r) / 2; return (ll) get(id * 2, u, v, l, md) * get(id * 2 + 1, u, v, md + 1, r) % mod; } int main() { ios_base::sync_with_stdio(0);cin.tie(0); cin >> n >> o >> mod; vector<array<int, 2>> A(n); for (int i = 0; i < n; i++) { for (int j = 0; j < 2; j++) { cin >> A[i][j]; } } sort(all(A)); int mp[n + 1]; vector<bool> Done(n + 1); int cnt = 0; for (int i = n - 1; i >= 0; i--) { if (!Done[A[i][1]]) { Done[A[i][1]] = 1; mp[A[i][1]] = o - cnt++; } A[i][1] = mp[A[i][1]]; } vector<int> Cut(n + 1, -1); int j = -1; vector<vector<int>> Ind (n + 1); for (int i = 0; i < n; i++) { Ind[A[i][1]].push_back(i); while (j + 1 < i && 2 * A[j + 1][0] <= A[i][0]) { j++; } Cut[A[i][1]] = j; } int r = -1; while (r + 1 < n && ((2 * A[r + 1][0]) <= A.back()[0])) { r++; update(A[r][1], 1); } Done.clear(), Done.resize(n + 1); int ans = 0; vector<int> Imp; Imp.reserve(o); for (int i = n - 1; i >= 0; i--) { int k = A[i][1]; if (!Done[k]) { Done[k] = 1 ; while (r >= 0 && ((2 * A[r][0]) > A[i][0])) { update(A[r][1], -1); r--; } int c = S[k + N]; update(k, -(c - 1)); for (int f = c; f > 0; f--) { int l = 0, r = Imp.size() - 1, last_zero = n; while (l <= r) { int md = (l + r) / 2; int num = upper_bound(all(Ind[k]), Cut[Imp[md]]) - Ind[k].begin(); if (num > f - 1) { last_zero = Imp[md], l = md + 1; } else { r = md - 1; } } ans = (ans + get(1, 0, last_zero - 1, 0, N - 1)) % mod; } update(k, (c - 1)); Imp.push_back(k); } } cout << ans; }
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...