제출 #312555

#제출 시각아이디문제언어결과실행 시간메모리
312555Jarif_RahmanFancy Fence (CEOI20_fancyfence)C++17
100 / 100
94 ms14952 KiB
#include <bits/stdc++.h>
#define pb push_back
#define f first
#define sc second
using namespace std;
typedef long long int ll;
typedef string str;
const ll m = 1e9 + 7;
ll ml(ll x){
    ll y = x+1;
    if(y%2 == 0) y/=2;
    else x/=2;
    x%=m;
    y%=m;
    return (x*y)%m;
}
ll sth(ll a, ll b){
    ll x = b-a;
    ll s1 = x+2*a+1;
    if(x%2==0) x/=2;
    else s1/=2;
    return (x*s1)%m;
}
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n; cin >> n;
    vector <ll> h(n), w(n);
    for(ll &x: h) cin >> x;
    for(ll &x: w) cin >> x;
    h.pb(0);
    vector <int> in(n+1), in2(n+1);
    stack <int> st;
    vector <ll> sum(n+1);
    for(int i = 0; i <= n; i++){
        if(st.empty()){
            st.push(i);
            continue;
        }
        ll s = 0;
        while(!st.empty() && h[st.top()] > h[i]){
            int x = st.top();
            st.pop();
            in[x] = i;
        }
        st.push(i);
    }
    while(!st.empty()) st.pop();
    h.pop_back();
    h.insert(h.begin(), 0);
    for(int i = n; i >= 0; i--){
        if(st.empty()){
            st.push(i);
            continue;
        }
        ll s = 0;
        while(!st.empty() && h[st.top()] > h[i]){
            int x = st.top();
            st.pop();
            in2[x - 1] = i - 1;
        }
        st.push(i);
    }
    while(!st.empty()) st.pop();
    h.erase(h.begin());
    ll ss = 0;
    sum[0] = 0;
    for(int  i = 0; i < n; i++){
        ss+=w[i];
        sum[i+1] = ss;
    }
    ll ans = 0;
    vector <tuple<ll, ll, ll>> v;
    set<tuple<ll, int, int>> vs;
    for(int i = 0; i < n; i++){
        vs.insert({h[i], in2[i]+1, in[i]});
    }

    for(auto tp: vs){
        ll ls = 0;
        ll hh, inx1, inx2;
        tie(hh, inx1, inx2) = tp;
        if(inx1 != 0) ls = max(ls, h[inx1-1]);
        if(inx2 < n) ls = max(ls, h[inx2]);
        v.pb({hh, sum[inx2] - sum[inx1], ls});
    }
    ll ls = 0;
    for(auto tp: v){
        ll a, b, c;
        tie(a, b, c) = tp;
        ans+=(ml(b)*sth(c, a));
        ans%=m;
    }
    cout << ans << "\n";
}

컴파일 시 표준 에러 (stderr) 메시지

fancyfence.cpp: In function 'int main()':
fancyfence.cpp:40:12: warning: unused variable 's' [-Wunused-variable]
   40 |         ll s = 0;
      |            ^
fancyfence.cpp:56:12: warning: unused variable 's' [-Wunused-variable]
   56 |         ll s = 0;
      |            ^
fancyfence.cpp:87:8: warning: unused variable 'ls' [-Wunused-variable]
   87 |     ll ls = 0;
      |        ^~
#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...