4093 2023. 03. 13 22:20:03 Szin Attila Zárójelek cpp14 Hibás válasz 14/100 39ms 17344 KiB
#include <bits/stdc++.h>
using namespace std;
#define InTheNameOfGod ios::sync_with_stdio(0);cin.tie(0); cout.tie(0);
using ll = long long;

const int maxN = 2e5 + 5;
const int MOD = 1e9 + 7;
const int INF = 1e9 + 7;


struct Node {
    int val, ind, l, r;
    bool leaf;
    Node() {
        val = -INF;
        ind = -INF;
        leaf = 0;
    }

    Node(int _val, int _ind, int _l, int _r) : val(_val), ind(_ind), l(_l), r(_r) {
        leaf = (l == r);
    }
};
struct SegTree {
    vector<Node> t;
    int maxn;

    void build(int v, int l, int r) {
        if(v >= 4*maxn) return;

        t[v] = {-INF, -INF, l, r};
        int mid = (l+r)/2;
        build(v*2, l, mid);
        build(v*2+1, mid+1, r);
    }

    SegTree(int n) : maxn(n) {
        t.resize(maxn*4);
        build(1, 1, maxn);
    }

    void update(int v, int pos, int val) {
        int vl = t[v].l, vr = t[v].r;
        int mid = (vl+vr)/2;

        if(t[v].leaf) {
            t[v].val = val;
            t[v].ind = pos;
            return;
        }

        if(pos <= mid) {
            update(v*2, pos, val);
        }
        else {
            update(v*2+1, pos, val);
        }

        if(t[v*2].val >= t[v*2+1].val) {
            t[v].val = t[v*2].val;
            t[v].ind = t[v*2].ind;
        }
        else{
            t[v].val = t[v*2+1].val;
            t[v].ind = t[v*2+1].ind;
        }
    }

    pair<int, int> query(int v, int ql, int qr) {
        int vl = t[v].l, vr = t[v].r;
        ql = max(ql, vl);
        qr = min(qr, vr);
        if(ql > qr) return {-INF, -INF};
        if(vl == ql && vr == qr) return {t[v].val, t[v].ind};

        pair<int, int> ret1 = query(v*2, ql, qr), ret2 = query(v*2+1, ql, qr);

        if(ret1.first > ret2.first) return ret1;
        else return ret2;
    }
};

int main() {
   InTheNameOfGod;

    int n;
    cin >> n;

    vector<string> s(n);
    vector<pair<int, pair<int, int> > > v(n);
    for(int i = 0; i < n; i++) {
        cin >> s[i];
        int minval = 0, curr = 0;
        for(char c : s[i]) {
            if(c == '(') curr++;
            else curr--;
            minval = min(minval, curr);
        }
        v[i] = {minval, {curr, i}};
    }

    sort(v.begin(), v.end());
    reverse(v.begin(), v.end());

    SegTree seg = SegTree(n+1);
    for(int i = 1; i <= n; i++) {
        seg.update(1, i, v[i-1].second.first);
        //cout << i << ": " << v[i-1].first << ", " << v[i-1].second.first << ", " << v[i-1].second.second << endl;
    }

    vector<int> mo;

    int curr = 0;
    for(int i = 0; i < n; i++) {
        int l = 0, r = n-1, ki;
        while(l <= r) {
            int mid = (l+r)/2;
            if(-v[mid].first <= curr) {
                l = mid+1;
                ki = mid;
            }
            else {
                r = mid-1;
            }
        }

        pair<int, int> ret = seg.query(1, 1, ki+1);
        curr += ret.first;
        if(ret.first == -INF || curr < 0) break;

        //cout << "return: " << ret.first << ", " << ret.second << endl;
        mo.push_back(v[ret.second-1].second.second);
        seg.update(1, ret.second, -INF);
        /*cout << "\n----\n";
        for(int i = 1; i <= 7; i++) {
            cout << i << ": " << seg.t[i].ind << ", " << seg.t[i].val << ", " << seg.t[i].l << ", " << seg.t[i].r << endl;
        }
        cout << "\n----\n";*/
    }

    if((int)mo.size() < n) cout << "-1";
    else for(int i : mo) cout << i + 1 << ' ';
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1892 KiB
2 Elfogadva 4ms 2964 KiB
subtask2 0/11
3 Elfogadva 3ms 2332 KiB
4 Elfogadva 3ms 2780 KiB
5 Hibás válasz 3ms 2856 KiB
6 Elfogadva 2ms 2824 KiB
7 Elfogadva 3ms 3392 KiB
8 Hibás válasz 3ms 3388 KiB
subtask3 0/6
9 Elfogadva 4ms 3668 KiB
10 Hibás válasz 4ms 3792 KiB
11 Elfogadva 4ms 3928 KiB
subtask4 14/14
12 Elfogadva 4ms 4160 KiB
13 Elfogadva 4ms 4112 KiB
subtask5 0/23
14 Hibás válasz 4ms 4084 KiB
15 Hibás válasz 4ms 4304 KiB
subtask6 0/19
16 Hibás válasz 3ms 3952 KiB
17 Hibás válasz 4ms 4312 KiB
18 Elfogadva 4ms 4428 KiB
19 Hibás válasz 4ms 4752 KiB
20 Hibás válasz 4ms 4600 KiB
21 Elfogadva 4ms 4476 KiB
22 Elfogadva 4ms 4504 KiB
23 Elfogadva 4ms 4500 KiB
24 Elfogadva 4ms 4476 KiB
subtask7 0/27
25 Elfogadva 3ms 4304 KiB
26 Hibás válasz 4ms 4640 KiB
27 Elfogadva 6ms 5136 KiB
28 Hibás válasz 6ms 5352 KiB
29 Elfogadva 10ms 7452 KiB
30 Hibás válasz 39ms 17344 KiB
31 Hibás válasz 6ms 5864 KiB
32 Hibás válasz 7ms 6300 KiB
33 Hibás válasz 4ms 5764 KiB
34 Hibás válasz 8ms 6660 KiB
35 Hibás válasz 4ms 5496 KiB
36 Hibás válasz 8ms 7124 KiB
37 Elfogadva 4ms 5408 KiB
38 Hibás válasz 4ms 5608 KiB
39 Hibás válasz 17ms 10388 KiB
40 Elfogadva 4ms 5348 KiB
41 Elfogadva 3ms 5032 KiB
42 Elfogadva 4ms 5668 KiB
43 Elfogadva 4ms 5472 KiB