Advertisement
RaFiN_

count given N points how many squares parallel to XY axis ca

Aug 9th, 2019
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.97 KB | None | 0 0
  1. /* count given N points how many squares parallel to XY axis can b formed...Here if one x point has more than sqrt(N) points the Y axis of them will have less than sqrt(N) points...codeforces 425D */
  2.  
  3. vi X[MAX],Y[MAX];ll ans;
  4.  
  5. set<int>XX[MAX],YY[MAX];
  6.  
  7. void dfs(int s,int flag){
  8.     int len;
  9.     if(flag){
  10.         len = X[s].size();
  11.         for(int i = 0;i<len;i++){
  12.             for(int j = i+1;j<len;j++){
  13.                 int x = X[s][i];
  14.                 int xx = X[s][j];
  15.                 int d = abs(x - xx);
  16.                
  17.                 if(s - d>=0&&s - d<MAX&&XX[s - d].find(x)!=XX[s-d].end()&&XX[s-d].find(xx)!=XX[s-d].end())ans++;
  18.                 if(s + d>=0&&s + d<MAX&&XX[s + d].find(x)!=XX[s+d].end()&&XX[s+d].find(xx)!=XX[s+d].end())ans++;
  19.             }
  20.         }
  21.     }
  22.     else {
  23.         len = Y[s].size();
  24.          for(int i = 0;i<len;i++){
  25.             for(int j = i+1;j<len;j++){
  26.                 int x = Y[s][i];
  27.                 int xx = Y[s][j];
  28.                 int d = abs(x - xx);
  29.                
  30.                 if(s - d>=0&&s - d<MAX&&YY[s - d].find(x)!=YY[s-d].end()&&YY[s-d].find(xx)!=YY[s-d].end())ans++;
  31.                 if(s + d>=0&&s + d<MAX&&YY[s + d].find(x)!=YY[s+d].end()&&YY[s+d].find(xx)!=YY[s+d].end())ans++;
  32.             }
  33.         }
  34.     }
  35. }
  36.  
  37.  
  38. int main()
  39. {
  40.     booster()
  41.     ///read("input.txt");
  42.  
  43.     int n;
  44.     cin>>n;
  45.     for(int i = 1;i<=n;i++){
  46.         int x,y;
  47.         cin>>x>>y;
  48.         XX[x].insert(y);
  49.         X[x].pb(y);
  50.     }
  51.  
  52.     int sz = sqrt(n);
  53.  
  54.     for(int i = 0;i<MAX;i++){
  55.         if(X[i].size()>sz){
  56.             for(auto it : X[i]){
  57.                 YY[it].insert(i);
  58.                 Y[it].pb(i);
  59.             }
  60.         }
  61.         else {
  62.             dfs(i,1);
  63.             XX[i].clear();
  64.             X[i].clear();
  65.         }
  66.     }
  67.     for(int i = 0;i<MAX;i++){
  68.         dfs(i,0);
  69.         YY[i].clear();
  70.         Y[i].clear();
  71.     }
  72.  
  73.     cout<<ans;
  74.  
  75.     return 0;
  76. }
  77.  
  78.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement