48 lines
1.2 KiB
C++
48 lines
1.2 KiB
C++
#include <stdio.h>
|
|
// 创建一个栈,拿到一个数,与栈顶比较,如果比栈顶小,压栈(正在波峰向波谷下降)
|
|
// 比栈顶大,弹栈并计数;和栈顶相同,计数并且压入。
|
|
|
|
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;
|
|
} |