tle了我几个月.......谢谢cqf大牛的算法。 //State: 0.22s 1512kb //用l,r两个数组保存当前元素向左向右访问能够达到的最大下标,因此可用dp //另:此题甚bt,数据量大的惊人,而且有陷阱,必须用scanf。我用cin的时候起码读了10s......... #include <cstdio> int a[100000], l[100000], r[100000], n; int main(){ freopen("in.txt", "r", stdin); while(scanf("%d", &n) && n) { int i; double max = 0.00; for(i = 0; i < n; i ++) { scanf("%d", &a[i]); } for(i = 0; i < n; i ++) { l[i] = i; while(l[i] > 0 && a[i] <= a[l[i] - 1]) { l[i] = l[l[i] - 1]; } } //pl(); for(i = n - 1; i >= 0; i --) { r[i] = i; while(r[i] < n - 1 && a[i] <= a[r[i] + 1]) { r[i] = r[r[i] + 1]; } double t = double((r[i] - l[i] + 1) * double(a[i])); if(max < t) max = t; } //pr(); printf("%0.0f\n", max); } return 0;}

评论