제출 #1160123

#제출 시각아이디문제언어결과실행 시간메모리
1160123HanksburgerAdvertisement 2 (JOI23_ho_t2)C++20
59 / 100
1626 ms1114112 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
vector<pair<int, int> > vec;
vector<int> seg, iL, iR, jL, jR;
int a, b, num=1000000000;
void create()
{
    seg.push_back(0);
    iL.push_back(0);
    iR.push_back(0);
    jL.push_back(0);
    jR.push_back(0);
}
void upd2(int i, int l, int r)
{
    //cout << "upd2 " << i << ' ' << l << ' ' << r << '\n';
    if (l==r)
    {
        seg[i]++;
        return;
    }
    int mid=(l+r)/2;
    if (b<=mid)
    {
        if (!jL[i])
        {
            jL[i]=seg.size();
            create();
        }
        upd2(jL[i], l, mid);
    }
    else
    {
        if (!jR[i])
        {
            jR[i]=seg.size();
            create();
        }
        upd2(jR[i], mid+1, r);
    }
    seg[i]=seg[jL[i]]+seg[jR[i]];
}
void upd1(int i, int l, int r)
{
    //cout << "upd1 " << i << ' ' << l << ' ' << r << '\n';
    upd2(i, 1, num*2);
    if (l==r)
        return;
    int mid=(l+r)/2;
    if (a<=mid)
    {
        if (!iL[i])
        {
            iL[i]=seg.size();
            create();
        }
        upd1(iL[i], l, mid);
    }
    else
    {
        if (!iR[i])
        {
            iR[i]=seg.size();
            create();
        }
        upd1(iR[i], mid+1, r);
    }
}
int qry2(int i, int l, int r)
{
    //cout << "qry2 " << i << ' ' << l << ' ' << r << '\n';
    if (r<=b)
        return seg[i];
    int mid=(l+r)/2, res=jL[i]?qry2(jL[i], l, mid):0;
    if (mid<b)
        res+=jR[i]?qry2(jR[i], mid+1, r):0;
    return res;
}
int qry1(int i, int l, int r)
{
    //cout << "qry1 " << i << ' ' << l << ' ' << r << '\n';
    if (r<=a)
        return qry2(i, 1, num*2);
    int mid=(l+r)/2, res=iL[i]?qry1(iL[i], l, mid):0;
    if (mid<a)
        res+=iR[i]?qry1(iR[i], mid+1, r):0;
    return res;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    create();
    create();
    int n, cnt=0;
    cin >> n;
    for (int i=0; i<n; i++)
    {
        int x, y;
        cin >> x >> y;
        vec.push_back({y, x});
    }
    sort(vec.begin(), vec.end(), greater<pair<int, int> >());
    for (int i=0; i<n; i++)
    {
        int y=vec[i].first, x=vec[i].second;
        a=-x-y+num*2+1, b=x-y+num;
        if (!qry1(1, 1, num*2))
        {
            upd1(1, 1, num*2);
            cnt++;
        }
    }
    cout << cnt;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...