「LOJ 2430」「POI2014」沙拉餐厅 Salad Baralad Bar
题意
一排$n$个水果$a_1..a_n$,分别是苹果$(j)$和橘子$(p)$,求最长的区间满足从左向右和从右向左取水果,任意时刻都有橘子数$\ge$苹果数,输出最长的区间长度
$n\le 10^6$
分析
记$d_i=\sum_{x=1}^i[a_x=p]-\sum_{x=1}^i[a_x=j]$
一个区间$[l,r]$满足条件当且仅当$\forall l\le i\le r,d_l\le d_i\le d_r$
可以用单调栈处理出最近的$l$满足$d_l>d_i$,于是以$i$为右端点的区间,最小的合法左端点是$[l+1,i]$中的最小值(如果存在)。
这个区间最小值位置可以在单调栈里顺便维护一下
复杂度 $\mathcal O(n)$
代码
1 |
|
「LOJ 2430」「POI2014」沙拉餐厅 Salad Baralad Bar