线性做法。
设输入的数组是a[1...n]。对于每个a[i],定义它的支配区间[le[i], ri[i]]:
(1)对所有le[i]<=j<=ri[i]的j,都有a[j]|a[i]=a[j]且a[j]<=a[i]
(2)le[i]<=i<=ri[i]
(3)满足前两条的情况下尽量长。
我们称i支配j,当le[i]<=j<=ri[i]。
如果i不支配j,k支配j,那i不支配k。
称一个区间是合法的,当这个区间的不鸽指数大于鸽子指数。
可以证明一个区间是合法的当且仅当这个区间中有两个数a[x]和a[y]使得x不支配y,且a[x]是整个区间的最大值。我们称x和y为一对见证者。
然后考虑问题的答案。假设询问的是包含a[z]的满足条件的最短区间。我们分3种情况考虑。
情况1:如果区间的右端点为z,我们记以z为右端点,合法的最短区间的左端点为answer_left[z]。显然answer_left[z]不能大于等于le[z],因为le[z]到z之间的数字的最大值和按位或值都是a[z]。假如le[z]>1,且le[z]-1不支配z,answer_left[z]就等于le[z]-1了,因为z也不支配le[z]-1,且要么a[z]是[le[z],z]的最大值,要么a[le[z]]是(其它的数字都不超过a[z])最大值。如果如果le[z]>1,且z被le[z]-1支配,那么answer_left[z]就等于answer_left[le[z]-1]。([answer_left[le[z]-1],le[z]-1]之间有一对见证者。这对见证者在区间[answer_left[le[z]-1],z]里也是见证者,因为[le[z],z]之间的数都不超过a[z]<=a[le[z]-1]。所以answer_left[le[z]-1]<=answer_left[z]。反过来,[answer_left[z],z]里也有一对见证者x和y。这里区间最大值a[x]>=a[le[z]-1],因为a[le[z]-1]在[answer_left[z],z]里。如果y>=le[z],由于le[z]-1支配y,所以x不支配le[z]-1。所以我们可以假定y<=le[z]-1。所以x和y都在[answer_left[z],le[z]-1]这个区间里。即answer_left[le[z]-1]>=answer_left[z]。)
情况2:区间左端点为z。和情况1类似。
情况3:区间左右端点都不是z。因为z支配le[z]到ri[z]之间的所有数,左端点必须小于等于le[z]-1,右端点也必须大于等于ri[z]+1。这时如果le[z]-1不支配z,情况1算出的[le[z]-1,z]就比[le[z]-1,ri[z]+1]短了。所以可以假设le[z]-1支配z。同理假设ri[z]+1支配z。这时如果le[z]-1和ri[z]+1互不支配,情况3的答案就是[le[z]-1,ri[z]+1]。否则不妨设le[z]-1支配ri[z]+1。此时包含z的情况3区间必定包含le[z]-1(是le[z]-1的情况2或者情况3区间),包含le[z]-1的情况2或3区间也必定包含z。设answer_both[z]为包含z的情况3区间的最短长度,有answer_both[z]=min(answer_right[le[z]-1]-le[z]+1,answer_both[le[z]-1])。
情况3可以按照数字大小从大到小依次处理,情况1和2只要顺序/倒序处理即可。复杂度为排序的log。如果把le[i]-1,i,ri[i]+1之间的支配关系建图,拓扑排序或者记忆化搜索,就不用sort()了。