题意:找出连续区间和大于0的最大区间和长度
思路:维护一个前缀和的优先队列,按前缀和从大到小排列,那么因为你每次后来取出的前缀和相等或者小于之前取出的前缀和,这样只用维护一个右端点更新区间最大长度即可。时间复杂度为O(nlogn)。思路正确,是最丑的一个写法,卡GUO。
附上代码:
#include<cstdio>
#include<vector>
#include<cstdlib>
#include<queue>
#include<algorithm>
using namespace std;
#define pi acos(-1.0)
int ax[2000100];
struct inst {
int id;
int sum;
inst() {}
inst(int idd,int summ) {
this->id = idd;
this->sum = summ;
}
bool operator < (const inst A) const {
if (A.sum == this->sum) return this->id > A.id;
else return this->sum < A.sum;
}
};
priority_queue<inst>q;
int main(void) {
int n;
scanf("%d", &n);
int ff = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &ax[i]);
if (ax[i] > 0) ff = 1;
ax[i] = ax[i - 1] + ax[i];
q.push(inst(i, ax[i]));
}
q.push(inst(-1, 0));
int k = -1;
int ans = ff;
while (!q.empty()) {
inst a = q.top();
int gg = k;
while (!q.empty() && q.top().sum == a.sum) {
inst g = q.top();
ans = max(ans, k - g.id);
q.pop();
gg = max(g.id, gg);
}
k = gg;
}
printf("%d\n", ans);
}