Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* 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 */
- vi X[MAX],Y[MAX];ll ans;
- set<int>XX[MAX],YY[MAX];
- void dfs(int s,int flag){
- int len;
- if(flag){
- len = X[s].size();
- for(int i = 0;i<len;i++){
- for(int j = i+1;j<len;j++){
- int x = X[s][i];
- int xx = X[s][j];
- int d = abs(x - xx);
- 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++;
- 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++;
- }
- }
- }
- else {
- len = Y[s].size();
- for(int i = 0;i<len;i++){
- for(int j = i+1;j<len;j++){
- int x = Y[s][i];
- int xx = Y[s][j];
- int d = abs(x - xx);
- 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++;
- 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++;
- }
- }
- }
- }
- int main()
- {
- booster()
- ///read("input.txt");
- int n;
- cin>>n;
- for(int i = 1;i<=n;i++){
- int x,y;
- cin>>x>>y;
- XX[x].insert(y);
- X[x].pb(y);
- }
- int sz = sqrt(n);
- for(int i = 0;i<MAX;i++){
- if(X[i].size()>sz){
- for(auto it : X[i]){
- YY[it].insert(i);
- Y[it].pb(i);
- }
- }
- else {
- dfs(i,1);
- XX[i].clear();
- X[i].clear();
- }
- }
- for(int i = 0;i<MAX;i++){
- dfs(i,0);
- YY[i].clear();
- Y[i].clear();
- }
- cout<<ans;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement