제출 #1328321

#제출 시각아이디문제언어결과실행 시간메모리
1328321hoangtien69Examination (JOI19_examination)C++20
100 / 100
193 ms23432 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int MAXN = 2e5 + 5;

struct peal
{
    int s, t, sum;
    int id;
    int type;

    bool operator < (const peal &other) const
    {
        if (s != other.s)
        {
            return s > other.s;
        }
        return type < other.type;
    }
};

int n, q;
int s, t;
vector<peal> a;
vector<peal> b;
vector<int> lon;
int bit[MAXN];
int maxx;
int ans[MAXN];

void update(int pos, int val)
{
    for (int i = pos; i <= maxx; i += i & -i)
    {
        bit[i] += val;
    }
}
int query(int idx)
{
    int res = 0;
    for (int i = idx; i > 0; i -= i & -i)
    {
        res += bit[i];
    }
    return res;
}

void cdq(int l, int r)
{
    if (l >= r)
    {
        return;
    }
    int mid = (l + r) / 2;
    cdq(l, mid);
    cdq(mid + 1, r);
    int i = l;
    int j = mid + 1;
    int k = l;
    int total = 0;

    while(i <= mid and j <= r)
    {
        if (a[i].t >= a[j].t)
        {
            if (a[i].type == 0)
            {
                update(a[i].sum, 1);
                total++;
            }
            b[k++] = a[i++];
        }
        else
        {
            if (a[j].type == 1)
            {
                int cur = query(a[j].sum - 1);
                ans[a[j].id] += total - cur;
            }
            b[k++] = a[j++];
        }
    }
    while(i <= mid)
    {
        if (a[i].type == 0)
        {
            update(a[i].sum, 1);
            total++;
        }
        b[k++] = a[i++];
    }
    while(j <= r)
    {
        if (a[j].type == 1)
        {
            int cur = query(a[j].sum - 1);
            ans[a[j].id] += total - cur;
        }
        b[k++] = a[j++];
    }
    for (int p = l; p <= mid; p++)
    {
        if (a[p].type == 0)
        {
            update(a[p].sum, -1);
        }
    }
    for (int p = l; p <= r; p++)
    {
        a[p] = b[p];
    }
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> q;
    for (int i = 0; i < n; i++)
    {
        int s, t;
        cin >> s >> t;
        a.push_back({s, t, s + t, -1, 0});
        lon.push_back(s + t);
    }
    for (int i = 0; i < q; i++)
    {
        int x, y, z;
        cin >> x >> y >> z;
        a.push_back({x, y, z, i, 1});
        lon.push_back(z);
    }
    sort(lon.begin(), lon.end());
    lon.erase(unique(lon.begin(), lon.end()), lon.end());
    maxx = lon.size();
    for (auto &e : a)
    {
        e.sum = lower_bound(lon.begin(), lon.end(), e.sum) - lon.begin() + 1;
    }
    sort(a.begin(), a.end());
    b.resize(n + q);
    memset(bit, 0, sizeof(bit));
    memset(ans, 0, sizeof(ans));
    cdq(0, n + q - 1);
    for (int i = 0; i < q; i++)
    {
        cout << ans[i] << "\n";
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...