解惑
bool check(int P[],int u,int v)
{
return P[v+L[u]]<=P[v] && P[v+R[u]]>=P[v];
}
之所以要取等,是因为 L[u] 或 R[u] 可能为 0。所以等价于:
bool check(int P[],int u,int v)
{
return (!L[u] || P[v+L[u]]<P[v]) && (!R[u] || P[v+R[u]]>P[v]);
}
Hack
那我们自然想到 v+L[u] 或 v+R[u] 可能 ≥106,越界访问。所以会出现问题。但是现存线性时间复杂度的题解均无判断。有如下 Hack。
额,在这道题的说明与提示,你也可以在这里测试。
针对的是第一篇题解,maowuyou,测试记录。
显然,其他题解,如:RedreamMer、Iratis、da32s1da都是错误的,但是由于众所周知的原因(这咋造数据啊),没有拍出 Hack 数据,但是都是有问题的。
故申请撤下这些题解,并加入 Hack 数据。