Submission #74727

#TimeUsernameProblemLanguageResultExecution timeMemory
74727goodbatonPairs (IOI07_pairs)C++14
70 / 100
259 ms36476 KiB
#include <iostream>
#include <vector>
#include <cstdio>
#include <algorithm>

using namespace std;
typedef long long ll;

#define SIZE 100010
#define INF 1000000000

struct NODE{
  vector<int> vec;
  int l;
  int r;
  
  NODE():l(INF),r(INF){}
};

struct SEG1{
  vector<NODE> data;
  int segn2;

  void marge(NODE &res, NODE &a, NODE &b){
    int s=0,t=0;

    res.l = a.l;
    res.r = b.r;
    
    while(1){
      if(s<a.vec.size() && t<b.vec.size()){
	if(a.vec[s] < b.vec[t]){
	  res.vec.push_back(a.vec[s++]);
	}else{
	  res.vec.push_back(b.vec[t++]);
	}
      }else if(s<a.vec.size()){
	res.vec.push_back(a.vec[s++]);
      }else if(t<b.vec.size()){
	res.vec.push_back(b.vec[t++]);
      }else{
	break;
      }
    }
  }
  
  void init(int n,pair<int,int> *p){
    for(segn2=1;segn2<n;segn2*=2);

    data.assign(segn2*2,NODE());

    for(int i=0;i<n;i++){
      data[segn2+i-1].l = data[segn2+i-1].r = p[i].first;
      data[segn2+i-1].vec.push_back(p[i].second);
    }

    for(int i = segn2-2;i>=0;i--){
      marge(data[i],data[i*2+1],data[i*2+2]);
    }
  }

  ll query(int a,int b,int u,int v,int k=0){
    
    if(a<=data[k].l && data[k].r<=b){
      return upper_bound(data[k].vec.begin(),data[k].vec.end(),v) - lower_bound(data[k].vec.begin(),data[k].vec.end(),u);
    }

    if(data[k].r<a || b<data[k].l) return 0;

    return query(a,b,u,v,k*2+1) + query(a,b,u,v,k*2+2);
  } 
};

int b,n,d;

inline ll dis(ll a,ll b,ll c){
  return abs(a) + abs(b) + abs(c);
}

ll calc_0(){
  int p[SIZE][3] = {};
  ll ans = 0;
  
  for(int i=0;i<n;i++){
    for(int j=0;j<b;j++){
      scanf("%d",p[i]+j);
    }
  }

  for(int i=0;i<n;i++){
    for(int j=i+1;j<n;j++){
      if(dis(p[i][0]-p[j][0],p[i][1]-p[j][1],p[i][2]-p[j][2]) <= d) ans++;
    }
  }

  return ans;
}

ll calc_1(){
  int p[SIZE];
  ll ans = 0;
  
  for(int i=0;i<n;i++){
    scanf("%d",p+i);
  }

  sort(p,p+n);

  for(int i=0;i<n;i++){
    ans += upper_bound(p,p+n,p[i]+d) - lower_bound(p,p+n,p[i]-d) - 1;
  }

  return ans/2;
}

ll calc_2(){
  int x[SIZE],y[SIZE];
  pair<int,int> p[SIZE];;
  SEG1 seg;
  ll ans = 0;
  
  for(int i=0;i<n;i++){
    scanf("%d%d",x+i,y+i);
    p[i] = {x[i] + y[i],x[i] - y[i]};
  }

  sort(p,p+n);
  
  seg.init(n,p);

  for(int i=0;i<n;i++){
    ans += seg.query(p[i].first-d,p[i].first+d,p[i].second-d,p[i].second+d) - 1;
  }

  return ans/2;
} 

int main(){
  ll ans = 0;
  int m;
  
  scanf("%d%d%d%d",&b,&n,&d,&m);

  if(b==1) ans = calc_1();
  else if(b==2) ans = calc_2();
  else if(n <= 1000) ans = calc_0();

  printf("%lld\n",ans);

  return 0;
}

Compilation message (stderr)

pairs.cpp: In member function 'void SEG1::marge(NODE&, NODE&, NODE&)':
pairs.cpp:31:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       if(s<a.vec.size() && t<b.vec.size()){
          ~^~~~~~~~~~~~~
pairs.cpp:31:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       if(s<a.vec.size() && t<b.vec.size()){
                            ~^~~~~~~~~~~~~
pairs.cpp:37:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       }else if(s<a.vec.size()){
                ~^~~~~~~~~~~~~
pairs.cpp:39:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       }else if(t<b.vec.size()){
                ~^~~~~~~~~~~~~
pairs.cpp: In function 'll calc_0()':
pairs.cpp:86:12: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
       scanf("%d",p[i]+j);
       ~~~~~^~~~~~~~~~~~~
pairs.cpp: In function 'll calc_1()':
pairs.cpp:104:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d",p+i);
     ~~~~~^~~~~~~~~~
pairs.cpp: In function 'll calc_2()':
pairs.cpp:123:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d",x+i,y+i);
     ~~~~~^~~~~~~~~~~~~~~~
pairs.cpp: In function 'int main()':
pairs.cpp:142:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d%d%d",&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...