답안 #852614

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
852614 2023-09-22T08:21:51 Z danikoynov 푸드 코트 (JOI21_foodcourt) C++14
24 / 100
526 ms 59088 KB
/**
 ____ ____ ____ ____ ____ ____
||l |||e |||i |||n |||a |||d ||
||__|||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|/__\|

**/

#include<bits/stdc++.h>
#define endl '\n'

using namespace std;
typedef long long ll;

void speed()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
}

const int maxn = 250010;
const ll inf = 1e18;
struct node
{
    ll min_val, min_lf, min_rf;

    node(ll  _min_val = inf, ll _min_lf = -1, ll _min_rf = -1)
    {
        min_val = _min_val;
        min_lf = _min_lf;
        min_rf = _min_rf;
    }
};

node merge_nodes(node lf, node rf)
{
    if (lf.min_val < rf.min_val)
        return lf;
    if (rf.min_val < lf.min_val)
    return rf;

    node cur = lf;
    if (lf.min_rf == rf.min_lf - 1)
    {
        cur.min_rf = rf.min_rf;
    }
    return cur;
}

struct segment_tree
{
    node tree[4 * maxn];
    ll lazy[4 * maxn];

    void push_lazy(int root, int left, int right)
    {
        tree[root].min_val += lazy[root];
        if (left != right)
        {
            lazy[root * 2] += lazy[root];
            lazy[root * 2 + 1] += lazy[root];
        }
        lazy[root] = 0;
    }

    void build(int root, int left, int right)
    {
        if (left == right)
        {
            tree[root].min_lf = left;
            tree[root].min_rf = right;
            tree[root].min_val = 0;
            return;
        }

        int mid = (left + right) / 2;
        build(root * 2, left, mid);
        build(root * 2 + 1, mid + 1, right);

        tree[root] = merge_nodes(tree[root * 2], tree[root * 2 + 1]);
    }
    void update(int root, int left, int right, int qleft, int qright, int cur)
    {
        push_lazy(root, left, right);

        if (left > qright || right < qleft)
            return;

        if (left >= qleft && right <= qright)
        {
            lazy[root] = cur;
            push_lazy(root, left, right);
            return;
        }

        int mid = (left + right) / 2;
        update(root * 2, left, mid, qleft, qright, cur);
        update(root * 2 + 1, mid + 1, right, qleft, qright, cur);

        tree[root] = merge_nodes(tree[root * 2], tree[root * 2 + 1]);
    }

    node query(int root, int left, int right, int qleft, int qright)
    {
        push_lazy(root, left, right);
        if (left > qright || right < qleft)
            return node();
        if (left >= qleft && right <= qright)
            return tree[root];

        int mid = (left + right) / 2;
        return merge_nodes(query(root * 2, left, mid, qleft, qright),
                           query(root * 2 + 1, mid + 1, right, qleft, qright));
    }

};



int n, m, q;
void input()
{
    cin >> n >> m >> q;
}

struct task
{
    int idx, pos;

    task(int _idx = 0, int _pos = 0)
    {
        idx = _idx;

        pos = _pos;
    }
};

struct bit
{
    ll fen[maxn];

    void update(int pos, ll val)
    {
        for (int i = pos; i < maxn; i += (i & -i))
            fen[i] += val;
    }

    ll query(int pos)
    {
        ll sum = 0;
        for (int i = pos; i > 0; i -= (i & -i))
            sum += fen[i];
        return sum;
    }

    void range_update(int l, int r, ll v)
    {
        update(l, v);
        update(r + 1, - v);
    }

    int find_kth(ll to)
    {
        int pos = 0;
        ll sum = 0;
        for (int bit = 20; bit >= 0; bit --)
        {
            if (pos + (1 << bit) > maxn)
                continue;
            ll new_sum = sum + fen[pos + (1 << bit)];
            if (new_sum < to)
            {
                pos = pos + (1 << bit);
                sum = new_sum;
            }
        }
        return pos + 1;
    }
};

vector < task > ask[maxn];
segment_tree line_tree;
bit pass_tree;
int ans[maxn];


pair < int, int > add[maxn];
vector < int > upd[maxn];
int query_cnt = 0;
void simulate()
{
    line_tree.build(1, 1, n);
    int t, l, r, c, a; /// careful overflow
    ll k, b;


    for (int i = 1; i <= q; i ++)
    {
        cin >> t;
        if (t == 1)
        {
            cin >> l >> r >> c >> k;
            line_tree.update(1, 1, n, l, r, k);
            add[i] = {c, k};
            upd[l].push_back(i);
            upd[r + 1].push_back(-i);
        }
        else
        if (t == 2)
        {
            cin >> l >> r >> k;
            line_tree.update(1, 1, n, l, r, -k);
            pass_tree.range_update(l, r, k);
            node cur;
            while(true)
            {
                cur = line_tree.query(1, 1, n, l, r);
                if (cur.min_val >= 0)
                    break;
                pass_tree.range_update(cur.min_lf, cur.min_rf, cur.min_val);
                line_tree.update(1, 1, n, cur.min_lf, cur.min_rf, - cur.min_val);
            }
        }
        else
        {
            cin >> a >> b;
            query_cnt ++;
            if (line_tree.query(1, 1, n, a, a).min_val < b)
            {
                ans[query_cnt] = 0;
            }
            else
            {
                ///cout << "here " << query_cnt << " " << pass_tree.query(a) << " " << line_tree.query(1, 1, n, a, a).min_val << endl;
                ask[a].push_back(task(query_cnt, pass_tree.query(a) + b));
            }
        }
    }
}

bit active;
void answer_tasks()
{
    for (int i = 1; i <= n; i ++)
    {
        for (int cur : upd[i])
        {
            if (cur > 0)
            {
                active.update(cur, add[cur].second);
            }
            else
            {
                active.update(-cur, - add[-cur].second);
            }
        }

        for (task cur : ask[i])
        {
            ans[cur.idx] = add[active.find_kth(cur.pos)].first;
            ///cout << cur.idx << " : " << cur.shop << " " << cur.pos << endl;
        }
    }
    for (int i = 1; i <= query_cnt; i ++)
    {
        cout << ans[i] << endl;
    }
}

void solve()
{
    input();
    simulate();
    answer_tasks();
}

int main()
{
    speed();
    solve();
    return 0;
}

# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 44120 KB Output is correct
2 Correct 9 ms 44120 KB Output is correct
3 Correct 8 ms 44124 KB Output is correct
4 Correct 8 ms 44120 KB Output is correct
5 Correct 7 ms 44120 KB Output is correct
6 Correct 7 ms 43864 KB Output is correct
7 Correct 9 ms 42076 KB Output is correct
8 Correct 8 ms 44120 KB Output is correct
9 Correct 9 ms 44120 KB Output is correct
10 Correct 8 ms 42076 KB Output is correct
11 Correct 10 ms 42072 KB Output is correct
12 Correct 8 ms 42076 KB Output is correct
13 Correct 7 ms 44120 KB Output is correct
14 Correct 8 ms 44120 KB Output is correct
15 Correct 8 ms 44120 KB Output is correct
16 Correct 9 ms 44124 KB Output is correct
17 Correct 9 ms 42072 KB Output is correct
18 Correct 9 ms 44120 KB Output is correct
19 Correct 9 ms 44124 KB Output is correct
20 Correct 8 ms 42072 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 44120 KB Output is correct
2 Correct 9 ms 44120 KB Output is correct
3 Correct 8 ms 44124 KB Output is correct
4 Correct 8 ms 44120 KB Output is correct
5 Correct 7 ms 44120 KB Output is correct
6 Correct 7 ms 43864 KB Output is correct
7 Correct 9 ms 42076 KB Output is correct
8 Correct 8 ms 44120 KB Output is correct
9 Correct 9 ms 44120 KB Output is correct
10 Correct 8 ms 42076 KB Output is correct
11 Correct 10 ms 42072 KB Output is correct
12 Correct 8 ms 42076 KB Output is correct
13 Correct 7 ms 44120 KB Output is correct
14 Correct 8 ms 44120 KB Output is correct
15 Correct 8 ms 44120 KB Output is correct
16 Correct 9 ms 44124 KB Output is correct
17 Correct 9 ms 42072 KB Output is correct
18 Correct 9 ms 44120 KB Output is correct
19 Correct 9 ms 44124 KB Output is correct
20 Correct 8 ms 42072 KB Output is correct
21 Incorrect 10 ms 44120 KB Output isn't correct
22 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 109 ms 48384 KB Output is correct
2 Correct 121 ms 48720 KB Output is correct
3 Correct 110 ms 48412 KB Output is correct
4 Correct 121 ms 48548 KB Output is correct
5 Correct 130 ms 48720 KB Output is correct
6 Correct 121 ms 48568 KB Output is correct
7 Correct 23 ms 45392 KB Output is correct
8 Correct 24 ms 45396 KB Output is correct
9 Correct 108 ms 46928 KB Output is correct
10 Correct 125 ms 48468 KB Output is correct
11 Correct 117 ms 48464 KB Output is correct
12 Correct 121 ms 48464 KB Output is correct
13 Correct 94 ms 47440 KB Output is correct
14 Correct 90 ms 48720 KB Output is correct
15 Correct 102 ms 48720 KB Output is correct
16 Correct 112 ms 47696 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 526 ms 59088 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 44120 KB Output is correct
2 Correct 9 ms 44120 KB Output is correct
3 Correct 8 ms 44124 KB Output is correct
4 Correct 8 ms 44120 KB Output is correct
5 Correct 7 ms 44120 KB Output is correct
6 Correct 7 ms 43864 KB Output is correct
7 Correct 9 ms 42076 KB Output is correct
8 Correct 8 ms 44120 KB Output is correct
9 Correct 9 ms 44120 KB Output is correct
10 Correct 8 ms 42076 KB Output is correct
11 Correct 10 ms 42072 KB Output is correct
12 Correct 8 ms 42076 KB Output is correct
13 Correct 7 ms 44120 KB Output is correct
14 Correct 8 ms 44120 KB Output is correct
15 Correct 8 ms 44120 KB Output is correct
16 Correct 9 ms 44124 KB Output is correct
17 Correct 9 ms 42072 KB Output is correct
18 Correct 9 ms 44120 KB Output is correct
19 Correct 9 ms 44124 KB Output is correct
20 Correct 8 ms 42072 KB Output is correct
21 Correct 109 ms 48384 KB Output is correct
22 Correct 121 ms 48720 KB Output is correct
23 Correct 110 ms 48412 KB Output is correct
24 Correct 121 ms 48548 KB Output is correct
25 Correct 130 ms 48720 KB Output is correct
26 Correct 121 ms 48568 KB Output is correct
27 Correct 23 ms 45392 KB Output is correct
28 Correct 24 ms 45396 KB Output is correct
29 Correct 108 ms 46928 KB Output is correct
30 Correct 125 ms 48468 KB Output is correct
31 Correct 117 ms 48464 KB Output is correct
32 Correct 121 ms 48464 KB Output is correct
33 Correct 94 ms 47440 KB Output is correct
34 Correct 90 ms 48720 KB Output is correct
35 Correct 102 ms 48720 KB Output is correct
36 Correct 112 ms 47696 KB Output is correct
37 Correct 83 ms 48472 KB Output is correct
38 Correct 57 ms 48296 KB Output is correct
39 Correct 20 ms 45144 KB Output is correct
40 Correct 22 ms 45144 KB Output is correct
41 Correct 90 ms 47184 KB Output is correct
42 Correct 103 ms 48716 KB Output is correct
43 Correct 99 ms 48568 KB Output is correct
44 Correct 97 ms 48976 KB Output is correct
45 Correct 82 ms 47084 KB Output is correct
46 Correct 94 ms 48720 KB Output is correct
47 Correct 36 ms 47872 KB Output is correct
48 Correct 72 ms 47952 KB Output is correct
49 Correct 82 ms 47796 KB Output is correct
50 Correct 99 ms 46672 KB Output is correct
51 Correct 118 ms 47232 KB Output is correct
52 Correct 116 ms 48728 KB Output is correct
53 Correct 74 ms 46928 KB Output is correct
54 Correct 88 ms 48972 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 59 ms 47440 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 44120 KB Output is correct
2 Correct 9 ms 44120 KB Output is correct
3 Correct 8 ms 44124 KB Output is correct
4 Correct 8 ms 44120 KB Output is correct
5 Correct 7 ms 44120 KB Output is correct
6 Correct 7 ms 43864 KB Output is correct
7 Correct 9 ms 42076 KB Output is correct
8 Correct 8 ms 44120 KB Output is correct
9 Correct 9 ms 44120 KB Output is correct
10 Correct 8 ms 42076 KB Output is correct
11 Correct 10 ms 42072 KB Output is correct
12 Correct 8 ms 42076 KB Output is correct
13 Correct 7 ms 44120 KB Output is correct
14 Correct 8 ms 44120 KB Output is correct
15 Correct 8 ms 44120 KB Output is correct
16 Correct 9 ms 44124 KB Output is correct
17 Correct 9 ms 42072 KB Output is correct
18 Correct 9 ms 44120 KB Output is correct
19 Correct 9 ms 44124 KB Output is correct
20 Correct 8 ms 42072 KB Output is correct
21 Incorrect 10 ms 44120 KB Output isn't correct
22 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 44120 KB Output is correct
2 Correct 9 ms 44120 KB Output is correct
3 Correct 8 ms 44124 KB Output is correct
4 Correct 8 ms 44120 KB Output is correct
5 Correct 7 ms 44120 KB Output is correct
6 Correct 7 ms 43864 KB Output is correct
7 Correct 9 ms 42076 KB Output is correct
8 Correct 8 ms 44120 KB Output is correct
9 Correct 9 ms 44120 KB Output is correct
10 Correct 8 ms 42076 KB Output is correct
11 Correct 10 ms 42072 KB Output is correct
12 Correct 8 ms 42076 KB Output is correct
13 Correct 7 ms 44120 KB Output is correct
14 Correct 8 ms 44120 KB Output is correct
15 Correct 8 ms 44120 KB Output is correct
16 Correct 9 ms 44124 KB Output is correct
17 Correct 9 ms 42072 KB Output is correct
18 Correct 9 ms 44120 KB Output is correct
19 Correct 9 ms 44124 KB Output is correct
20 Correct 8 ms 42072 KB Output is correct
21 Incorrect 10 ms 44120 KB Output isn't correct
22 Halted 0 ms 0 KB -