CTSC2010 產品銷售

2022-06-03 09:24:14 字數 1516 閱讀 6453

先考慮流。

\(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中運用 退流 思想,對於每乙個點求出它的...