제출 #1353595

#제출 시각아이디문제언어결과실행 시간메모리
1353595truongthaiduonglaptrinhPairs (IOI07_pairs)C++20
40 / 100
185 ms1736 KiB
// duonglaptrinh

# include <bits/stdc++.h>

# define pa pair<int, int>
# define paa pair<int, pair<int, int>>
# define fi first
# define se second

using namespace std;

const int N = 1e5+5;

int n, d, limit;

namespace type1 {
    int a[N];

    void solve() {
        cin>>n>>d>>limit;
        for(int i = 1; i <= n; i++) {
            cin>>a[i];
        }
        sort(a + 1, a + 1 + n);

        long long ans = 0;
        for(int i = 1; i <= n; i++) {
            int l = lower_bound(a + 1, a + 1 + n, a[i] - d) - a;
            int r = upper_bound(a + 1, a + 1 + n, a[i] + d) - a;
            ans += (r - l - 1);
        }
        cout<<ans / 2;
    }
}

int bit[2 * N];

namespace type2 {
    void update(int vt, int gt) {
        for(int i = vt; i <= limit; i += (i & (-i))) {
            bit[i] += gt;
        }
    }

    int get(int l, int r) {
        l = max(l - 1, 0), r = min(r, limit);
        int ans = 0;
        for(int i = l; i >= 1; i -= (i & (-i))) {
            ans -= bit[i];
        }
        for(int i = r; i >= 1; i -= (i & (-i))) {
            ans += bit[i];
        }
        return ans;
    }

    pa a[N];

    void solve() {
        cin>>n>>d>>limit;

        limit = limit * 2;

        for(int i = 1; i <= n; i++) {
            cin>>a[i].fi>>a[i].se;
        }

        sort(a + 1, a + 1 + n, [] (pa x, pa y) {return abs(x.fi - x.se) < abs(y.fi - y.se);});

        int l = 1, r = 1;
        long long ans = 0;
        for(int i = 1; i <= n; i++) {
            while(l <= n && abs((a[i].fi - a[i].se) - (a[l].fi - a[l].se)) > d) {
                update(abs(a[l].fi + a[l].se), -1);
                l++;
            }
            while(r <= n && abs((a[i].fi - a[i].se) - (a[r].fi - a[r].se)) <= d) {
                update(abs(a[r].fi + a[r].se), 1);
                r++;
            }
            ans += get(abs(a[i].fi + a[i].se) - d, abs(a[i].fi + a[i].se) + d) - 1;
        }

        cout<<ans / 2;
    }
}

namespace type3 {
    void update(int vt, int gt) {
        for(int i = vt; i <= limit * 2; i += (i & (-i))) {
            bit[i] += gt;
        }
    }

    int get(int l, int r) {
        l = max(l - 1, 0), r = min(r, limit * 2);
        int ans = 0;
        for(int i = l; i >= 1; i -= (i & (-i))) {
            ans -= bit[i];
        }
        for(int i = r; i >= 1; i -= (i & (-i))) {
            ans += bit[i];
        }
        return ans;
    }

    paa a[N];
    pa vitri[N];

    void solve() {
        cin>>n>>d>>limit;

        for(int i = 1; i <= n; i++) {
            cin>>a[i].fi>>a[i].se.fi>>a[i].se.se;
        }

        sort(a + 1, a + 1 + n, [] (paa x, paa y) {
            if(x.fi != y.fi) {
                return x.fi < y.fi;
            }
            return (x.se.fi - x.se.se) < (y.se.fi - y.se.se);
        });

        for(int i = 1; i <= n; i++) {
            if(vitri[a[i].fi].fi == 0) {
                vitri[a[i].fi].fi = i;
            }
            vitri[a[i].fi].se = i;
        }

        long long ans = 0;

        for(int ii = 1; ii <= limit; ii++) {
            if(!vitri[ii].fi) {
                continue;
            }

            // cout<<vitri[ii].fi<<" "<<vitri[ii].se<<"\n";

            for(int jj = 1; jj <= limit; jj++) {
                if(!vitri[jj].fi) {
                    continue;
                }

                // cout<<vitri[jj].fi<<" "<<vitri[jj].se<<"\n";

                int l = vitri[jj].fi, r = vitri[jj].fi, dd = d - abs(ii - jj);

                if(dd < 0) {
                    continue;
                }

                for(int i = vitri[ii].fi; i <= vitri[ii].se; i++) {
                    while(l <= vitri[jj].se && abs((a[i].se.fi - a[i].se.se) - (a[l].se.fi - a[l].se.se)) > dd) {
                        update(a[l].se.fi + a[l].se.se, -1 * (l < r));
                        l++;
                    }

                    r = max(r, l);

                    while(r <= vitri[jj].se && abs((a[i].se.fi - a[i].se.se) - (a[r].se.fi - a[r].se.se)) <= dd) {
                        update(a[r].se.fi + a[r].se.se, 1);
                        r++;
                    }

                    ans += get(abs(a[i].se.fi + a[i].se.se) - dd, abs(a[i].se.fi + a[i].se.se) + dd);
                    // cout<<l<<" "<<r<<" "<<get(abs(a[i].se.fi + a[i].se.se) - dd, abs(a[i].se.fi + a[i].se.se) + dd)<<"\n";
                }
                // cout<<"\n";

                while(l < r) {
                    update(a[l].se.fi + a[l].se.se, -1 * (l < r));
                    l++;
                }
            }

            // cout<<"\n";
        }

        ans -= n;
        cout<<ans / 2;
    }
}

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


    int type;
    cin>>type;

    if(type == 1) {
        type1::solve();
        return 0;
    }

    if(type == 2) {
        type2::solve();
        return 0;
    }

    if(type == 3) {
        type3::solve();
        return 0;
    }

    return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…