제출 #1018366

#제출 시각아이디문제언어결과실행 시간메모리
1018366vjudge1모임들 (IOI18_meetings)C++17
19 / 100
5522 ms7556 KiB
#include <bits/stdc++.h>
// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx2")
// #pragma GCC optimization ("O3")
// #pragma GCC optimization ("unroll-loops")
// #pragma GCC target("popcnt")
#define endl '\n'
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define fo(i,n) for(auto i =0 ; i < n;i++)
#define fore(i,l,r) for(auto i = l; i < r;i++)
#define forex(i,r,l) for(auto i = r; i >= l; i--)
#define ffo(i,n) forex(i,n-1,0)
#define all(x) x.begin(),x.end()
#define lsb(x) x&(-x)
#define sz(x) (int)x.size()
#define gcd(a,b) __gcd(a,b)
#define vii vector<ii>
#define pq_min(a) priority_queue<a, vector<a>, greater<a>>
#define fls cout.flush()
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vi = vector<int>;
using ii = pair<int,int>;
using mii = map<int,int>;
using lld = long double;
void valid(ll in){cout<<((in)?"YES\n":"NO\n");}
vector<ll> minimum_costs(vi H, vi L,vi R) {
    int Q = L.size(), N = H.size( );
    vector<ll> C(Q, 1e18);
    fo(i,Q){
        vector<ll> maxder(N,0),maxizq(N,0);
        stack<int> stk;
        for(int j = R[i]; j >= L[i]; j--){
            if(j!=R[i])maxder[j]=maxder[j+1];
            while(sz(stk) && H[j] > H[stk.top()]){
                if(sz(stk)==1){
                    maxder[j] -= 1ll*(R[i] - stk.top()+1) * H[stk.top()];
                    stk.pop();
                }else{
                    int ac = stk.top();
                    stk.pop();
                    maxder[j] -= 1ll*(stk.top() - ac) * H[ac];
                }
            }
            if(sz(stk)){
                maxder[j] += 1ll*(stk.top() - j) * H[j];
            }else{
                maxder[j] += 1ll*(R[i] - j+1)*H[j];
            }
            stk.push(j);
        }
        while(sz(stk))stk.pop();
        for(int j = L[i]; j <= R[i];j++){
            if(j!=L[i])maxizq[j]=maxizq[j-1];
            while(sz(stk) && H[j] > H[stk.top()]){
                if(sz(stk)==1){
                    maxizq[j] -= 1ll*(stk.top()-L[i]+1) * H[stk.top()];
                    stk.pop();
                }else{
                    int ac = stk.top();
                    stk.pop();
                    maxizq[j] -= 1ll*(ac-stk.top()) * H[ac];
                }
            }
            if(sz(stk)){
                maxizq[j] += 1ll*(j-stk.top()) * H[j];
            }else{
                maxizq[j] += 1ll*(j-L[i]+1)*H[j];
            }
            stk.push(j);
        }
        fore(j, L[i], R[i]+1)
            C[i] = min(C[i], maxder[j]+maxizq[j] - H[j]);
        // fore(j, L[i], R[i]+1)
        //     cout << maxder[j] << " " << maxizq[j] << endl;
    }
    return C;
}
#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...