Submission #875514

#TimeUsernameProblemLanguageResultExecution timeMemory
875514abcvuitunggioPairs (IOI07_pairs)C++17
100 / 100
428 ms62744 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
int b,n,d,m,a[100001][3],s[100001],cnt[76][76][76],sum[76][301][301],res,f[150001];
vector <int> v,v2;
vector <pair <pair <int, int>, pair <int, int>>> ve;
void update(int i, int val){
    i=max(i,1LL);
    for (;i<=m*2;i+=i&(-i))
        f[i]+=val;
}
void get(int i){
    for (;i;i-=i&(-i))
        res+=f[i];
}
int32_t main(){
    ios_base::sync_with_stdio(NULL);cin.tie(nullptr);
    cin >> b >> n >> d >> m;
    for (int i=1;i<=n;i++){
        for (int j=0;j<b;j++)
            cin >> a[i][j];
        if (b==1)
            v.push_back(a[i][0]);
        if (b==2){
            int x=a[i][0],y=a[i][1];
            ve.push_back({{x-y-d,-1},{x+y-d,x+y+d}});
            ve.push_back({{x-y,0},{x+y,x+y}});
            ve.push_back({{x-y+d,1},{x+y-d,x+y+d}});
        }
        if (b==3){
            cnt[a[i][0]][a[i][1]][a[i][2]]++;
            sum[a[i][0]][a[i][1]-a[i][2]+m][a[i][1]+a[i][2]+m]++;
        }
    }
    if (b==1){
        sort(v.begin(),v.end());
        v.resize(unique(v.begin(),v.end())-v.begin());
        for (int i=1;i<=n;i++)
            s[lower_bound(v.begin(),v.end(),a[i][0])-v.begin()+1]++;
        for (int i=1;i<=v.size();i++)
            s[i]+=s[i-1];
        for (int i=1;i<=n;i++)
            res+=s[upper_bound(v.begin(),v.end(),a[i][0]+d)-v.begin()]-s[lower_bound(v.begin(),v.end(),a[i][0]-d)-v.begin()];
    }
    if (b==2){
        sort(ve.begin(),ve.end());
        for (auto p:ve)
            if (p.first.second==0)
                get(p.second.first);
            else{
                update(p.second.first,-p.first.second);
                update(p.second.second+1,p.first.second);
            }
    }
    if (b==3){
        for (int i=1;i<=m;i++)
            for (int j=1;j<=m*3;j++)
                for (int k=1;k<=m*3;k++)
                    sum[i][j][k]+=sum[i][j-1][k]+sum[i][j][k-1]-sum[i][j-1][k-1];
        for (int i=1;i<=m;i++)
            for (int j=1;j<=m;j++){
                int nd=d-abs(i-j);
                if (nd<0)
                    continue;
                for (int k=1;k<=m;k++)
                    for (int l=1;l<=m;l++){
                        int r=k-l-nd+m,r2=k-l+nd+m,c=k+l-nd+m,c2=k+l+nd+m;
                        if (max(r,c)>m*3||min(r2,c2)<1)
                            continue;
                        r=max(r,1LL);
                        r2=min(r2,m*3);
                        c=max(c,1LL);
                        c2=min(c2,m*3);
                        res+=(sum[j][r2][c2]-sum[j][r-1][c2]-sum[j][r2][c-1]+sum[j][r-1][c-1])*cnt[i][k][l];
                    }
            }
    }
    cout << (res-n)/2;
}

Compilation message (stderr)

pairs.cpp: In function 'int32_t main()':
pairs.cpp:40:23: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   40 |         for (int i=1;i<=v.size();i++)
      |                      ~^~~~~~~~~~
#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...