제출 #987468

#제출 시각아이디문제언어결과실행 시간메모리
987468Essa2006Fish (IOI08_fish)C++14
95 / 100
1957 ms65536 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 << 20; int n, o, mod; vector<int> S(2 * N, 1); int add(int a, int b) { return (a + b) % mod; } int mul(int a, int b) { a %= mod, b %= mod; return (ll)a * b % mod; } void update(int id, int c) { id += N; S[id] += c; while (id /= 2) { S[id] = mul(S[id * 2], S[id * 2 + 1]); } } 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 mul(get(id * 2, u, v, l, md), get(id * 2 + 1, u, v, md + 1, r)); } 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)); map<int, int> mp; 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), Frst(n, -1); int j = -1; map<int, vector<int>> Ind; 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); } vector<int> Last(n + 1, n); int ans = 0; vector<int> Imp; for (int i = n - 1; i >= 0; i--) { int k = A[i][1]; if (Last[k] == n) { Last[k] = i; while (r >= 0 && ((2 * A[r][0]) > A[i][0])) { update(A[r][1], -1); r--; } for (int f = S[k + N]; f > 0; f--) { int l = 0, r = Imp.size() - 1, last_zero = n; while (l <= r) { int md = (l + r) / 2; int cut = Cut[Imp[md]]; int num = upper_bound(all(Ind[k]), cut) - Ind[k].begin(); if (num > (f - 1)) { last_zero = Imp[md], l = md + 1; } else { r = md - 1; } } int c = S[k + N]; update(k, -(c - 1)); ans = add(ans, get(1, 0, last_zero - 1, 0, N - 1)); update(k, (c - 1)); //cout << i << ' ' << f << ' ' << last_zero << endl; } 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...