题面:
题意:
有一个 1 ∗ n 1*n 1∗n 的水箱,水箱的四周的高度为无穷大。现在用 n − 1 n-1 n−1 高度为 h i h_i hi 的隔板将水箱分为 n n n 个 1 ∗ 1 1*1 1∗1 的部分。
隔板不透水,但是水的流动遵循一般的物理规律,即如果当前水位如果比某一侧的隔板要高,谁就会从一个部分流向另一个部分。
现在已知这 n n n 个部分某些部分可能有一定高度的水,进行 m m m 次探测,第 i i i 次探测以 x x x y y y z z z 的形式给出,如果 z = 0 z=0 z=0 ,说明第 x x x 个部分高度为 ( y + 0.5 ) (y+0.5) (y+0.5) 处没有水。如果 z = 1 z=1 z=1 ,说明第 x x x 个部分高度为 ( y + 0.5 ) (y+0.5) (y+0.5) 处有水。
但是不保证这 m m m 个查询一定正确,问这 m m m 个查询中最多有多少个是正确的。
题解:
考虑初始时,如果所有的部分都没有水,那么答案 a n s = ∑ [ z = 0 ] ans=\sum[z=0] ans=∑[z=0]。
但是让一些部分有水以后,答案可能会更优。
我们从小到大枚举水的高度 y y y(向下取整)。
找到当前如果第 x x x 部分的水位高度为 y y y 时,需要找到往左往右扩展多少。即找到左边第一块高度大于 y y y 的板,右边第一块高度大于 y y y 的板,记这个区间为 [ l , r ] [l,r] [l,r]。如果当前 x x x 部分的水位高度为 y y y,那么 [ l , r ] [l,r] [l,r] 的水位高度也应该为 y y y。我们记 [ l , r ] [l,r] [l,r] 区间水位小于等于 y y y 且 z = 0 z=0 z=0 的数量 c n t 1 cnt1 cnt1,这一部分由真变假。我们记 [ l , r ] [l,r] [l,r]区间水位小于等于 y y y 且 z = 1 z=1 z=1 的数量为 c n t 2 cnt2