先考慮流。
\(s->i\)連流量\(d_i\)費用\(0\)
\(i->t\)連流量\(u_i\)費用\(p_i\)
\(i->i+1\)連流量\(\inf\)費用\(c_i\)
\(i+1->i\)連流量\(\inf\)費用\(m_i\)
維護當前點到前面是否是反向邊可以用差分陣列。
在當前點增廣完後,使用差分陣列判定當前點到前面的反向邊流量。
分析複雜度:一條邊在被向右增廣時複雜度顯然是\(o(n\log_2n)\)
在被向左增廣時,由於我們從左到右增廣,所以當前邊的流量顯然會先增加,後減少。最終只會減到\(0\)一次。
而只有減到\(0\)才會貢獻複雜度\(o(\log_2n)\)。
同時,與源點/匯點相鄰的邊只有減到\(0\)才會貢獻複雜度\(o(\log_2n)\)。
所以總時間複雜度\(o(n\log_2n)\)
**細節較多。
#includeusing namespace std;
#define int long long
#define n 100010
int n,d[n],u[n],p[n],m[n],c[n],s[n];
struct no;
int operator<(no x,no y)
struct sgt
} void ad(int o,int l,int r,int x,int y,int z)
int md=(l+r)/2;
pd(o);
ad(o*2,l,md,x,y,z);
ad(o*2+1,md+1,r,x,y,z);
a[o]=min(a[o*2],a[o*2+1]);
} no qu(int o,int l,int r,int x,int y);
if(x<=l&&r<=y)
return a[o];
pd(o);
int md=(l+r)/2;
return min(qu(o*2,l,md,x,y),qu(o*2+1,md+1,r,x,y));
}}s1,s2;
void bd(int o,int l,int r);
s2.a[o]=(no);
return;
} int md=(l+r)/2;
bd(o*2,l,md);
bd(o*2+1,md+1,r);
s1.a[o]=min(s1.a[o*2],s1.a[o*2+1]);
s2.a[o]=min(s2.a[o*2],s2.a[o*2+1]);
}void deb(int t)
else
}signed main()}}
else
} s1.ad(1,1,n,1,i,m[i]);
s1.ad(1,1,n,i+1,n,-c[i]);
s[i]+=s[i-1];
if(s[i])
} printf("%lld",ans);
}
ctsc2010 星際旅行
題意很簡單 給定一棵樹,問從根分別走到每個節點的最長路程,其中每個點給定lim,即最多從該點出發lim次,保證lim大於等於該點的度數。特別 鳴謝 ldl在他的模擬題中出了這道題。當題解講這要用樹形dp解網路流模型時,都被驚異了,完全沒有想到網路流,也完全沒有必要網路流,atm在考場上直接有樹形dp...
CTSC2010 效能優化
ctsc2010 效能優化 迴圈卷積快速冪 兩個注意點 n 1不是2 k p 1形式,任意模數又太慢?n 2 k1 3 k2 5 k3 7 k4 多路分治!深刻理解fft運算本質 分治,推式子得到從下往上的迭代公式 最後求的是w n i的點值 快速冪 迴圈卷積快速冪比較特殊,就是g f,n的項的係數...
Ctsc2010 星際旅行(退流思想)
傳送門 思想很重要,題目給出了每個星球的hi大於等於與該星球直接相連的星球數 即度數 就說明從0點出發,一定可以再回到0點。在第一次dfs中把一些還可以加的流加入使得答案更大。因為圖此時已經連通。然後對於相鄰的兩個點,就一定至少有乙個的度數為0。在第二次dfs中運用 退流 思想,對於每乙個點求出它的...