hdu1856
题意:就是询问下,一个并查集里面结点数最多的....并输出来,大致是这个意思吧,当然可以离散化下,水题.....
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define M 100005 struct { int father; int sum; } s[4*M]; int t[2*M][2],a[2*M]; int find(int x) { int i=x,root; while(x!=s[x].father) x=s[x].father; root=x; x=i; while(x!=s[x].father) { i=s[x].father; s[root].sum+=s[x].sum; s[x].sum=0; s[x].father=root; x=i; } return root; } void liantong(int x,int y) { s[x].sum+=s[y].sum; s[y].father=x; s[y].sum=0; } int erfen(int ll,int rr,int num) { while(ll<=rr) { int mid=(ll+rr)/2; if(a[mid]>num) rr=mid-1; else ll=mid+1; } //printf("%d %d\n",a[rr],num); return rr; } int main() { int n; while(scanf("%d",&n)>0) { int ans=0; int cnt=0; for(int i=0; i<=3*100005; i++) { s[i].father=i; s[i].sum=1; } //scanf("") for(int i=0; i<n; i++) { scanf("%d%d",&t[i][0],&t[i][1]); a[cnt++]=t[i][0]; a[cnt++]=t[i][1]; } sort(a,a+cnt); int cnt1=1; for(int i=1; i<cnt; i++) if(a[i]!=a[i-1]) a[cnt1++]=a[i]; for(int i=cnt1-1; i>0; i--) if(a[i]!=a[i-1]+1) a[cnt1++]=a[i-1]+1; sort(a,a+cnt1); for(int i=0; i<n; i++) { int left=0,right=cnt1-1; int x=erfen(left,right,t[i][0]); int y=erfen(left,right,t[i][1]); x=find(x); y=find(y); if(x!=y) liantong(x,y); } for(int i=0;i<=2*100005;i++) find(i); int ans1=0; for(int i=0;i<=2*100005;i++) if(ans1<s[i].sum) ans1=s[i].sum; printf("%d\n",ans1); } return 0; }
朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。