Submission #1282885

#TimeUsernameProblemLanguageResultExecution timeMemory
1282885kzhiFancy Fence (CEOI20_fancyfence)C++20
12 / 100
2 ms576 KiB
/*
    Author : kmv__
    muadongdenroi, emcodencungmuadongkhong :<
    Road to tst
*/

#include<bits/stdc++.h>

using namespace std;

#define left(id) (id << 1)
#define right(id) ((id << 1) | 1)
#define mid(l,r) ((l + r) >> 1)

const int N = 1e5 + 5;
const int MOD = 1e9 + 7;

int n, h[N], w[N];
int l[N], r[N];
long long t[N];

struct DATA{
    int id, val;
};

bool cmp(DATA A, DATA B){
    return A.val < B.val;
}

vector < DATA > a;

int calc(long long len){
    if (len == 0)
        return 0;
    __int128 res;
    res = (len - 1) * len;
    res /= 2;
    res += len;
    res %= MOD;
    return (int) res;
}

long long st[N * 4], lz[N * 4];

void down(int id, int l, int r){
    if (lz[id] == 0)
        return;
    long long x = lz[id];
    lz[id] = 0;

    if (l != r){
        int mid = mid(l, r);

        st[left(id)] = (1ll * x * (mid - l + 1)) % MOD;
        st[right(id)] = (1ll * x * (r - mid)) % MOD;

        lz[left(id)] = x;
        lz[right(id)] = x;
    }
}

void upd(int id, int l, int r, int u, int v, int val){
    if (v < l || r < u)
        return;
    down(id, l, r);

    if (u <= l && r <= v){
        st[id] = (1ll * val * (r - l + 1)) % MOD;
        lz[id] = val;
        down(id, l, r);
        return;
    }

    int mid = mid(l, r);

    upd(left(id), l, mid, u, v, val);
    upd(right(id), mid + 1, r, u, v, val);

    st[id] = (st[left(id)] + st[right(id)]) % MOD;
}

long long Get(int id, int l, int r, int u, int v){
    if (v < l || r < u)
        return 0;

    down(id, l, r);

    if (u <= l && r <= v)
        return st[id];

    int mid = mid(l, r);

    return (Get(left(id), l, mid, u, v) + Get(right(id), mid + 1, r, u, v)) % MOD;
}

long long sum(int l, int r){
    long long res = t[r] - t[l - 1];
    return res;
}

void SOLVE(){
    cin >> n;
    for (int i = 1; i <= n; i ++)
        cin >> h[i];

    for (int i = 1; i <= n; i ++){
        cin >> w[i];
        t[i] = t[i - 1] + w[i];
    }

    stack < int > st1;

    st1.push(0);

    for (int i = 1; i <= n; i ++){
        while (h[st1.top()] >= h[i])
            st1.pop();
        l[i] = st1.top() + 1;
        st1.push(i);
    }

    stack < int > st2;

    st2.push(n + 1);

    for (int i = n; i >= 1; i --){
        while (h[st2.top()] >= h[i])
            st2.pop();
        r[i] = st2.top() - 1;
        st2.push(i);
    }

    for (int i = 1; i <= n; i++){
        a.push_back({i, h[i]});
    }

    sort(a.begin(), a.end(), cmp);

    long long ans = 0;

    for (DATA i : a){
        int id = i.id;
        int val = i.val;

        long long len = sum(l[id], r[id]);

        long long res = 1ll * calc(len) * calc(val) % MOD;

        long long len2 = Get(1, 1, n, id, id);

        long long res2 = 1ll * calc(len2) * calc(len) % MOD;

//        cout << id << " " << l[id] << " " << r[id] << " "
//        << val << " " << len << " " << res
//        << " " << len2 << " " << res2 << endl;

        res -= res2;

        if (res < 0)
            res += MOD;

        ans += res;

        ans %= MOD;

        upd(1, 1, n, l[id], r[id], val);
    }

    cout << ans;
}

signed main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    #define TASK "hist"

    if (fopen(TASK".inp","r")){
        freopen(TASK".inp","r",stdin);
        freopen(TASK".out","w",stdout);
    }

    int nTest = 1;

//    cin >> nTest;

    while (nTest --){
        SOLVE();
    }

    return 0;
}

Compilation message (stderr)

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