답안 #577547

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
577547 2022-06-15T04:22:44 Z talant117408 Fancy Fence (CEOI20_fancyfence) C++17
15 / 100
55 ms 1880 KB
#include <bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;

#define long                unsigned long 
#define pb                  push_back
#define mp                  make_pair
#define all(v)              (v).begin(),(v).end()
#define rall(v)             (v).rbegin(),(v).rend()
#define lb                  lower_bound
#define ub                  upper_bound
#define sz(v)               int((v).size())
#define do_not_disturb      ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define endl                '\n'

void solve() {
    int n;
    cin >> n;
    
    ll mod = 1e9+7;
    function <ll(ll, ll)> add = [&](ll a, ll b) {
        return ((a+b)%mod+mod)%mod;
    };
    function <ll(ll, ll)> mult = [&](ll a, ll b) {
        return ((a*b)%mod+mod)%mod;
    };
    function <ll(ll, ll)> binpow = [&](ll a, ll b) {
        ll res = 1;
        while (b) {
            if (b&1) res = mult(res, a);
            a = mult(a, a);
            b >>= 1;
        }
        return res;
    };
    ll inv2 = binpow(2, mod-2);
    function <ll(ll)> calc = [&](ll n) {
        return mult(mult(n, n+1), inv2);
    };
    
    vector <ll> h(n), w(n);
    for (auto &to : h) cin >> to;
    for (auto &to : w) cin >> to;
    stack <pll> heights;
    ll ans = 0, sum = 0;
    for (int i = 0; i < n; i++) {
        ll left = 0;
        while (sz(heights) && heights.top().first >= h[i]) {
            auto v = heights.top(); heights.pop();
            left = add(left, v.second);
            ans = add(ans, mult(calc(h[i]), mult(v.second, w[i])));
            sum = add(sum, -mult(calc(v.first), v.second));
        }
        //~ ans = add(ans, -mult(calc(h[i]), calc(left)));
        ans = add(ans, mult(calc(h[i]), calc(w[i])));
        ans = add(ans, mult(sum, add(w[i], left)));
        sum = add(sum, mult(calc(h[i]), add(w[i], left)));
        heights.push(mp(h[i], add(w[i], left)));
    }
    cout << ans << endl;
}

int main() {
    do_not_disturb
    
    int t = 1;
    //~ cin >> t;
    while (t--) {
        solve();
    }
    
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 212 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 5 ms 468 KB Output is correct
3 Correct 28 ms 1108 KB Output is correct
4 Correct 55 ms 1880 KB Output is correct
5 Correct 50 ms 1876 KB Output is correct
6 Correct 0 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Correct 6 ms 468 KB Output is correct
4 Correct 24 ms 1108 KB Output is correct
5 Correct 49 ms 1876 KB Output is correct
6 Correct 49 ms 1880 KB Output is correct
7 Correct 1 ms 340 KB Output is correct
8 Correct 5 ms 596 KB Output is correct
9 Incorrect 24 ms 1436 KB Output isn't correct
10 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 212 KB Output is correct
2 Incorrect 1 ms 212 KB Output isn't correct
3 Halted 0 ms 0 KB -