Submission #1193282

#TimeUsernameProblemLanguageResultExecution timeMemory
1193282GoBananas69Examination (JOI19_examination)C++20
2 / 100
552 ms1114112 KiB
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;

struct Query {
    int s, t, sum;
    int type; // 0: insertion, 1: query
    int idx; // original index for queries
};

class BIT2D {
private:
    vector<vector<int>> tree;
    int sizeT, sizeSum;

public:
    BIT2D(int t_size, int sum_size) : sizeT(t_size), sizeSum(sum_size) {
        tree.resize(t_size + 1, vector<int>(sum_size + 1, 0));
    }

    void update(int t, int sum, int delta) {
        for (int i = t; i <= sizeT; i += i & -i) {
            for (int j = sum; j <= sizeSum; j += j & -j) {
                tree[i][j] += delta;
            }
        }
    }

    int query(int t, int sum) {
        int res = 0;
        for (int i = t; i > 0; i -= i & -i) {
            for (int j = sum; j > 0; j -= j & -j) {
                res += tree[i][j];
            }
        }
        return res;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, k;
    cin >> n >> k;

    vector<Query> events;

    // Read insertions
    for (int i = 0; i < n; ++i) {
        int s, t;
        cin >> s >> t;
        int sum = s + t;
        events.push_back({s, t, sum, 0, -1});
    }

    // Read queries
    for (int i = 0; i < k; ++i) {
        int s, t, sum;
        cin >> s >> t >> sum;
        events.push_back({s, t, sum, 1, i});
    }

    // Sort events by s descending, t descending, sum descending, insertions first
    sort(events.begin(), events.end(), [](const Query& a, const Query& b) {
        if (a.s != b.s) return a.s > b.s;
        if (a.t != b.t) return a.t > b.t;
        if (a.sum != b.sum) return a.sum > b.sum;
        return a.type < b.type; // insertions come before queries if all else equal
    });

    // Collect all t and sum values for compression
    vector<int> t_values, sum_values;
    for (const auto& event : events) {
        t_values.push_back(event.t);
        sum_values.push_back(event.sum);
    }

    // Compress t
    sort(t_values.begin(), t_values.end());
    t_values.erase(unique(t_values.begin(), t_values.end()), t_values.end());
    int t_size = t_values.size();

    // Compress sum
    sort(sum_values.begin(), sum_values.end());
    sum_values.erase(unique(sum_values.begin(), sum_values.end()), sum_values.end());
    int sum_size = sum_values.size();

    // Function to get compressed t rank
    auto get_t_rank = [&](int t) {
        auto it = lower_bound(t_values.begin(), t_values.end(), t);
        return (it - t_values.begin()) + 1; // ranks start from 1
    };

    // Function to get compressed sum rank
    auto get_sum_rank = [&](int sum) {
        auto it = lower_bound(sum_values.begin(), sum_values.end(), sum);
        return (it - sum_values.begin()) + 1;
    };

    BIT2D bit(t_size, sum_size);
    vector<int> res(k, 0);

    for (const auto& event : events) {
        if (event.type == 0) { // Insertion
            int t_rank = get_t_rank(event.t);
            int sum_rank = get_sum_rank(event.sum);
            bit.update(t_rank, sum_rank, 1);
        } else { // Query
            int t_rank = get_t_rank(event.t);
            int sum_rank = get_sum_rank(event.sum);

            int M = t_size;
            int N = sum_size;

            int part1 = bit.query(M, N);
            int part2 = (t_rank > 1) ? bit.query(t_rank - 1, N) : 0;
            int part3 = (sum_rank > 1) ? bit.query(M, sum_rank - 1) : 0;
            int part4 = (t_rank > 1 && sum_rank > 1) ? bit.query(t_rank - 1, sum_rank - 1) : 0;

            int cnt = part1 - part2 - part3 + part4;
            res[event.idx] = cnt;
        }
    }

    for (int i = 0; i < k; ++i) {
        cout << res[i] << '\n';
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...