제출 #379297

#제출 시각아이디문제언어결과실행 시간메모리
379297MilosMilutinovicPairs (IOI07_pairs)C++14
100 / 100
379 ms27500 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long int n,d,m; void Solve1D(){ vector<int> x(n); for(int i=0;i<n;i++)scanf("%i",&x[i]); sort(x.begin(),x.end()); ll ans=0; for(int i=0;i<n;i++){ int bot=i,top=n-1,pos=i; while(bot<=top){ int mid=bot+top>>1; if(x[mid]-x[i]<=d)pos=mid,bot=mid+1; else top=mid-1; } ans+=pos-i; } printf("%lld",ans); } const int N=200050; int x[N],y[N],sum[N],dif[N],id[N]; int bit[N]; void Add(int x,int f){for(;x<N;x+=x&-x)bit[x]+=f;} int Get(int x){int res=0;for(;x;x-=x&-x)res+=bit[x];return res;} void Solve2D(){ for(int i=0;i<n;i++)scanf("%i%i",&x[i],&y[i]),sum[i]=x[i]+y[i],dif[i]=x[i]-y[i],id[i]=i; sort(id,id+n,[&](int i,int j){ return dif[i]<dif[j]; }); int j=0; ll ans=0; for(int i=0;i<n;i++){ while(dif[id[i]]-dif[id[j]]>d){ Add(sum[id[j]],-1); j++; } ans+=Get(min(N-1,sum[id[i]]+d))-Get(max(1,sum[id[i]]-d-1)); Add(sum[id[i]],1); } printf("%lld",ans); } const int H=250; struct BIT3D{ int sum[H][H][H]; void Add(int x,int y,int z,int f){ for(int i=x;i<H;i+=i&-i){ for(int j=y;j<H;j+=j&-j){ for(int k=z;k<H;k+=k&-k){ sum[i][j][k]+=f; } } } } int Get(int x,int y,int z){ int res=0; for(int i=x;i;i-=i&-i){ for(int j=y;j;j-=j&-j){ for(int k=z;k;k-=k&-k){ res+=sum[i][j][k]; } } } return res; } int Get(int xl,int xr,int yl,int yr,int zl,int zr){ xl--;yl--;zl--; xl=max(xl,0); yl=max(yl,0); zl=max(zl,0); xr=min(xr,H-1); yr=min(yr,H-1); zr=min(zr,H-1); return Get(xr,yr,zr)-Get(xl,yr,zr)-Get(xr,yl,zr)-Get(xr,yr,zl)+Get(xl,yl,zr)+Get(xl,yr,zl)+Get(xr,yl,zl)-Get(xl,yl,zl); } } ST; int z[N]; void Solve3D(){ for(int i=1;i<=n;i++)scanf("%i%i%i",&x[i],&y[i],&z[i]),id[i]=i; sort(id+1,id+n+1,[&](int i,int j){ return x[i]+y[i]+z[i]<x[j]+y[j]+z[j]; }); int j=1; ll ans=0; for(int i=1;i<=n;i++){ int l=id[i]; while(x[l]+y[l]+z[l]-x[id[j]]-y[id[j]]-z[id[j]]>d){ int k=id[j]; ST.Add(m-x[k]+y[k]+z[k],m+x[k]-y[k]+z[k],m+x[k]+y[k]-z[k],-1); j++; } ans+=ST.Get(m-x[l]+y[l]+z[l]-d,m-x[l]+y[l]+z[l]+d,m+x[l]-y[l]+z[l]-d,m+x[l]-y[l]+z[l]+d,m+x[l]+y[l]-z[l]-d,m+x[l]+y[l]-z[l]+d); ST.Add(m-x[l]+y[l]+z[l],m+x[l]-y[l]+z[l],m+x[l]+y[l]-z[l],1); } printf("%lld",ans); } int main(){ int b;scanf("%i%i%i%i",&b,&n,&d,&m); if(b==1)Solve1D(); if(b==2)Solve2D(); if(b==3)Solve3D(); }

컴파일 시 표준 에러 (stderr) 메시지

pairs.cpp: In function 'void Solve1D()':
pairs.cpp:13:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   13 |    int mid=bot+top>>1;
      |            ~~~^~~~
pairs.cpp:7:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    7 |     for(int i=0;i<n;i++)scanf("%i",&x[i]);
      |                         ~~~~~^~~~~~~~~~~~
pairs.cpp: In function 'void Solve2D()':
pairs.cpp:27:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   27 |     for(int i=0;i<n;i++)scanf("%i%i",&x[i],&y[i]),sum[i]=x[i]+y[i],dif[i]=x[i]-y[i],id[i]=i;
      |                         ~~~~~^~~~~~~~~~~~~~~~~~~~
pairs.cpp: In function 'void Solve3D()':
pairs.cpp:79:31: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   79 |     for(int i=1;i<=n;i++)scanf("%i%i%i",&x[i],&y[i],&z[i]),id[i]=i;
      |                          ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
pairs.cpp: In function 'int main()':
pairs.cpp:98:13: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   98 |  int b;scanf("%i%i%i%i",&b,&n,&d,&m);
      |        ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#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...