8.15总结
T1
题目大意:
找到数组中满足s[r]-s[l-1]<t的个数。
原思路:
推出了s[r]<t+s[l-1],但不知道怎么处理。
正解:
区间数点,可以用树状数组。
推出了s[l-1]>s[r]-t
所以用前缀和来算,枚举每个s[r],找比s[r]-t大的前缀和(s[l-1])个数,然后再把这个前缀和加入树状数组,不能提前加,否则会多算一个,注意,要将s[0]也加入,我们找的是s[l-1]。
但是需要离散化,否则
T2
题目大意:
给定一个字符串,若干次询问,每次询问给一个区间,求字符串的这个范围内的最大合法括号子序列长度。
原思路:
看题目感觉是莫队,但括号加进去匹配不了,所以莫队是错的。
正解:
维护三个数组,一个是无法配对的左括号个数,一个是无法配对的右括号个数,最后一个是最大合法括号子序列长度。
左区间的左括号可能会与右区间的右括号配对,所以不是单纯的左右区间最大合法括号子序列长度的和,还要加上能多配对的个数(左区间无法配对的左括号个数与右区间无法配对的右括号个数的最小值),相应的,这个区间无法配对的左括号个数和无法配对的右括号个数也要减少。
T3
题目大意:
给定两个区间,若干次操作,每次操作会将某一区间分割,求两个区间分割出的最大值的乘积。
正解:
两个区间,就要分两种情况,升个维就行了。
因为是个二维平面,所以可以当作许多格子。
线段树维护四个数组,左边未切割的格子个数,右边未切割的长度,最大值,总长度。
在更新的时候,可能左区间左边未切割的长度等于左区间总长度,所以这个区间的左边未切割的长度就会等于左区间总长+右区间左边未切割的长度,右区间同理。
最大值更新的时候有3种情况:
1.左区间最大值
2.右区间最大值
3.