Submission #1245895

#TimeUsernameProblemLanguageResultExecution timeMemory
1245895totoroFancy Fence (CEOI20_fancyfence)C++20
100 / 100
51 ms4904 KiB
#include <iostream> #include <utility> #include <vector> const long long MOD = 1e9 + 7; const long long QUARTER = 250'000'002; // counts subrectangles of a rectangle long long count(long long w, long long h) { long long ans = 1; (ans *= QUARTER) %= MOD; (ans *= w) %= MOD; (ans *= h) %= MOD; (ans *= (w + 1)) %= MOD; (ans *= (h + 1)) %= MOD; return ans; } int main() { int n; std::cin >> n; std::vector<long long> heights(n), widths(n); for (long long& i : heights) std::cin >> i; for (long long& i : widths) std::cin >> i; heights.push_back(0); widths.push_back(0); long long ans = 0; std::vector<std::pair<long long, long long>> stack; // (left, height) stack.emplace_back(0, 0); long long curwidth = 0; for (int i = 0; i <= n; ++i) { int last_popped = curwidth; while (stack.size() > 1 && heights[i] < stack.back().second) { auto [popleft, popheight] = stack.back(); last_popped = popleft; stack.pop_back(); (ans += count(curwidth - popleft, popheight)) %= MOD; (((ans -= count(curwidth - popleft, std::max(heights[i], stack.back().second))) %= MOD) += MOD) %= MOD; // std::cout << "popped " << popleft << ", " << popheight << '\n'; // std::cout << '+' << count(curwidth - popleft, popheight) << '\n'; // std::cout << '-' << count(curwidth - popleft, stack.back().second) << '\n'; } stack.emplace_back(last_popped, heights[i]); (curwidth += widths[i]) %= MOD; } std::cout << ans << '\n'; return 0; }
#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...