1. 程式人生 > 其它 >[NOIP2011 提高組]聰明的質監員(二分+字首和)

[NOIP2011 提高組]聰明的質監員(二分+字首和)

二分答案的思路顯然可以更加開闊:向我們所希望的方向調整答案區間,而非簡單的找臨界。

觀察這個小柿子有什麼特點:

\[y_i=\sum\limits_{j=l_i}^{r_i} [w_j\ge W]\times\sum\limits_{j=l_i}^{r_i}[w_j\ge W]v_j \]

我們要求的是 \(\vert s-y \vert\) 的最小值,\(s\) 恆定,而 \(y\) 可以發現是與 \(W\) 負相關的。\(W\) 增大時,\(y_i\) 減小,故 \(y\) 減小;\(W\) 減小時,\(y_i\) 增大,故 \(y\) 增大。這樣,我們可以二分 \(W\)。不同於一般情況下 check 得到的 \(mid\) 是否成立,我們在 \(y>s\) 時增大 \(W\)

以減小 \(y\),在 \(y<s\) 時減小 \(W\) 以增大 \(y\)。如下所示:

//in check()
res=abs(s-Y);
if(Y>s) return true;
else return false;

//in main()
while(l<r) {
	int mid=(l+r)>>1;
	if(check(mid)) l=mid+1;
	else r=mid-1;
	ans=min(ans,res);//更新|s-y|最小值
}

如果只是這樣二分顯然會 TLE,我們發現上面的式子可以字首和處理,最終時間複雜度為 \(\mathcal{O(n+m)\log W}\)

THE END