Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //THIS CODE HAS BEEN WRITTEN BY CODEWORRIOR(SHIVMITRA MISHRA)
- #include<stdio.h>
- #include<math.h>
- #include<stdlib.h>
- #include<cstring>
- #include<iostream>
- #include<map>
- #include<vector>
- #include<set>
- #include<algorithm>
- #include<string>
- #include<queue>
- #include<stack>
- using namespace std;
- typedef long long int64;
- #define FOR(i,a,b) for(int64 i=a;i<=b;i++)
- #define A first
- #define B second
- #define PII pair<int,int>
- #define VI vector<int>
- #define CLR(a,b) memset(a,b,sizeof(a))
- #define mp make_pair
- #define pb push_back
- //DISJOINT SET DATA STRUCTURE IMPLEMENTED BY CODEWORRIOR(SHIVMITRA MISHRA).
- class DS //DATA STRUCTURE FOR DISJOINT SET
- {
- private:
- vector<int64>p;
- vector<int64>rank;
- public:
- void make_set(int64 x);
- void set_union(int64 x,int64 y);
- int64 find_set(int64 x);
- void set_size(int64 size);
- void clear_forest();
- private:
- void link(int64 x,int64 y);
- }ds; //OBJECT NAME TO BE USED IS ds
- void DS::clear_forest()
- {
- DS::p.clear();
- DS::rank.clear();
- }
- void DS::set_size(int64 size) //FUNCTION TO SET SIZES OF VECTOR RANK AND PARENT
- {
- DS::p.resize(size);
- DS::rank.resize(size);
- }
- void DS::make_set(int64 x) //FUNCTION TO MAKE SET
- {
- DS::p[x]=x;
- DS::rank[x]=0;
- }
- void DS::link(int64 x,int64 y)
- {
- if(DS::rank[x]>DS::rank[y])
- DS::p[y]=x;
- else
- {
- DS::p[x]=y;
- if(DS::rank[x]==rank[y])
- DS::rank[y]=DS::rank[y]+1;
- }
- }
- void DS::set_union(int64 x,int64 y) //FUNVTION FOR UNION
- {
- DS::link(find_set(x),find_set(y));
- }
- int64 DS::find_set(int64 x)
- {
- if(x!=DS::p[x])
- DS::p[x]=find_set(p[x]);
- return DS::p[x];
- }
- //DS ENDS HERE
- int main()
- {
- int64 n;
- scanf("%lld",&n);
- ds.set_size(n+1);
- int x1[n],y1[n],x2[n],y2[n];
- FOR(i,0,n-1)
- {
- scanf("%lld%lld%lld%lld",&x1[i],&y1[i],&x2[i],&y2[i]);
- ds.make_set(i);
- }
- int64 count=n;
- FOR(i,0,n-2)
- {
- FOR(j,i,n-1)
- {
- //int j=i+1;
- if(y1[i]==y2[j] || y1[j]==y2[i])
- {
- int union_len=max(max(x1[i],x2[i]),max(x1[j],x2[j]) ) - min( min(x1[i],x2[i]),min(x1[j],x2[j]) );
- int len=abs(x1[i]-x2[i]) + abs(x1[j]-x2[j]);
- if(union_len<len)
- {
- if(ds.find_set(i)!=ds.find_set(j))
- {
- ds.set_union(i,j);
- count--;
- }
- }
- }
- }
- }
- printf("%lld",count);
- //system("pause");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement