Submission #1313159

#TimeUsernameProblemLanguageResultExecution timeMemory
1313159viyeuquadamdauPairs (IOI07_pairs)C++20
60 / 100
588 ms387340 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define ll long long
#define vec vector
#define PB push_back
#define all(x) x.begin(), x.end()
#define F first
#define S second
#define ull unsigned long long
#define pii pair<int,int>
#define rz resize
#define ld long double
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define matrix vec<vec<int>>
#define MP make_pair

const int N = 1e5+5;
const ll INF = 1e18;
const ll mod = 998244353;

mt19937_64 rng(time(0));
int random(int a, int b){ return uniform_int_distribution<ll>(a,b)(rng); }

int add(int a, int b) { a+=b;if(a>=mod)a-=mod; return a; }

struct Fen
{
    vec<int>f;
    int n;
    void assign(int _n){
        n=_n;f.rz(n+1);
    }
    void upd(int x, int v){ for(;x<=n;x+=x&-x)f[x]+=v; }
    void upd(int l, int r, int x){ upd(l,x);upd(r+1,-x); } 
    int quer(int x){ int r=0;for(;x>0;x-=x&-x)r+=f[x];return r; }
};

int B,n,d,M;

namespace D2 {
    void solve() {
        vec<pii>a(n+1);
        vec<int>st(n+1);
        vec<int>vals;
        for(int i=1;i<=n;++i)
            cin>>a[i].F>>a[i].S,vals.PB(a[i].F-a[i].S),
        vals.PB(a[i].F-a[i].S-d),vals.PB(a[i].F-a[i].S+d),st[i]=a[i].F+a[i].S;
        sort(a.begin()+1,a.end(),[&](const pii& fi, const pii& se){
            return (fi.F+fi.S == se.F+se.S ? fi.F-fi.S < se.F-se.S : fi.F+fi.S < se.F+se.S);
        });
        sort(all(vals));
        sort(st.begin()+1,st.end());
        auto getid=[&](int x)->int{
            return lower_bound(all(vals),x)-vals.begin()+1;
        };
        Fen f;f.assign(3*n+2);
        int an=0;
        for(int i=1,j=1;i<=n;++i){
            while(j < i && st[i]-st[j] > d){
                int u=a[j].F-a[j].S;
                int cl=getid(u-d),cr=getid(u+d);
                f.upd(cl,cr,-1);++j;
            }
            int v=a[i].F-a[i].S;
            int cl=getid(v-d),cr=getid(v+d);
            an+=f.quer(getid(v));
            f.upd(cl,cr,1);
        }
        cout<<an;
    }
}

struct Fen3D
{
    vec<vec<vec<int>>> f;
    int x,y,z;
    Fen3D(int _x,int _y, int _z):x(_x),y(_y),z(_z){
        f.rz(x+1,vec<vec<int>>(y+1,vec<int>(z+1)));
    }
    void upd(int a, int b, int c, int v){
        for(;a<=x;a+=a&-a)for(int i=b;i<=y;i+=i&-i)for(int j=c;j<=z;j+=j&-j)f[a][i][j]+=v;
    }
    void upd(int a1, int a2, int b1, int b2, int c1, int c2, int v){

        auto add=[&](int a, int b, int c, int v)->void{
            if(a<=0 || b <= 0 || c <= 0)return;
            if(a>x || b>y || c>z)return ;
            upd(a,b,c,v);
        };
        add(a1,b1,c1,v);
        add(a1,b1,c2+1,-v);
        add(a1,b2+1,c1,-v);
        add(a1,b2+1,c2+1,v);
        add(a2+1,b1,c1,-v);
        add(a2+1,b1,c2+1,v);
        add(a2+1,b2+1,c1,v);
        add(a2+1,b2+1,c2+1,-v);
    }
    int quer(int a, int b, int c){
        int r=0;
        for(;a>0;a-=a&-a)for(int i=b;i>0;i-=i&-i)for(int j=c;j>0;j-=j&-j)r+=f[a][i][j];
        return r;
    }

};


namespace D3 {
    void solve(){
        vec<array<int,3>>ar(n+1);
        vec<int> vals;

        for(int i=1;i<=n;++i){
            for(int j=0;j<B;++j)cin>>ar[i][j];
            vec<int> add={
                ar[i][0]+ar[i][1]-ar[i][2],
                ar[i][0]-ar[i][1]-ar[i][2],
                ar[i][0]-ar[i][1]+ar[i][2]
            };
            for(int j=0;j<3;++j)vals.PB(add[j]),vals.PB(add[j]-d),vals.PB(add[j]+d);
        }
        sort(ar.begin()+1,ar.end(),[&](array<int,3>& fi, array<int,3>& se){
            return fi[0]+fi[1]+fi[2] < se[0]+se[1]+se[2];
        });
        sort(all(vals));vals.rz(unique(all(vals))-vals.begin());
        auto getid=[&](int x)->int{
            return lower_bound(all(vals),x)-vals.begin()+1;
        };
        int len=vals.size();
        Fen3D f(len+5,len+5,len+5);
        int an=0;
        for(int i=1,j=1;i<=n;++i){
            while(j < i){
                int u1=ar[i][0]+ar[i][1]+ar[i][2];
                int u2=ar[j][0]+ar[j][1]+ar[j][2];
                if(u1-u2 > d){
                    int a1=getid(ar[i][0]+ar[i][1]-ar[i][2]-d);
                    int a2=getid(ar[i][0]+ar[i][1]-ar[i][2]+d);
                    int b1=getid(ar[i][0]-ar[i][1]-ar[i][2]-d);
                    int b2=getid(ar[i][0]-ar[i][1]-ar[i][2]+d);
                    int c1=getid(ar[i][0]-ar[i][1]+ar[i][2]-d);
                    int c2=getid(ar[i][0]-ar[i][1]+ar[i][2]+d);
                    f.upd(a1,a2,b1,b2,c1,c2,-1);
                    ++j;}
                else break;
            }
            int a=getid(ar[i][0]+ar[i][1]-ar[i][2]);
            int b=getid(ar[i][0]-ar[i][1]-ar[i][2]);
            int c=getid(ar[i][0]-ar[i][1]+ar[i][2]);
            an += f.quer(a,b,c);
            int a1=getid(ar[i][0]+ar[i][1]-ar[i][2]-d);
            int a2=getid(ar[i][0]+ar[i][1]-ar[i][2]+d);
            int b1=getid(ar[i][0]-ar[i][1]-ar[i][2]-d);
            int b2=getid(ar[i][0]-ar[i][1]-ar[i][2]+d);
            int c1=getid(ar[i][0]-ar[i][1]+ar[i][2]-d);
            int c2=getid(ar[i][0]-ar[i][1]+ar[i][2]+d);
            f.upd(a1,a2,b1,b2,c1,c2,1);
        }
        cout<<an;

    }
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    // freopen("NgheLen.Inp","r",stdin);
    // freopen("NgheLen.out","w",stdout);
    cin>>B;
    cin>>n;
    cin>>d;
    cin>>M;
    if(B==1){
        vec<int>a(n+1);
        for(int i=1;i<=n;++i)cin>>a[i];
        sort(a.begin()+1,a.end());
        int j=1,an=0;
        for(int i=1;i<=n;++i){
            while(a[i]-a[j] > d)++j;
            an += (i-j);
        }
        cout<<an<<'\n';
    } else if(B==2){
        D2::solve();
    } else {
        D3::solve();
    }


    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...