Submission #61145

#TimeUsernameProblemLanguageResultExecution timeMemory
61145Eae02Boat (APIO16_boat)C++14
9 / 100
2041 ms210212 KiB
#include <bits/stdc++.h> uint64_t PRIME = 1000000007; std::vector<std::pair<uint64_t, uint64_t>> schools; std::unordered_map<uint64_t, uint64_t> memo[500]; uint64_t count(int i, uint64_t min) { if (i >= schools.size()) return 1; auto mIt = memo[i].find(min); if (mIt != memo[i].end()) return mIt->second; uint64_t c = count(i + 1, min); for (uint64_t n = std::max(schools[i].first, min == 0 ? 0 : (min + 1)); n <= schools[i].second; n++) { c = (c + count(i + 1, n)) % PRIME; } memo[i].insert(std::make_pair(min, c)); return c; } int main() { int N; std::cin >> N; bool allSame = true; uint64_t max2 = 0; schools.resize(N); for (int i = 0; i < N; i++) { std::cin >> schools[i].first; std::cin >> schools[i].second; if (schools[i].first != schools[i].second) allSame = false; max2 = std::max(max2, schools[i].second); } if (allSame) { std::cout << (count(0, 0) - 1) << std::endl; } else { std::vector<uint64_t> waysElim(max2 + 1); uint64_t ways = 1; for (int i = 0; i < N; i++) { const uint64_t prevWays = ways; const uint64_t d = schools[i].second - schools[i].first + 1; ways = (ways * ((d + 1) % PRIME)) % PRIME; for (uint64_t j = 0; j < d; j++) { uint64_t eI = schools[i].second - j; ways -= waysElim[eI]; waysElim[eI] = (j + 1) * prevWays - waysElim[eI]; } for (uint64_t w : waysElim) std::cout << " " << w; std::cout << std::endl; } std::cout << ways - 1 << std::endl; } }

Compilation message (stderr)

boat.cpp: In function 'uint64_t count(int, uint64_t)':
boat.cpp:11:8: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if (i >= schools.size())
      ~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...