제출 #1327482

#제출 시각아이디문제언어결과실행 시간메모리
1327482I_FloPPed21Pairs (IOI07_pairs)C++20
60 / 100
330 ms219608 KiB
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
int cer,n,d,m;
struct aib3d
{
    int offset=150;
    int aib[381][381][381];
    const int up=380;
    void init()
    {
        for(int i=0; i<=up; i++)
            for(int k=0; k<=up; k++)
                for(int j=0; j<=up; j++)
                    aib[i][k][j]=0;
    }
    void update(int x,int y,int z,int val)
    {
        x+=offset;
        y+=offset;
        z+=offset;
        for(int i=x; i<=up; i+=(i&-i))
        {
            for(int j=y; j<=up; j+=(j&-j))
            {
                for(int k=z; k<=up; k+=(k&-k))
                    aib[i][j][k]+=val;
            }
        }
    }

    ll get_sum(int x,int y,int z)
    {
        x+=offset;
        y+=offset;
        z+=offset;
        x=min(x,up);
        y=min(y,up);
        z=min(z,up);
        ll suma=0;
        for(int i=x; i>0; i-=(i&-i))
        {
            for(int j=y; j>0; j-=(j&-j))
            {
                for(int k=z; k>0; k-=(k&-k))
                {
                    suma+=aib[i][j][k];
                }
            }
        }
        return suma;
    }
    ll get_rectangle(int a,int b,int c,int x,int y,int z)
    {
        return get_sum(x,y,z)-get_sum(a-1,y,z)-get_sum(x,b-1,z)-get_sum(x,y,c-1)-get_sum(a-1,b-1,c-1)+get_sum(a-1,b-1,z)+get_sum(a-1,y,c-1)+get_sum(x,b-1,c-1);
    }
};
struct punct_2d
{
    int x,y;
    int c1,c2;
    bool operator<(const punct_2d &other)const
    {
        return c1<other.c1;
    }
};

struct punct_3d
{
    int x,y,z;
    int c1,c2,c3,c4;
    bool operator<(const punct_3d &other)const
    {
        return c1<other.c1;
    }
};
struct aib1d
{
    int offset=75001;
    int aib[300001];
    const int up=300000;
    void init()
    {
        for(int i=0; i<=300000; i++)
            aib[i]=0;
    }
    void update(int poz,int val)
    {
        poz+=offset;
        for(int i=poz; i<=up; i+=(i&-i))
            aib[i]+=val;
    }

    ll get_sum(int poz)
    {
        poz+=offset;

        poz=min(poz,up);

        ll suma=0;
        for(int i=poz; i>0; i-=(i&-i))
            suma+=aib[i];
       // cout<<poz<<" "<<up<<" "<<suma<<'\n';
        return suma;
    }

    ll get_secv(int l,int r)
    {
        //cout<<get_sum(r)<<" "<<get_sum(l-1)<<" "<<l<<" "<<r<<'\n';
        return get_sum(r)-get_sum(l-1);
    }
};
aib3d aib;
aib1d aibs;
int main()
{
    cin>>cer>>n>>d>>m;

    if(cer==1)
    {
        vector<int>v(n+1,0);
        for(int i=1; i<=n; i++)
        {
            cin>>v[i];
        }
        sort(v.begin(),v.end());
        int left=1;
        ll ans=0;

        for(int i=1; i<=n; i++)
        {
            while(v[i]-v[left]>d)
                left++;
            ans+=(i-left);
        }
        cout<<ans<<'\n';
    }
    else if(cer==2)
    {
        aibs.init();
        vector<punct_2d>v(n+1);
        for(int i=1; i<=n; i++)
        {
            cin>>v[i].x>>v[i].y;
            v[i].c1=v[i].x+v[i].y;
            v[i].c2=v[i].x-v[i].y;
        }
        sort(v.begin()+1,v.begin()+n+1);

        ll ans=0;
        int left=1;
        for(int i=1; i<=n; i++)
        {
            while(v[i].c1-v[left].c1>d)
            {
                aibs.update(v[left].c2,-1);
                left++;
            }
            //cout<<i<<" "<<left<<'\n';
            ans+=aibs.get_secv(v[i].c2-d,v[i].c2+d);
            aibs.update(v[i].c2,1);
        }
        cout<<ans<<'\n';
    }
    else
    {
        aib.init();
        vector<punct_3d>v(n+1);
        for(int i=1;i<=n;i++)
        {
            cin>>v[i].x>>v[i].y>>v[i].z;
            v[i].c1=v[i].x+v[i].y+v[i].z;
            v[i].c2=v[i].x-v[i].y+v[i].z;
            v[i].c3=v[i].x+v[i].y-v[i].z;
            v[i].c4=v[i].x-v[i].y-v[i].z;
        }
        sort(v.begin()+1,v.begin()+n+1);
        int left=1;
        ll ans=0;
        for(int i=1;i<=n;i++)
        {
            while(v[i].c1-v[left].c1>d)
            {
                aib.update(v[i].c2,v[i].c3,v[i].c4,-1);
                left++;
            }

            ans=ans+aib.get_rectangle(v[i].c2-d,v[i].c3-d,v[i].c4-d,v[i].c2+d,v[i].c3+d,v[i].c4+d);
        }
        cout<<ans<<'\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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...