#include // 创建一个栈,拿到一个数,与栈顶比较,如果比栈顶小,压栈(正在波峰向波谷下降) // 比栈顶大,弹栈并计数;和栈顶相同,计数并且压入。 struct NumberNode { int data; int count; }; long long totalPairs; NumberNode powers[500010]; int main() { int len = 1; int N; int input; totalPairs = 0; powers[0].data = 0; powers[0].count = 0; scanf("%d", &N); scanf("%d", &powers[1].data); powers[1].count = 1; N--; for (int i = 0; i < N; i++) { scanf("%d", &input); while (len != 0 && powers[len].data < input) { totalPairs += powers[len].count; len--; } if (len == 0 ) { powers[1].data = input; powers[1].count = 1; len = 1; } else { if (powers[len].data == input) { totalPairs += powers[len].count + (len > 1); powers[len].count++; } else { totalPairs += 1; powers[++len] = NumberNode {input, 1}; } } } printf("%lld", totalPairs); return 0; }