Submission #756892

#TimeUsernameProblemLanguageResultExecution timeMemory
756892SanguineChameleonFish (IOI08_fish)C++17
80 / 100
3056 ms26716 KiB
#include <bits/stdc++.h> using namespace std; void just_do_it(); int main() { #ifdef KAMIRULEZ freopen("kamirulez.inp", "r", stdin); freopen("kamirulez.out", "w", stdout); #endif ios_base::sync_with_stdio(0); cin.tie(0); just_do_it(); return 0; } const int maxn = 5e5 + 20; pair<int, int> a[maxn]; vector<int> pos[maxn]; int cnt[maxn]; int tree[maxn]; int id[maxn]; int max_id[maxn]; int mod; void build(int id, int lt, int rt) { for (int i = lt; i <= rt; i++) { tree[i] = cnt[i] % mod; } } void update(int id, int lt, int rt, int pos, int val) { tree[pos] = val % mod; } int get(int id, int lt, int rt, int ql, int qr) { if (ql > qr) { return 1; } int res = 1; for (int i = ql; i <= qr; i++) { res = res * tree[i] % mod; } return res; } void just_do_it() { int n, k; cin >> n >> k >> mod; for (int i = 1; i <= n; i++) { cin >> a[i].first >> a[i].second; } sort(a + 1, a + n + 1); k = 0; for (int i = n; i >= 1; i--) { if (!id[a[i].second]) { id[a[i].second] = ++k; } a[i].second = id[a[i].second]; } for (int i = 1; i <= n; i++) { cnt[a[i].second]++; pos[a[i].second].push_back(i); } for (int i = 1; i <= k; i++) { cnt[i]++; } for (int i = n; i >= 1; i--) { max_id[i] = max(max_id[i + 1], a[i].second); } build(1, 1, k); int lt = n; int res = 0; for (int i = n; i >= 1; i--) { while (lt > 0 && a[lt].first * 2 > a[i].first) { cnt[a[lt].second]--; update(1, 1, k, a[lt].second, cnt[a[lt].second]); lt--; } if (max_id[i] != max_id[i + 1]) { int x = max_id[i]; res += (cnt[x] - 1) % mod * get(1, 1, k, x + 1, k) % mod; res %= mod; int low = max_id[lower_bound(a + 1, a + n + 1, make_pair(a[pos[x][cnt[x] - 1]].first * 2, -1)) - a] + 1; res += get(1, 1, k, low, x - 1) * get(1, 1, k, x + 1, k) % mod; res %= mod; } } cout << res; }
#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...