제출 #1075070

#제출 시각아이디문제언어결과실행 시간메모리
1075070vladilius모임들 (IOI18_meetings)C++17
60 / 100
5554 ms592080 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
#define ins insert
#define arr3 array<int, 3>
const ll inf = numeric_limits<ll> :: max();

struct ST{
    vector<ll> t;
    int n;
    void init(int ns){
        n = ns;
        t.assign(4 * n, inf);
    }
    void upd(int v, int tl, int tr, int& p, ll& k){
        if (tl == tr){
            t[v] = k;
            return;
        }
        int tm = (tl + tr) / 2, vv = 2 * v;
        if (p <= tm){
            upd(vv, tl, tm, p, k);
        }
        else {
            upd(vv + 1, tm + 1, tr, p, k);
        }
        t[v] = min(t[vv], t[vv + 1]);
    }
    void upd(int p, ll k){
        upd(1, 1, n, p, k);
    }
    ll get(int v, int tl, int tr, int& l, int& r){
        if (l > tr || r < tl) return inf;
        if (l <= tl && tr <= r) return t[v];
        int tm = (tl + tr) / 2, vv = 2 * v;
        return min(get(vv, tl, tm, l, r), get(vv + 1, tm + 1, tr, l, r));
    }
    ll get(int l, int r){
        return get(1, 1, n, l, r);
    }
};

vector<ll> minimum_costs(vector<int> A1, vector<int> L, vector<int> R){
    int n = (int) A1.size(), q = (int) L.size();
    vector<int> a(n + 1);
    for (int i = 1; i <= n; i++) a[i] = A1[i - 1];
    
    vector<int> log(n + 1);
    for (int i = 2; i <= n; i++) log[i] = log[i / 2] + 1;
    const int lg = log[n];
    vector<vector<int>> sp(n + 1, vector<int>(lg + 1));
    for (int i = 1; i <= n; i++) sp[i][0] = a[i];
    for (int j = 1; j <= lg; j++){
        for (int i = 1; i + (1 << j) <= n + 1; i++){
            sp[i][j] = max(sp[i][j - 1], sp[i + (1 << (j - 1))][j - 1]);
        }
    }

    auto get = [&](int l, int r){
        if (l > r) swap(l, r);
        int k = log[r - l + 1];
        return max(sp[l][k], sp[r - (1 << k) + 1][k]);
    };
    
    vector<ll> ret;

    map<int, vector<int>> d;
    for (int i = 1; i <= n; i++) d[a[i]].pb(i);

    vector<int> :: iterator it1, it2;
    map<pii, ll> mp;
    
    auto len = [&](int l, int r){
        return (r - l + 1);
    };
    
    map<int, ST> T;
    for (auto p: d){
        T[p.ff].init((int) p.ss.size());
    }
    
    auto f = [&](int l, int r){
        int mx = get(l, r);
        
        it1 = lower_bound(d[mx].begin(), d[mx].end(), l);
        it2 = upper_bound(d[mx].begin(), d[mx].end(), r); it2--;
        
        ll out = 1LL * mx * len(l, r);
        
        if (l < (*it1)) out = min(out, mp[{l, (*it1) - 1}] + 1LL * mx * (len(l, r) - len(l, (*it1) - 1)));
        if ((*it2) < r) out = min(out, mp[{(*it2) + 1, r}] + 1LL * mx * (len(l, r) - len((*it2) + 1, r)));
        
        int l1 = (int) (it1 - d[mx].begin()) + 1, r1 = (int) (it2 - d[mx].begin());
        if (l1 <= r1){
            out = min(out, T[mx].get(l1, r1) + 1LL * mx * len(l, r));
        }
        return out;
    };
    
    
    function<void(int, int)> build = [&](int l, int r){
        int mx = get(l, r);
        
        it1 = lower_bound(d[mx].begin(), d[mx].end(), l);
        it2 = upper_bound(d[mx].begin(), d[mx].end(), r); it2--;
        
        vector<pii> st;
        vector<arr3> all;
        if (l < (*it1)) st.pb({l, (*it1) - 1});
        for (int i = (int) (it1 - d[mx].begin()); i < (int) (it2 - d[mx].begin()); i++){
            st.pb({d[mx][i] + 1, d[mx][i + 1] - 1});
            all.pb({d[mx][i] + 1, d[mx][i + 1] - 1, i});
        }
        if ((*it2) < r) st.pb({(*it2) + 1, r});
        
        for (auto [l1, r1]: st) build(l1, r1);
        
        for (int i = 0; i < st.size(); i++){
            auto [l1, r1] = st[i];
            for (int j = l1; j <= r1; j++){
                mp[{l1, j}] = f(l1, j);
                mp[{j, r1}] = f(j, r1);
            }
        }
        
        for (auto [l1, r1, jj]: all){
            T[mx].upd(jj + 1, mp[{l1, r1}] - 1LL * mx * len(l1, r1));
        }

    };
    build(1, n);
    
    for (int i = 0; i < q; i++){
        int l, r; // cin>>l>>r;
        l = L[i]; r = R[i];
        l++; r++;

        ret.pb(f(l, r));
    }
    return ret;
}

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

meetings.cpp: In lambda function:
meetings.cpp:122:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |         for (int i = 0; i < st.size(); i++){
      |                         ~~^~~~~~~~~~~
#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...