Channel
Test instructions
Ideas:
Code:
#include <cstdio>#include<cstring>#include<queue>#include<algorithm>using namespaceStd;typedefLong Longll;template<classT>inlineBOOLRD (T &ret) { CharCintSGN; if(c = GetChar (), c = = EOF)return false; while(c! ='-'&& (C <'0'|| C >'9')) C =GetChar (); SGN= (c = ='-') ? -1:1; RET= (c = ='-') ?0: (C-'0'); while(c = GetChar (), C >='0'&& C <='9') ret = RET *Ten+ (C-'0'); RET*=SGN; return true;}Const intINF =0x3f3f3f3f;Const intMax_n = -;Const intMax_m = Max_n *Max_n;structEdge {intu, V, cap, cost, NXT; Edge () {} Edge (int_u,int_v,int_c,int_c,int_n) {u= _u, v = _v, cap = _c, cost = _c, NXT =_n; }};structEdge {intu, V, cap, flow, cost, NXT; void Set(int_u,int_v,int_cap,int_flow,int_cost,int_nxt) {u= _u, v = _v, cap = _cap, flow = _flow, cost = _cost, NXT =_nxt; }};structMCMF {intFst[max_n], CC, D[max_n], P[max_n], a[max_n]; Edge E[max_m]; BOOL inch[Max_n]; voidinit () {memset (FST,-1,sizeof(FST)); CC =0; } voidAddintUintVintCapintCost ) {E[CC].Set(U, V, Cap,0, cost, Fst[u]), fst[u] = cc++; E[CC].Set(V, U,0,0,-cost, Fst[v]), fst[v] = cc++; } intSPFA (intSintTint&MF,int&MC) {memset (d,0x3f,sizeof(d)); memset (inch,0,sizeof(inch)); D[s]=0, a[s] = inf,inch[s] =1, p[s] =0; Queue<int>Q; Q.push (s); while(!Q.empty ()) { intU = Q.front (); Q.pop ();inch[U] =0; for(inti = Fst[u]; ~i; i =e[i].nxt) { intv =e[i].v; if(E[i].cap > E[i].flow && d[v] > D[u] +e[i].cost) {D[v]= D[u] + e[i].cost, p[v] =i; A[V]= Min (A[u], E[i].cap-E[i].flow); if(!inch[v])inch[V] =1, Q.push (v); } } } if(D[t] = = INF)return 0; MF+ = A[t], MC + = a[t] *D[t]; intU =T; while(U! =s) {E[p[u]].flow+ = A[t], E[p[u] ^1].flow-=A[t]; U=e[p[u]].u; } return 1; } intGointSintt) {intRET =0, MF =0, MC =0; while(SPFA (S, T, MF, MC)) ret =min (ret, MC); returnret; }}go;structNode {intH, D; Node () {} node (int_h,int_d) {H= _h, D =_d; } BOOL operator< (ConstNode &RHS)Const { if(H! = RHS. HreturnH >RHS. H returnD <RHS. D }} A[max_n];intm;structBit {ll bit[max_n]; voidClear () {memset (bit,0,sizeofbit); } voidAddintI, LL v) { if(i = =0) bit[0] +=v; Else { for(; I <= m; i + = i &-i) bit[i]+=v; }} ll query (inti) {if(I <0)return 0; Else{ll re=0; for(; i >0; I-= i &-i) Re+=Bit[i]; returnre; } }};intN, B[max_n], cnt[max_n][max_n]; Bit Tree;voidClear () {tree.clear (); Go.init ();}intMain () {intT; Rd (T); while(t-->0) {Clear (); RD (N); M=0; for(inti =0; I < n; ++i) {rd (A[i]. H), RD (A[i]. D); b[++M] =A[i]. D } if(N <=2) {printf ("%d\n", N); Continue; } sort (b+1, B +1+m); M= Unique (b +1, B + n +1)-B-1; Sort (A, a+N); for(inti =0; I < n; ++i) a[i]. D= Lower_bound (b +1, B + M +1, A[i]. D)-b; for(inti =0; I < n; ++i) { for(intj =1; J <= M; ++J) Tree.bit[j] =0; for(intj = i; J < N; ++j) {if(A[j]. D < A[i]. DContinue; Tree.add (A[j]. D,1); CNT[I][J]=tree.query (A[j]. D); } } intS =0, T =2* n +1, X = T +1; Go.add (S, X,2,0); for(inti =0; I < n; ++i) {go.add (X, I*2+1,1,0); Go.add (i*2+2T1,0); Go.add (i*2+1I2+2,1,0); for(intj = i +1; J < N; ++j) {if(A[i]. D > A[j]. DContinue; if(Cnt[i][j] >=5)Continue; Go.add (i*2+2, J *2+1,1, -1); } } intAns =-go.go (S, T) +2; printf ("%d\n", ans); } return 0;}
View Code
"Cost Flow" HDU 5406 CRB and Apple