题目链接
N个数字求一个区间使得∑i=li=ra[i]×∑i=li=rmin(a[i])\sum_{i=l}^{i=r} a[i] × \sum_{i=l}^{i=r}min(a[i])∑i=li=r​a[i]×∑i=li=r​min(a[i])最大

思路

  • 枚举区间的最小值为a[i]a[i]a[i],根据ST表二分找到它 最左 LLL 和最右 RRR端点,这是保证区间[L,R][L, R][L,R]的最小值为a[i]a[i]a[i]
    preprepre记录前缀和
    sufsufsuf记录后缀和

找到区间之后分两种情况

  • a[i]≥0a[i] \ge0a[i]≥0
    Ans=a[i]×(MaxPre[i,R]−Pre[i−1]+MaxSuf[L,i]−Suf[i])Ans = a[i]×(MaxPre[i, R]-Pre[i-1] + MaxSuf[L,i]-Suf[i])Ans=a[i]×(MaxPre[i,R]−Pre[i−1]+MaxSuf[L,i]−Suf[i])
    因为a[i]≥0a[i] \ge0a[i]≥0所以我们在区间[i,R][i, R][i,R]找到一个最大的前缀和, 在区间[L,i][L, i][L,i]找到一个最大的后缀和这样就能保证值最大

  • a[i]&lt;0a[i] &lt;0a[i]<0
    和上一种情况相反
    Ans=a[i]×(MinPre[i,R]−Pre[i−1]+MinSuf[L,i]−Suf[i])Ans = a[i]×(MinPre[i, R]-Pre[i-1] + MinSuf[L,i]-Suf[i])Ans=a[i]×(MinPre[i,R]−Pre[i−1]+MinSuf[L,i]−Suf[i])
    因为a[i]&lt;0a[i] &lt;0a[i]<0所以我们在区间[i,R][i, R][i,R]找到一个最小的前缀和, 在区间[L,i][L, i][L,i]找到一个最小的后缀和这样就能保证值最大

Ac之路很坎坷,刚开始全用ST表维护最大值最小值,结果MLE(ST很快但是空间也很高),然后把求后缀的ST表用线段树写,还是MLE。前后缀都带用线段树写,两个线段树代码重复太高而且变量名也不好起,还没用C++写过类,学习下杰哥用类写的线段树。Orz。。。

AC

#include <bits/stdc++.h>
#define LL long long
#define P pair<int, int>
#define lowbit(x) (x & -x)
#define mem(a, b) memset(a, b, sizeof(a))
#define mid ((l + r) >> 1)
#define lc rt<<1
#define rc rt<<1|1
using namespace std;
const int maxn = 5e5 + 5;int a[maxn];
int dp[maxn][20];
LL pre[maxn], suf[maxn];
void ST(int n) {for (int i = 1; i <= n; ++i) {dp[i][0] = a[i];}for (int j = 1; j <= log2(n); ++j) {for (int i = 1; i+(1<<j)-1 <= n; ++i) {dp[i][j] = min(dp[i][j-1], dp[i+(1<<(j-1))][j-1]);}}
}
LL RMQ(int l, int r) {int len = r - l + 1;int x = log2(len);return min(dp[l][x], dp[r - (1<<x)+1][x]);
}class Seg{LL Max[maxn<<2], Min[maxn<<2];public: void build(int rt, int l, int r, LL a[]) {if (l == r) {Max[rt] = a[l];Min[rt] = a[l];return;}build(lc, l, mid, a);build(rc, mid+1, r, a);Max[rt] = max(Max[lc], Max[rc]);Min[rt] = min(Min[lc], Min[rc]);   }public: LL query_min(int rt, int l, int r, int ql, int qr) {if (r < ql || l > qr) return 1e18;if (l >= ql && r <= qr) return Min[rt];LL tmp1 = query_min(lc, l, mid, ql, qr);LL tmp2 = query_min(rc, mid+1, r, ql, qr);return min(tmp1, tmp2);}public: LL query_max(int rt, int l, int r, int ql, int qr) {if (r < ql || l > qr) return -1e18;if (l >= ql && r <= qr) return Max[rt];LL tmp1 = query_max(lc, l, mid, ql, qr);LL tmp2 = query_max(rc, mid+1, r, ql, qr);return max(tmp1, tmp2);}
}Pre, Suf;int main () {ios::sync_with_stdio(0);cin.tie(0), cout.tie(0);int n;scanf("%d", &n); for (int i = 1; i <= n; ++i) {scanf("%d", &a[i]);pre[i] = pre[i-1] + a[i];}for (int i = n; i >= 1; --i) {suf[i] = suf[i+1] + a[i];}ST(n);Pre.build(1, 1, n, pre);Suf.build(1, 1, n, suf);LL ans = -1e18;for (int i = 1; i <= n; ++i) {int left, right, l = i, r = n;while (l <= r) {if (RMQ(l, mid) < a[i]) r = mid - 1;else l = mid + 1;}right = r;l = 1, r = i;while (l <= r) {if (RMQ(mid, r) < a[i]) l = mid + 1;else r = mid - 1;}left = l;if (a[i] >= 0) {LL R = Pre.query_max(1, 1, n, i, right);LL L = Suf.query_max(1, 1, n, left, i);ans = max(ans, (R - pre[i-1] + L - suf[i]) * a[i]);}else {LL R = Pre.query_min(1, 1, n, i, right);LL L = Suf.query_min(1, 1, n, left, i);ans = max(ans, (R - pre[i-1] + L - suf[i]) * a[i]);}}cout << ans << endl;return 0;
}

ICPC China Nanchang National Invitational - I. Max answer(线段树+ST)相关推荐

  1. The Preliminary Contest for ICPC China Nanchang National Invitational

    Problem A PERFECT NUMBER PROBLEM https://nanti.jisuanke.com/t/38220 题解:打表 /* *@Author: STZG *@Langua ...

  2. The Preliminary Contest for ICPC China Nanchang National Invitational 南昌网络赛2019

    题解不太详细,仅提供AC代码 A. PERFECT NUMBER PROBLEM #include <bits/stdc++.h> using namespace std;int main ...

  3. ICPC China Nanchang National Invitational -- D. Match Stick Game(dp)

    题目链接:https://nanti.jisuanke.com/t/38223 题意:有一堆火柴构成了一个加减法式子,你可以把火柴重新组合,要求数字个数和原来一样多,每个数字的位数和对应原数字位数一样 ...

  4. 2018 ACM/ICPC 北京赛区网络赛 D 80 Days 线段树

    http://hihocoder.com/problemset/problem/1831?sid=1390457 描述 80 Days is an interesting game based on ...

  5. ICPC nangchan I. Max answer

    文章目录 I. Max answer 分析 代码 I. Max answer 分析 题意: 定义一个区间的值为这个区间最小值乘以区间和 分析:我们要枚举每一个值作为区间最小值时的贡献即可,这样不会漏掉 ...

  6. ACM ICPC China final G Pandaria

    目录 ACM ICPC China final G Pandaria ACM ICPC China final G Pandaria 题意:给一张\(n\)个点\(m\)条边的无向图,\(c[i]\) ...

  7. 2019 ICPC Asia Nanchang Regional

    2019 ICPC Asia Nanchang Regional C. And and Pair E. Bob's Problem 链接:https://www.jisuanke.com/contes ...

  8. SPOJ GSS3-Can you answer these queries III-分治+线段树区间合并

    Can you answer these queries III SPOJ - GSS3 这道题和洛谷的小白逛公园一样的题目. 传送门: 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间 ...

  9. HDU6218 2017ACM/ICPC亚洲区沈阳站 Bridge(Set,线段树)

    HDU6218 2017ACM/ICPC亚洲区沈阳站 Bridge Solution 我们考虑维护在环上的边的个数,答案就是总边数减去环上边数. 环的形态是这样的:(0,l),(0,l+1)...(0 ...

最新文章

  1. C#编程语言与面向对象——继承
  2. BGP属性分析--Weight
  3. C#使用Dotfuscator混淆代码以及加密
  4. oracle中pga指什么,oracle学习SGA跟PGA理解
  5. 12个数据分析里最常用的思维定式,收藏起来吃灰
  6. Python-将一个列表的数据复制到另一个列表中
  7. 2048小程序代码c语言,微信小程序版2048
  8. 我的世界java版种子多村庄_《我的世界》“村庄与掠夺”PE版种子推荐,出生点就7个村庄相连...
  9. 用友U8安装...(转)
  10. CFA大起底:三百六十度无死角详解CFA到底是个啥?
  11. 转 OFBiz财务模型-金融账户
  12. A - Annoying Present codeforce1009c -csdn博客
  13. 搭建go开发环境时,出现GoSublime error: MarGo build failed的问题
  14. PMML模型-评分卡模型Undefined result解析
  15. 《医院管理系统》项目研发总结
  16. Cis-Glyoxal-Cyclam ,CAS: 74199-16-9,CIS-十氢-1H,6H-3A,5A,8A,10A-四氮杂芘
  17. linux mint 17.3中文输入法,linux mint17 中文输入法 五笔(or 拼音)
  18. nopi设置excel单元格的格式汇总
  19. Perl——正则表达式之贪婪模式和非贪婪模式
  20. 费希尔数字控制器你知道多少?

热门文章

  1. Uva 1220,Hali-Bula 的晚会
  2. android拨打电话
  3. 吃饱了,就来写点东西吧。讲一个真实的故事给你长自信
  4. 在IE7下使用Fiddler
  5. [系统安全] 四.OllyDbg动态分析工具基础用法及Crakeme逆向破解
  6. 手把手教你完成CSDN对接百度统计 看完这篇文章你还不会对接 欢迎您提刀顺着网线来砍我!!!!
  7. Exp3 免杀原理与实践 20164309
  8. 【机器视觉】 dev_open_dialog算子
  9. 【机器视觉】 dev_get_exception_data算子
  10. 【Linux】一步一步学Linux——zipinfo命令(69)