Submission #1005638

#TimeUsernameProblemLanguageResultExecution timeMemory
1005638bachhoangxuanPairs (IOI07_pairs)C++17
100 / 100
29 ms2912 KiB
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
int B,N,D,M;

namespace B1{
    void solve(){
        vector<int> X(N);
        for(int i=0;i<N;i++) cin >> X[i];
        sort(X.begin(),X.end());
        int p=0;
        long long total=0;
        for(int i=0;i<N;i++){
            while(p<N && X[i]-X[p]>D) p++;
            total+=i-p;
        }
        cout << total << '\n';
    }
}
namespace B2{
    const int maxn = 150005;
    int bit[maxn];
    void update(int x,int val){
        for(int i=x;i<=2*M;i+=(i&(-i))) bit[i]+=val;
    }
    int query(int x){
        int res=0;
        for(int i=x;i>=1;i-=(i&(-i))) res+=bit[i];
        return res;
    }

    void solve(){
        vector<pii> P(N);
        for(int i=0;i<N;i++){
            cin >> P[i].fi >> P[i].se;
            P[i]={P[i].fi+P[i].se,P[i].fi-P[i].se+M};
        }
        sort(P.begin(),P.end());
        int p=0;
        long long total=0;
        for(int i=0;i<N;i++){
            while(p<N && P[i].fi-P[p].fi>D) update(P[p++].se,-1);
            int l=max(1,P[i].se-D),r=min(2*M,P[i].se+D);
            total+=query(r)-query(l-1);
            update(P[i].se,1);
        }
        cout << total << '\n';
    }
}
namespace B3{
    const int maxn = 155;
    vector<pii> p[maxn];
    int cnt[maxn][maxn];

    void solve(){
        for(int i=0;i<N;i++){
            int x,y,z;cin >> x >> y >> z;
            p[x].push_back({y+z,y-z+M});
        }
        long long total=0;
        for(int i=1;i<=M;i++){
            for(int a=1;a<=2*M;a++) for(int b=1;b<=2*M;b++) cnt[a][b]=0;
            for(auto [x,y]:p[i]) cnt[x][y]++;
            for(int a=1;a<=2*M;a++) for(int b=1;b<=2*M;b++) cnt[a][b]+=cnt[a-1][b]+cnt[a][b-1]-cnt[a-1][b-1];
            for(int j=i;j<=M;j++){
                int d=D-(j-i);
                if(d<0) continue;
                long long add=0;
                for(auto [x,y]:p[j]){
                    int u=min(2*M,x+d),v=min(2*M,y+d);
                    x=max(1,x-d);y=max(1,y-d);
                    add+=cnt[u][v]-cnt[x-1][v]-cnt[u][y-1]+cnt[x-1][y-1];
                }
                if(j==i) add=(add-(int)p[i].size())/2;
                total+=add;
            }
        }
        cout << total << '\n';
    }
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);cout.tie(NULL);
    cin >> B >> N >> D >> M;
    if(B==1) B1::solve();
    else if(B==2) B2::solve();
    else B3::solve();
}
#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...