CF875D High Cry
题目描述
免责声明:本题的俄文版有许多不可翻译的双关语,因此这又是你学习俄语的一个理由 :)
Rick 和 Morty 喜欢去 High Cry 山脊大声哭喊——那里的回声非常奇特。最近他们发现了这个山脊的一个有趣声学特性:如果 Rick 和 Morty 同时从不同的山上哭喊,那么他们的喊声在这些山之间会传到的最大高度等于他们爬上的山和其间所有山的高度的按位或(bitwise OR)。
按位或是一种二进制位运算,定义如下。考虑数字 $x$ 和 $y$ 的二进制表示(可能带有前导零) $x=x_{k}...\ x_{1}x_{0}$ 和 $y=y_{k}...\ y_{1}y_{0}$。则 $z = x~|~y$ 定义为 $z = z_k...z_1z_0$,其中 $z_i=1$ 当且仅当 $x_i=1$ 或 $y_i=1$,否则 $z_i=0$。也就是说,只有在对应位上 $x$ 和 $y$ 的数字都是 0 时,按位或的结果才为 0。举例来说,$10=1010_2$ 和 $9=1001_2$ 的按位或为 $11=1011_2$。在 C/C++/Java/Python 语言中,这个操作写作 "|",在 Pascal 语言中写作 "or"。
请帮助 Rick 和 Morty 计算有多少种方法可以选择两座不同的山,使得他们从这两座山开始哭喊时,他们的喊声的最高高度(即这两座山以及它们之间所有山的高度的按位或)大于这区间内所有山的高度的最大值。
更正式地说,统计有多少对 $l$ 和 $r$ ($1 \leq l < r \leq n$) 满足闭区间 $[l, r]$ 内所有山的高度的按位或结果严格大于该区间内任意一座山的高度的最大值。
输入格式
第一行包含一个整数 $n$($1 \leq n \leq 200000$),表示山脊上的山峰数量。
第二行包含 $n$ 个整数 $a_i$($0 \leq a_i \leq 10^{9}$),依次表示山峰的高度。
输出格式
输出一个整数,即有多少种选择两座不同山峰的方法。
说明/提示
在第一个样例中,所有满足条件的山峰对为(编号从 1 开始):
$(1,4),(1,5),(2,3),(2,4),(2,5),(3,4),(3,5),(4,5)$
在第二个样例中,没有满足条件的山峰对,因为对于任意一对山峰,他们的喊声最大高度为 $3$,与区间内任意山峰的最大高度相等。
由 ChatGPT 5 翻译