제출 #1199050

#제출 시각아이디문제언어결과실행 시간메모리
1199050ach00모임들 (IOI18_meetings)C++20
17 / 100
75 ms11592 KiB
#include "meetings.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Node {
    int suffix;
    int prefix;
    int best;
    int l, r;
    Node(int _s, int _p, int _b, int _l, int _r) {
        suffix = _s;
        prefix = _p;
        best = _b;
        l = _l;
        r = _r;
    }

};
const Node ID = Node(0,0,0,-1, -1);
vector<Node> ST;
vector<int> h;
int N,n;

int L(int i) {return 2*i;}
int R(int i) {return 2*i + 1;}
Node merge(Node v1, Node v2) {
    if(v1.l == -1) return Node(v2);
    if(v2.l == -1) return Node(v1);
    int nb = max(v1.suffix + v2.prefix, max(v1.best, v2.best));
    int np = (v1.prefix == v1.r - v1.l + 1) ? (v1.prefix + v2.prefix) : (v1.prefix);
    int ns = (v2.suffix == v2.r - v2.l + 1) ? (v2.suffix + v1.suffix) : (v2.suffix);
    int nl = v1.l;
    int nr = v2.r;
    return Node(ns, np, nb, nl, nr);
}
void build(int i, int l, int r) {
    if(l == r) {
        if(h[l] == 1) {
            ST[i] = Node(1, 1, 1, l, r);
        } else {
            ST[i] = Node(0, 0, 0, l, r);
        }
        return;
    }
    int m = (l+r)/2;
    build(L(i), l, m);
    build(R(i), m+1, r);
    ST[i] = merge(ST[L(i)], ST[R(i)]);
}

Node query(int i, int l, int r, int a, int b) {
    if(l > r || a > r || b < l) return ID;
    if(a <= l && r <= b) return ST[i];
    int m = (l+r)/2;
    return merge(query(L(i), l, m, a, b), query(R(i), m+1, r, a, b));
}



vector<ll> minimum_costs(vector<int> H, vector<int> L, vector<int> R) {
    h = H;
    N = n = H.size();
    int Q;
    Q = L.size();
    ST.resize(4*n, ID);
    build(1, 0, n-1);
    vector<ll> ans(Q, -1);
    for(int i = 0; i < Q; i++) {
        Node p = query(1, 0, n-1, L[i], R[i]);
        ll pb = p.best;
        ll r = R[i];
        ll l = L[i];
        ans[i] = 2*(r-l+1) - pb;
    }
    return ans;
}
#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...