답안 #733373

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
733373 2023-04-30T15:20:47 Z benjaminkleyn Examination (JOI19_examination) C++17
100 / 100
696 ms 55300 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

struct Query
{
    int A, B, C, idx;
    int a, b;
    Query() : a(0), b(0), A(0), B(0), C(0), idx(0) {}
    Query(int _a, int _b, int _c, int _idx) : a(0), b(0), A(_a), B(_b), C(_c), idx(_idx) {}
};

struct Student
{
    int S, T, idx;
    int s, t;
    Student() : s(0), t(0), S(0), T(0), idx(0) {}
};

int n, q;

struct SegTree
{
    int t[1000000] = {0};
    SegTree() {}
    void update(int idx, int v = 1, int tl = 0, int tr = 200000)
    {
        if (tl == tr)
        {
            t[v]++;
            return;
        }
        int tm = (tl + tr) / 2;
        if (idx <= tm)
            update(idx, 2 * v, tl, tm);
        else
            update(idx, 2 * v + 1, tm + 1, tr);
        t[v] = t[2 * v] + t[2 * v + 1];
    }
    int query(int l, int r, int v = 1, int tl = 0, int tr = 200000)
    {
        if (l > r || r < tl || tr < l)
            return 0;
        if (l <= tl && tr <= r)
            return t[v];
        int tm = (tl + tr) / 2;
        return query(l, r, 2 * v, tl, tm) + query(l, r, 2 * v + 1, tm + 1, tr);
    }
};

int main()
{
    cin.tie(0)->sync_with_stdio(0);

    cin >> n >> q;

    set<int> a_vals, b_vals;

    vector<Student> students(n);
    for (Student &x : students)
    {
        cin >> x.S >> x.T;
        a_vals.insert(x.S);
        b_vals.insert(x.T);
    }

    vector<Query> type1, type2;
    for (int i = 0, a, b, c; i < q; i++)
    {
        cin >> a >> b >> c;
        if (a + b >= c)
            type1.push_back(Query(a, b, c, i));
        else
            type2.push_back(Query(a, b, c, i));

        a_vals.insert(a);
        b_vals.insert(b);
    }

    unordered_map<int, int> smolA, smolB;
    int mxA = 0;
    for (int a : a_vals)
        smolA[a] = mxA++;
    int mxB = 0;
    for (int b : b_vals)
        smolB[b] = mxB++;

    for (Student &x : students)
    {
        x.s = smolA[x.S];
        x.t = smolB[x.T];
    }
    for (Query &Q : type1)
    {
        Q.a = smolA[Q.A];
        Q.b = smolB[Q.B];
    }
    for (Query &Q : type2)
    {
        Q.a = smolA[Q.A];
        Q.b = smolB[Q.B];
    }

    vector<int> res(q);

    SegTree seg1;
    sort(type1.begin(), type1.end(), [] (const Query &X, const Query &Y) {return X.A > Y.A;});
    sort(students.begin(), students.end(), [] (const Student &X, const Student &Y) {return X.S > Y.S;});
    int i = 0;
    for (const Query &Q : type1)
    {
        while (i < n && students[i].S >= Q.A)
            seg1.update(students[i++].t);
        res[Q.idx] = seg1.query(Q.b, 200000);
    }

    seg1 = SegTree();
    SegTree seg2;
    sort(type2.begin(), type2.end(), [] (const Query &X, const Query &Y) {return X.C > Y.C;});
    sort(students.begin(), students.end(), [] (const Student &X, const Student &Y) {return X.S + X.T > Y.S + Y.T;});
    i = 0;
    for (const Query &Q : type2)
    {
        while (i < n && students[i].S + students[i].T >= Q.C)
        {
            seg1.update(students[i].s);
            seg2.update(students[i].t);
            i++;
        }
        res[Q.idx] = seg1.query(Q.a, 200000) - seg2.query(0, Q.b - 1);
    }

    for (int j = 0; j < q; j++)
        cout << res[j] << '\n';

    return 0;
}

Compilation message

examination.cpp: In constructor 'Query::Query()':
examination.cpp:8:12: warning: 'Query::b' will be initialized after [-Wreorder]
    8 |     int a, b;
      |            ^
examination.cpp:7:9: warning:   'int Query::A' [-Wreorder]
    7 |     int A, B, C, idx;
      |         ^
examination.cpp:9:5: warning:   when initialized here [-Wreorder]
    9 |     Query() : a(0), b(0), A(0), B(0), C(0), idx(0) {}
      |     ^~~~~
examination.cpp: In constructor 'Query::Query(int, int, int, int)':
examination.cpp:8:12: warning: 'Query::b' will be initialized after [-Wreorder]
    8 |     int a, b;
      |            ^
examination.cpp:7:9: warning:   'int Query::A' [-Wreorder]
    7 |     int A, B, C, idx;
      |         ^
examination.cpp:10:5: warning:   when initialized here [-Wreorder]
   10 |     Query(int _a, int _b, int _c, int _idx) : a(0), b(0), A(_a), B(_b), C(_c), idx(_idx) {}
      |     ^~~~~
examination.cpp: In constructor 'Student::Student()':
examination.cpp:16:12: warning: 'Student::t' will be initialized after [-Wreorder]
   16 |     int s, t;
      |            ^
examination.cpp:15:9: warning:   'int Student::S' [-Wreorder]
   15 |     int S, T, idx;
      |         ^
examination.cpp:17:5: warning:   when initialized here [-Wreorder]
   17 |     Student() : s(0), t(0), S(0), T(0), idx(0) {}
      |     ^~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 8020 KB Output is correct
2 Correct 5 ms 8148 KB Output is correct
3 Correct 5 ms 8044 KB Output is correct
4 Correct 4 ms 8020 KB Output is correct
5 Correct 6 ms 8128 KB Output is correct
6 Correct 4 ms 8020 KB Output is correct
7 Correct 14 ms 9428 KB Output is correct
8 Correct 13 ms 9556 KB Output is correct
9 Correct 14 ms 9512 KB Output is correct
10 Correct 12 ms 8976 KB Output is correct
11 Correct 11 ms 8928 KB Output is correct
12 Correct 8 ms 8288 KB Output is correct
13 Correct 13 ms 9428 KB Output is correct
14 Correct 13 ms 9428 KB Output is correct
15 Correct 12 ms 9508 KB Output is correct
16 Correct 10 ms 8924 KB Output is correct
17 Correct 10 ms 8996 KB Output is correct
18 Correct 7 ms 8304 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 274 ms 29832 KB Output is correct
2 Correct 257 ms 29844 KB Output is correct
3 Correct 255 ms 29884 KB Output is correct
4 Correct 151 ms 21672 KB Output is correct
5 Correct 151 ms 21652 KB Output is correct
6 Correct 71 ms 13360 KB Output is correct
7 Correct 218 ms 27712 KB Output is correct
8 Correct 234 ms 27372 KB Output is correct
9 Correct 204 ms 25152 KB Output is correct
10 Correct 144 ms 21604 KB Output is correct
11 Correct 129 ms 21628 KB Output is correct
12 Correct 65 ms 13248 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 274 ms 29832 KB Output is correct
2 Correct 257 ms 29844 KB Output is correct
3 Correct 255 ms 29884 KB Output is correct
4 Correct 151 ms 21672 KB Output is correct
5 Correct 151 ms 21652 KB Output is correct
6 Correct 71 ms 13360 KB Output is correct
7 Correct 218 ms 27712 KB Output is correct
8 Correct 234 ms 27372 KB Output is correct
9 Correct 204 ms 25152 KB Output is correct
10 Correct 144 ms 21604 KB Output is correct
11 Correct 129 ms 21628 KB Output is correct
12 Correct 65 ms 13248 KB Output is correct
13 Correct 290 ms 29792 KB Output is correct
14 Correct 274 ms 29876 KB Output is correct
15 Correct 240 ms 29832 KB Output is correct
16 Correct 175 ms 21692 KB Output is correct
17 Correct 174 ms 21644 KB Output is correct
18 Correct 85 ms 13812 KB Output is correct
19 Correct 291 ms 29824 KB Output is correct
20 Correct 313 ms 29848 KB Output is correct
21 Correct 271 ms 27124 KB Output is correct
22 Correct 142 ms 21568 KB Output is correct
23 Correct 131 ms 21568 KB Output is correct
24 Correct 75 ms 13212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 8020 KB Output is correct
2 Correct 5 ms 8148 KB Output is correct
3 Correct 5 ms 8044 KB Output is correct
4 Correct 4 ms 8020 KB Output is correct
5 Correct 6 ms 8128 KB Output is correct
6 Correct 4 ms 8020 KB Output is correct
7 Correct 14 ms 9428 KB Output is correct
8 Correct 13 ms 9556 KB Output is correct
9 Correct 14 ms 9512 KB Output is correct
10 Correct 12 ms 8976 KB Output is correct
11 Correct 11 ms 8928 KB Output is correct
12 Correct 8 ms 8288 KB Output is correct
13 Correct 13 ms 9428 KB Output is correct
14 Correct 13 ms 9428 KB Output is correct
15 Correct 12 ms 9508 KB Output is correct
16 Correct 10 ms 8924 KB Output is correct
17 Correct 10 ms 8996 KB Output is correct
18 Correct 7 ms 8304 KB Output is correct
19 Correct 274 ms 29832 KB Output is correct
20 Correct 257 ms 29844 KB Output is correct
21 Correct 255 ms 29884 KB Output is correct
22 Correct 151 ms 21672 KB Output is correct
23 Correct 151 ms 21652 KB Output is correct
24 Correct 71 ms 13360 KB Output is correct
25 Correct 218 ms 27712 KB Output is correct
26 Correct 234 ms 27372 KB Output is correct
27 Correct 204 ms 25152 KB Output is correct
28 Correct 144 ms 21604 KB Output is correct
29 Correct 129 ms 21628 KB Output is correct
30 Correct 65 ms 13248 KB Output is correct
31 Correct 290 ms 29792 KB Output is correct
32 Correct 274 ms 29876 KB Output is correct
33 Correct 240 ms 29832 KB Output is correct
34 Correct 175 ms 21692 KB Output is correct
35 Correct 174 ms 21644 KB Output is correct
36 Correct 85 ms 13812 KB Output is correct
37 Correct 291 ms 29824 KB Output is correct
38 Correct 313 ms 29848 KB Output is correct
39 Correct 271 ms 27124 KB Output is correct
40 Correct 142 ms 21568 KB Output is correct
41 Correct 131 ms 21568 KB Output is correct
42 Correct 75 ms 13212 KB Output is correct
43 Correct 599 ms 55300 KB Output is correct
44 Correct 583 ms 55132 KB Output is correct
45 Correct 676 ms 55132 KB Output is correct
46 Correct 417 ms 35128 KB Output is correct
47 Correct 356 ms 35064 KB Output is correct
48 Correct 99 ms 15380 KB Output is correct
49 Correct 696 ms 55008 KB Output is correct
50 Correct 630 ms 55148 KB Output is correct
51 Correct 568 ms 55140 KB Output is correct
52 Correct 276 ms 34948 KB Output is correct
53 Correct 240 ms 34220 KB Output is correct