Submission #1354085

#TimeUsernameProblemLanguageResultExecution timeMemory
1354085tung04885Pairs (IOI07_pairs)C++20
100 / 100
454 ms8996 KiB
#include <bits/stdc++.h>
using namespace std;
#define MAX 100100
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define fi first
#define se second
#define all(a) (a).begin(),(a).end()
#define __buitin_popcount __builtin_popcountll
#define BIT(x,i) (((x)>>(i))&1ll)
#define MASK(i) (1ll<<(i))

template<class X,class Y> bool maximize(X &x,Y y)
{
    if(x<y)
    {
        x=y;
        return 1;
    }
    return 0;
}

template<class X,class Y> bool minimize(X &x,Y y)
{
    if(y<x)
    {
        x=y;
        return 1;
    }
    return 0;
}

const int inf=1e9+412009;
const ll INF=2e18+412009;

int dimension;

namespace ONE_DIMENSION
{
    int n,dist,m;

    int pos[MAX];

    void solve()
    {
        cin>>n>>dist>>m;
        for(int i=1;i<=n;i++) cin>>pos[i];

        sort(pos+1,pos+n+1);

        ll ans=0;

        int T1=1;

        for(int i=1;i<=n;i++)
        {
            while(pos[i]-pos[T1]>dist&&T1<=i) T1++;

            if(pos[i]-pos[T1]<=dist) ans+=i-T1;
        }

        cout<<ans;
    }
}

namespace TWO_DIMENSION
{
    const int base=77777;

    int n,dist,m;

    pii a[MAX];


    int bit[2*base+100]={};

    void update(int x,int val)
    {
        x+=base;

        for(;x<=2*base;x+=x&-x) bit[x]+=val;
    }

    int get(int x)
    {
        x+=base;

        int res=0;

        for(;x>=1;x&=x-1) res+=bit[x];

        return res;
    }

    int get_range(int l,int r)
    {
        maximize(l,-base);
        minimize(r,base);

        if(l>r) return 0;

        return get(r)-get(l-1);
    }

    void solve()
    {
        cin>>n>>dist>>m;

        for(int i=1;i<=n;i++)
        {
            int x,y;
            cin>>x>>y;

            a[i].fi=x+y;
            a[i].se=x-y;
        }

        sort(a+1,a+n+1);

        ll ans=0;

        int T1=1;

        for(int i=1;i<=n;i++)
        {
            while(a[i].fi-a[T1].fi>dist&&T1<=i)
            {
                update(a[T1].se,-1);

                T1++;
            }

            if(a[i].fi-a[T1].fi<=dist) ans+=get_range(a[i].se-dist,a[i].se+dist);

            update(a[i].se,1);
        }

        cout<<ans;
    }
}

namespace THREE_DIMENSION
{
    const int base=75;

    struct POINT
    {
        int x,y,z;

        void input()
        {
            int _y,_z;

            cin>>x>>_y>>_z;

            y=_y+_z;
            z=_y-_z;
        }
    };

    struct FENWICK_2D
    {
        int bit[166][166]={};

        void update(int x,int y,int val)
        {
            y+=base;

            for(;x<=2*base;x+=x&-x) for(int i=y;i<=2*base;i+=i&-i) bit[x][i]+=val;
        }

        int get(int x,int y)
        {
            int res=0;

            y+=base;

            for(;x>=1;x&=x-1) for(int i=y;i>=1;i&=i-1) res+=bit[x][i];

            return res;
        }

        int get_square(int x1,int y1,int x2,int y2)
        {
            maximize(x1,1);
            maximize(y1,-base);
            minimize(x2,2*base);
            minimize(y2,base);

            if(x1>x2||y1>y2) return 0;

            return get(x2,y2)-get(x1-1,y2)-get(x2,y1-1)+get(x1-1,y1-1);
        }
    };

    FENWICK_2D mp[77];

    int n,dist,m;

    POINT a[MAX];

    void solve()
    {
        cin>>n>>dist>>m;

        for(int i=1;i<=n;i++) a[i].input();

        ll ans=0;

        for(int i=1;i<=n;i++)
        {
            for(int u=1;u<=m;u++)
            {
                int newdist=dist-abs(a[i].x-u);

                if(newdist<0) continue;

                ans+=mp[u].get_square(a[i].y-newdist,a[i].z-newdist,a[i].y+newdist,a[i].z+newdist);
            }

            mp[a[i].x].update(a[i].y,a[i].z,1);
        }

        cout<<ans;
    }
}

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

    cin>>dimension;

    if(dimension==1) ONE_DIMENSION::solve();
    else if(dimension==2) TWO_DIMENSION::solve();
    else THREE_DIMENSION::solve();

    return 0;
}

#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...