Submission #1306728

#TimeUsernameProblemLanguageResultExecution timeMemory
1306728KhoaDuyPairs (IOI07_pairs)C++20
100 / 100
51 ms8324 KiB
#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
#define ll long long
struct fenwick{
    vector<int> bit;
    void build(int n){
        bit.assign(n+1,0);
    }
    void update(int i,int x){
        for(;i<bit.size();i+=(i&(-i))){
            bit[i]+=x;
        }
    }
    int query(int i){
        int curr=0;
        for(;i;i-=(i&(-i))){
            curr+=bit[i];
        }
        return curr;
    }
    int range(int l,int r){
        l=max(l,1);
        r=min(r,(int)bit.size()-1);
        if(l>r){
            return 0;
        }
        return (query(r)-query(l-1));
    }
};
struct presum{
    int pre[151][151];
    void build(vector<pair<int,int>> v){
        memset(pre,0,sizeof(pre));
        for(int i=0;i<v.size();i++){
            assert(1<=v[i].first&&v[i].first<=150);
            assert(1<=v[i].second&&v[i].second<=150);
            pre[v[i].first][v[i].second]++;
        }
        for(int i=1;i<=150;i++){
            for(int j=1;j<=150;j++){
                pre[i][j]=(pre[i][j]+pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1]);
            }
        }
    }
    int query(int x,int y){
        if(x<=0||y<=0){
            return 0;
        }
        x=min(x,150),y=min(y,150);
        return pre[x][y];
    }
    int range(int x1,int y1,int x2,int y2){
        return (query(x2,y2)-query(x1-1,y2)-query(x2,y1-1)+query(x1-1,y1-1));
    }
};
signed main(){
    if(fopen("input.txt","r")){
        freopen("input.txt","r",stdin);
    }
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    int b,n,d,m;
    cin >> b >> n >> d >> m;
    if(b==1){
        vector<int> v(n);
        for(int i=0;i<n;i++){
            cin >> v[i];
        }
        sort(v.begin(),v.end());
        int ptr=-1;
        ll ans=0;
        for(int i=0;i<n;i++){
            while(ptr+1<i&&v[i]-v[ptr+1]>d){
                ptr++;
            }
            ans+=(i-1-ptr);
        }
        cout << ans << endl;
        return 0;
    }
    if(b==2){
        vector<pair<int,int>> v(n);
        for(int i=0;i<n;i++){
            cin >> v[i].first >> v[i].second;
            v[i]={v[i].first-v[i].second,v[i].first+v[i].second};
        }
        fenwick bit;
        bit.build(2*m);
        sort(v.begin(),v.end());
        int ptr=-1;
        ll ans=0;
        for(int i=0;i<n;i++){
            while(ptr+1<n&&v[i].first-v[ptr+1].first>d){
                ptr++;
                bit.update(v[ptr].second,-1);
            }
            ans+=bit.range(v[i].second-d,v[i].second+d);
            bit.update(v[i].second,1);
        }
        cout << ans << endl;
        return 0;
    }
    ll ans=0;
    vector<vector<pair<int,int>>> group(m+1);
    for(int i=0;i<n;i++){
        int x,y,z;
        cin >> x >> y >> z;
        group[z].push_back({x-y+m,x+y});
    }
    presum pre[m+1];
    for(int i=1;i<=m;i++){
        vector<pair<int,int>> v=group[i];
        fenwick bit;
        bit.build(2*m);
        sort(v.begin(),v.end());
        int ptr=-1;
        n=v.size();
        for(int i=0;i<n;i++){
            while(ptr+1<n&&v[i].first-v[ptr+1].first>d){
                ptr++;
                bit.update(v[ptr].second,-1);
            }
            ans+=bit.range(v[i].second-d,v[i].second+d);
            bit.update(v[i].second,1);
        }
        pre[i].build(v);
    }
    for(int z=1;z<=m;z++){
        for(pair<int,int> &bruh:group[z]){
            int x=bruh.first,y=bruh.second;
            for(int z2=z-1;z2>=1&&z-z2<=d;z2--){
                int limit=d-(z-z2);
                ans+=pre[z2].range(x-limit,y-limit,x+limit,y+limit);
            }
        }
    }
    cout << ans << endl;
}

Compilation message (stderr)

pairs.cpp: In function 'int main()':
pairs.cpp:59:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   59 |         freopen("input.txt","r",stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...