题意:就是询问下,一个并查集里面结点数最多的....并输出来,大致是这个意思吧,当然可以离散化下,水题.....
#include#include #include #include using namespace std;#define M 100005struct{ 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 0; i--) if(a[i]!=a[i-1]+1) a[cnt1++]=a[i-1]+1; sort(a,a+cnt1); for(int i=0; i