답안 #923808

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
923808 2024-02-07T19:40:48 Z treap_enjoyer Fancy Fence (CEOI20_fancyfence) C++14
0 / 100
1 ms 500 KB
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#pragma GCC optimize("Ofast,unroll-loops")

#define ll long long
#define all(x) x.begin(), x.end()
#define ld long double
#define pii pair<int, int>
#define int long long
using namespace std;
using namespace __gnu_pbds;

template<class T> using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

const int INF = 1e9 + 7;
const int MAXN = 1e5 + 5;
ll bin_pow(int a, int b){
    if(!b) return 1;
    if(b & 1) return (a * bin_pow(a, b - 1)) % INF;
    else return bin_pow((a * a) % INF, b / 2);
}
signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
    // ifstream cin("input.txt");
    // ofstream cout("output.txt");
    int n;
    cin >> n;
    vector<int> h(n + 1);
    vector<int> w(n + 1);
    for(int i = 1; i <= n; i++){
        cin >> h[i];
    }
    for(int i = 1; i <= n; i++){
        cin >> w[i];
    }
    vector<ll> dp(n + 1, 0);
    stack<pair<int, int> > st;
    st.push({0, 0});
    vector<ll> pref(n + 1);
    for(int i = 1; i <= n; i++){
        pref[i] += pref[i - 1];
        pref[i] += w[i];
    }
    vector<int> ans(n + 1, 0);
    for(int i = 1; i <= n; i++){
        while(st.top().first >= h[i]){
            st.pop();   
        }
        ll sumw = pref[i] - pref[st.top().second];
        ll x = 0;
        x = h[i];
        x *= h[i] + 1;
        x %= INF;
        x *= bin_pow(2, INF - 2);
        x %= INF;
        x *= sumw;
        x %= INF;
        // cout << sumw << " " << h[i] << " " << x << endl;
        dp[i] += dp[st.top().second];
        dp[i] %= INF;
        dp[i] += x;   
        dp[i] %= INF;
        ans[i] += ans[i - 1];
        ans[i] += dp[i];
        ans[i] += dp[st.top().second] * (sumw - 1);
        ans[i] %= INF;
        x = 0;
        x = sumw - 1;
        x *= sumw;
        x %= INF;
        x *= bin_pow(2, INF - 2);
        x %= INF;
        x *= h[i];
        x %= INF;
        x *= h[i] + 1;
        x %= INF;
        x *= bin_pow(2, INF - 2);
        x %= INF;
        // cout << x << endl;
        ans[i] += x;
        ans[i] %= INF;
        st.push({h[i], i});
    }
    cout << ans[n] << endl;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Incorrect 1 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 500 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Incorrect 1 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 348 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Incorrect 1 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Incorrect 1 ms 344 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 344 KB Output is correct
2 Incorrect 1 ms 348 KB Output isn't correct
3 Halted 0 ms 0 KB -