Submission #1230809

#TimeUsernameProblemLanguageResultExecution timeMemory
1230809Bui_Quoc_CuongFancy Fence (CEOI20_fancyfence)C++20
100 / 100
33 ms2732 KiB
# include <bits/stdc++.h> using namespace std; int ko () { cerr << "Time used: " << 1.0 * clock() / CLOCKS_PER_SEC << "s "; return 0; } const int N = 1e5 + 5; const int MOD = 1e9 + 7; int n; int h[N], w[N]; int Pow(int x, int y) { if (y == 0) return 1; if (y == 1) return x; int c = Pow(x, y / 2); if (y & 1) return 1LL * c * c % MOD * x % MOD; else return 1LL * c * c % MOD; } namespace sub5 { inline int SumnC2(int x) { return 1LL * x * (x + 1) % MOD * Pow(2, MOD - 2) % MOD; } void solve() { int ans = 0; for (int i = 1; i <= n; i++) { int H = h[i]; (ans+= 1LL * SumnC2(H) * SumnC2(w[i]) % MOD) %= MOD; for (int j = i - 1; j >= 1; j--) { H = min(H, h[j]); (ans+= 1LL * SumnC2(H) * w[j] % MOD * w[i] % MOD) %= MOD; } } cout << ans; } } namespace sub6 { inline int SumnC2(int x) { return 1LL * x * (x + 1) % MOD * Pow(2, MOD - 2) % MOD; } int pre[N]; void solve() { for (int i = 1; i <= n; i++) { pre[i] = pre[i - 1] + w[i]; if (pre[i] >= MOD) pre[i]-= MOD; } stack <array <int, 3>> st; int ans = 0, add = 0; for (int i = 1; i <= n; i++) { int H = h[i]; (ans+= 1LL * SumnC2(H) * SumnC2(w[i]) % MOD) %= MOD; int L = i, R = i; while (!st.empty() && st.top()[0] >= h[i]) { int l = st.top()[1]; int r = st.top()[2]; L = min(L, l); add = (add - 1LL * (pre[r] - pre[l - 1] + MOD) % MOD * SumnC2(st.top()[0]) % MOD + MOD) % MOD; st.pop(); } (add+= 1LL * (pre[R - 1] - pre[L - 1] + MOD) % MOD * SumnC2(h[i]) % MOD) %= MOD; // cout << i << " " << add << '\n'; (ans+= 1LL * w[i] * add % MOD) %= MOD; // cout << i << " " << w[i] * add << " " << add << "\n"; (add+= 1LL * (pre[i] - pre[i - 1] + MOD) % MOD * SumnC2(h[i]) % MOD) %= MOD; st.push({h[i], L, R}); } cout << ans % MOD; } } int main () { ios_base :: sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); #define taskname "rect" if(fopen(taskname".inp", "r")){ freopen(taskname".inp", "r", stdin); freopen(taskname".out", "w", stdout); } cin >> n; for (int i = 1; i <= n; i++) { cin >> h[i]; } for (int i = 1; i <= n; i++) { cin >> w[i]; } // return sub5 :: solve(), ko(); return sub6 :: solve(), ko(); }

Compilation message (stderr)

fancyfence.cpp: In function 'int main()':
fancyfence.cpp:91:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   91 |         freopen(taskname".inp", "r", stdin); freopen(taskname".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
fancyfence.cpp:91:53: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   91 |         freopen(taskname".inp", "r", stdin); freopen(taskname".out", "w", stdout);
      |                                              ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...