T1想了好多东西,什么set了,最后只写了一个暴力减枝
T2感觉是要大力转化题意,但是没有思路
T3根本没有想到高斯消元
T1「二维偏序」「树状数组」
题意首先转化为求解sa_r>=sa_{l-1}&&sb_r>=sb_{l-1}的max{r-(l-1)}
加上r>l之后是三维,然后大佬就各种CDQ,树套树的nb做法
但是由于询问是max{r-(l-1)},显然就算第三维不保证,也不会更新出ans
那么就剩二维了,似乎很常规的思路是,将一维排序,剩的一维可以用树状数组解决
这道题目还要注意特判0
T2 「搜索树」「转化题意」「区间DP」
二叉搜索树的性质:对于一个节点x,其lc或rc的所有点构成的必定为一个连续的区间
那么在建树的过程中,对于一段区间要想成为一棵子树,其必定要有一个根节点 x in [l,r]
dp定义不难写出f[l][r]表示将[l,r]建成一颗子树之后的最优贡献,再定义一个辅助数组g[l][r]表示该最优情况下的根节点是谁
转移f[l][r]=f[l][k-1]+f[k+1][r]+sum{a[l,r]} kin [l,r]
考虑去优化这个O(n^3)玩意。
首先给出结论(我也不知道大佬怎么想到的)
k的范围缩小至[g[l][r-1],g[l+1][r]]
证明其实比较简单:
考虑在已经建出的[[l,r-1]的树中加入点r显然要加在g[l][r-1]的右子树的某位置
在这种情况下想要变成最优的,只可能是将根转为g[l][r-1]的右子树的某个点
所以kin [g[l][r-1],r]同理得kin [l,g[l+1][r]]取一个交集即可
复杂度变成O(n^2)证明
最外层枚举区间长度O(n)
那么只要证每个len下枚举的sum{k}的复杂度O(n)即可
考虑[l,r]的范围是[g[l][r-1],g[l+1][r]]
[l+1][r+1]的范围是[g[l+1][r],g[l+2][r+1]]
然后发现g[l+1][r]是相等的,显然每个点至多会被枚举两次
证毕