#include using namespace std; const int N = 1000010; stack stk; //栈 int a[N]; //高度数组 int b[N]; //能量数组 int s[N]; //每个发射塔的结果数组 int n; //发射塔个数 int res; //最大结果 /** * 功能:计算第i个发射塔,它可以给哪个发射塔带来能量 * @param i */ void add(int i) { //把栈顶高度比自己小的出栈,这样的是不能享受i个发射塔带来的能量滴~ while (!stk.empty() && a[i] > a[stk.top()]) stk.pop(); //如果找着了一个高度比自己大的发射塔,那么,这个位置的发射塔将享受i个发射塔带来的能量。 if (!stk.empty()) s[stk.top()] += b[i]; //把自己入栈,等待其它人给自己带来能量,enjoy! stk.push(i); } int main() { cin >> n; for (int i = 1; i <= n; i++) cin >> a[i] >> b[i]; //从左向右扫一遍 for (int i = 1; i <= n; i++) add(i); //清空栈 while (!stk.empty()) stk.pop(); //从右向左扫一遍 for (int i = n; i >= 1; i--) add(i); //求最大值 for (int i = 1; i <= n; i++) res = max(s[i], res); //输出 printf("%d", res); }