is the MO team's template problem.
/*memory:0 KB time:1663 mslanguage:c++11 4.8.2 result:accepted*/#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cstdlib>#include<cmath>using namespaceStd;typedefLong LongLL;Const intinf=0x3f3f3f3f;Const intmaxn=100005;structpoint{intX,y,id; BOOL operator< (ConstPoint &e)Const { if(x==e.x)returny<e.y; returnx<e.x; }} POINT[MAXN];structedge{intu,v,w; BOOL operator< (ConstEdge &e)Const { returnw<E.W; }} EDGE[MAXN*4];inttot;voidAddedge (intUintVintW) { ++tot; EDGE[TOT].U=u; EDGE[TOT].V=v; EDGE[TOT].W=W;}structnode{intMinval,pos; voidinit () {minval=INF; POS=-1; }} NODE[MAXN];intLowbit (intx) { returnx& (-x);}voidUpdateintIintValintPOS) { while(i>0) { if(val<node[i].minval) {Node[i].minval=Val; Node[i].pos=POS; } I-=lowbit (i); }}intQueryintIintm) { intminval=inf,pos=-1; while(i<=m) {if(node[i].minval<minval) {Minval=Node[i].minval; POS=Node[i].pos; } I+=lowbit (i); } returnPos;}intDis (point a,point b) {returnABS (a.x-b.x) +abs (a.y-b.y);}intC[maxn],b[maxn],n;voidbuild () {sort ( point+1, point+n+1); for(intI=1; i<=n; ++i) b[i]=c[i]=point[i].y-point[i].x; Sort (c+1, c+1+N); intM=unique (c+1, c+1+n)-(c+1); for(intI=1; i<=m; ++i) node[i].init (); for(intI=n; I>0; --i) {intPos=lower_bound (c+1, c+1+m,b[i])-C; inttt=query (POS,M); if(tt!=-1) Addedge (Point[i].id,point[tt].id,dis (POINT[I],POINT[TT)); Update (pos,point[i].x+point[i].y,i); }}intFA[MAXN];intFindintx) { if(X==fa[x])returnx; returnfa[x]=find (Fa[x]);} LL solve () {Sort (Edge+1, edge+1+tot); for(intI=1; i<=n; ++i) fa[i]=i; intCnt=0; LL MST=0; for(intI=1; i<=tot; ++i) {intfx=find (EDGE[I].U); intfy=find (EDGE[I].V); if(FX==FY)Continue; FA[FY]=FX; MST+=EDGE[I].W; CNT++; if(cnt>=n) Break; } returnMST;}intMain () {intcas=0; while(~SCANF ("%d",&N) {tot=0; for(intI=1; i<=n; ++i) scanf ("%d%d", &point[i].x,&point[i].y), point[i].id=i; Build (); for(intI=1; i<=n; ++i) point[i].y=-point[i].y; Build (); for(intI=1; i<=n; ++i) point[i].y=-Point[i].y,swap (POINT[I].X,POINT[I].Y); Build (); for(intI=1; i<=n; ++i) point[i].y=-point[i].y; Build (); printf ("Case %d:total Weight =%lld\n",++cas,solve ()); } return 0;}View Code
UVAlive3662 another Minimum Spanning Tree mo Team algorithm