제출 #1202678

#제출 시각아이디문제언어결과실행 시간메모리
1202678peraFancy Fence (CEOI20_fancyfence)C++20
100 / 100
17 ms2644 KiB
#include<bits/stdc++.h>
using namespace std;
template <long long MOD = 1000000007, typename T = int> struct modint {
   T x;
   modint() : x(0) {}
   modint(int64_t y) : x(y >= 0 ? y % MOD : (MOD - (-y) % MOD) % MOD) {}
   modint &operator+=(const modint &p) {
      if ((x += p.x) >= MOD) x -= MOD;
      return *this;
   }
   modint &operator-=(const modint &p) {
      if ((x += MOD - p.x) >= MOD) x -= MOD;
      return *this;
   }
   modint &operator*=(const modint &p) {
      x = (int)(1LL * x * p.x % MOD);
      return *this;
   }
   modint &operator/=(const modint &p) {
      *this *= p.inv();
      return *this;
   }
   modint operator-() const { return modint(-x); }
   modint operator+(const modint &p) const { return modint(*this) += p; }
   modint operator-(const modint &p) const { return modint(*this) -= p; }
   modint operator*(const modint &p) const { return modint(*this) *= p; }
   modint operator/(const modint &p) const { return modint(*this) /= p; }
   bool operator==(const modint &p) const { return x == p.x; }
   bool operator!=(const modint &p) const { return x != p.x; }
   modint inv() const {
      T a = x, b = MOD, u = 1, v = 0, t;
      while (b > 0) {
         t = a / b;
         swap(a -= t * b, b);
         swap(u -= t * v, v);
      }
      return modint(u);
   }
   modint pow(int64_t n) const {
      modint ret(1), mul(x);
      while (n > 0) {
         if (n & 1) ret *= mul;
         mul *= mul;
         n >>= 1;
      }
      return ret;
   }
   friend ostream &operator<<(ostream &os, const modint &p) { return os << p.x; }
   friend istream &operator>>(istream &is, modint &a) {
      int64_t t;
      is >> t;
      a = modint<MOD>(t);
      return (is);
   }
   T val() const { return x; }
   static constexpr T mod() { return MOD; }
   static constexpr T half() { return (MOD + 1) >> 1; }
};
//--
using Mint = modint<1000000007>;
int main(){
   cin.tie(0)->sync_with_stdio(0);
   int n;
   cin >> n;
   vector<long long> h(n + 1);
   for(int i = 1;i <= n;i ++){
      cin >> h[i];
   }
   vector<Mint> w(n + 1);
   for(int i = 1;i <= n;i ++){
      cin >> w[i];
   }
   vector<int> L(n + 1);
   for(int i = 1;i <= n;i ++){
      L[i] = i - 1;
      while(L[i] > 0 && h[i] < h[L[i]]){
         L[i] = L[L[i]];
      }
   }
   vector<int> R(n + 1);
   for(int i = n;i >= 1;i --){
      R[i] = i + 1;
      while(R[i] <= n && h[i] <= h[R[i]]){
         R[i] = R[R[i]];
      }
   }
   Mint ans = 0;
   vector<Mint> sum(n + 1);
   for(int i = 1;i <= n;i ++){
      sum[i] = sum[i - 1] + w[i];
   }
   for(int i = 1;i <= n;i ++){
      ans += w[i] * (w[i] + 1) * Mint(h[i]) * Mint(h[i] + 1) / 4; 
      ans += ((sum[i] - sum[L[i]]) * (sum[R[i] - 1] - sum[i - 1]) - w[i] * w[i]) * Mint(h[i]) * Mint(h[i] + 1) / 2;
   }
   cout << ans << '\n';
}
#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...