제출 #987475

#제출 시각아이디문제언어결과실행 시간메모리
987475Essa2006Fish (IOI08_fish)C++14
13 / 100
1614 ms56996 KiB
// C++ includes used for precompiling -*- C++ -*- // Copyright (C) 2003-2015 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // Under Section 7 of GPL version 3, you are granted additional // permissions described in the GCC Runtime Library Exception, version // 3.1, as published by the Free Software Foundation. // You should have received a copy of the GNU General Public License and // a copy of the GCC Runtime Library Exception along with this program; // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see // <http://www.gnu.org/licenses/>. /** @file stdc++.h * This is an implementation file for a precompiled header. */ // 17.4.1.2 Headers // C #ifndef _GLIBCXX_NO_ASSERT #include <cassert> #endif #include <cctype> #include <cerrno> #include <cfloat> #include <ciso646> #include <climits> #include <clocale> #include <cmath> #include <csetjmp> #include <csignal> #include <cstdarg> #include <cstddef> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #if __cplusplus >= 201103L #include <ccomplex> #include <cfenv> #include <cinttypes> #include <cstdbool> #include <cstdint> #include <ctgmath> #include <cwchar> #include <cwctype> #endif // C++ #include <algorithm> #include <bitset> #include <complex> #include <deque> #include <exception> #include <fstream> #include <functional> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> #include <iterator> #include <limits> #include <list> #include <locale> #include <map> #include <memory> #include <new> #include <numeric> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stack> #include <stdexcept> #include <streambuf> #include <string> #include <typeinfo> #include <utility> #include <valarray> #include <vector> #if __cplusplus >= 201103L #include <array> #include <atomic> #include <chrono> #include <condition_variable> #include <forward_list> #include <future> #include <initializer_list> #include <mutex> #include <random> #include <ratio> #include <regex> #include <scoped_allocator> #include <system_error> #include <thread> #include <tuple> #include <typeindex> #include <type_traits> #include <unordered_map> #include <unordered_set> #endif //#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 << 21; 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]] = n - cnt++; } A[i][1] = mp[A[i][1]]; } vector<int> Cut(n + 1, -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; Imp.reserve(o); 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...