Submission #813035

#TimeUsernameProblemLanguageResultExecution timeMemory
813035ezdpFancy Fence (CEOI20_fancyfence)C++14
100 / 100
108 ms30796 KiB
#include<bits/stdc++.h> #define endl '\n' #define fr first #define sc second #define ll long long int const int MAXN = 1e5; const int MAXL = 20; const ll MOD = 1e9 + 7; inline std::pair<int, int> my_min(const std::pair<int, int> &a, const std::pair<int, int> &b){ if(a.fr < b.fr) return a; if(a.fr > b.fr) return b; if(a.sc < b.sc) return a; return b; } inline ll mult(ll a, ll b){ return (a * b) % MOD; } inline ll fp(ll b, ll p){ if(p == 0) return 1LL; if(p == 1) return b; if(p & 1) return mult(b, fp(b, p - 1)); ll aux = fp(b, p / 2); return mult(aux, aux); } inline ll divi(ll a, ll b){ return mult(a, fp(b, MOD - 2)); } inline ll f(ll n){ n = (n + MOD) % MOD; return divi(mult(n, n + 1), 2); } int lg2[MAXN + 5]; ll N, h[MAXN + 5], w[MAXN + 5], prefw[MAXN + 5]; std::pair<int, int> sparse[MAXN + 5][MAXL + 1]; std::pair<int, int> get(int l, int r){ int j = lg2[r - l + 1]; return my_min(sparse[l][j], sparse[r - (1 << j) + 1][j]); } ll rec(int l = 1, int r = N){ if(l > r) return 0; int minh = get(l, r).fr, id = l; ll my_ans = 0, other_ans = 0; my_ans = mult(f(minh), f(prefw[r] - prefw[l - 1])); while(true){ auto [myh, myid] = get(id, r); if(myh != minh){ my_ans = (my_ans - mult(f(minh), f(prefw[r] - prefw[id - 1])) + MOD) % MOD; other_ans += rec(id, r); break; } else{ my_ans = (my_ans - mult(f(minh), f(prefw[myid - 1] - prefw[id - 1])) + MOD) % MOD; other_ans += rec(id, myid - 1); id = myid + 1; } } my_ans %= MOD; other_ans %= MOD; return (my_ans + other_ans) % MOD; } inline void init(){ lg2[1] = 0; for(int i = 2; i <= MAXN; ++ i){ lg2[i] = lg2[i / 2] + 1; } } int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); init(); std::cin >> N; for(int i = 1; i <= N; ++ i){ std::cin >> h[i]; sparse[i][0] = {h[i], i}; } for(int l = 1; l < MAXL; ++ l){ for(int i = 1; i + (1 << l) - 1 <= N; ++ i){ sparse[i][l] = my_min(sparse[i][l - 1], sparse[i + (1 << (l - 1))][l - 1]); } } for(int i = 1; i <= N; ++ i){ std::cin >> w[i]; prefw[i] = prefw[i - 1] + w[i]; } std::cout << rec() << endl; } /** */

Compilation message (stderr)

fancyfence.cpp: In function 'long long int rec(int, int)':
fancyfence.cpp:55:8: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   55 |   auto [myh, myid] = get(id, r);
      |        ^
#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...