# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
985450 | 2024-05-17T21:20:44 Z | islam998 | 벽 (IOI14_wall) | C++17 | 0 ms | 0 KB |
#include <iostream> #include <vector> #include <algorithm> #define MOD 1000000007 using namespace std; typedef long long ll; int main() { int N; cin >> N; vector<int> a(N), b(N); for (int i = 0; i < N; ++i) { cin >> a[i]; } for (int i = 0; i < N; ++i) { cin >> b[i]; } // Function to calculate water collected given heights auto calculateWater = [](const vector<int>& heights) { int N = heights.size(); vector<int> leftMax(N), rightMax(N); leftMax[0] = heights[0]; for (int i = 1; i < N; ++i) { leftMax[i] = max(leftMax[i - 1], heights[i]); } rightMax[N - 1] = heights[N - 1]; for (int i = N - 2; i >= 0; --i) { rightMax[i] = max(rightMax[i + 1], heights[i]); } ll totalWater = 0; for (int i = 0; i < N; ++i) { totalWater += min(leftMax[i], rightMax[i]) - heights[i]; } return totalWater; }; // Calculate water collected for all possible combinations ll totalSum = 0; int totalCombinations = 1 << N; // 2^N combinations for (int mask = 0; mask < totalCombinations; ++mask) { vector<int> heights(N); for (int i = 0; i < N; ++i) { if (mask & (1 << i)) { heights[i] = b[i]; } else { heights[i] = a[i]; } } totalSum = (totalSum + calculateWater(heights)) % MOD; } cout << totalSum << endl; return 0; }