= L && Y<=R,使得X,Y這段的連續和是LR之間的最大連續和,如果有多解,輸出X小的,接著是Y小的。解題思路:結點保存三個附加線段,max_sub">

多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > 互聯網 > UVA - 1400"Ray, Pass me the dishes!"(線段樹)

UVA - 1400"Ray, Pass me the dishes!"(線段樹)

來源:程序員人生   發布時間:2014-10-08 08:00:01 閱讀次數:2276次

UVA - 1400"Ray, Pass me the dishes!"(線段樹)

題目鏈接

題目大意:給你N個數字,要求你動態的給出L到R之間,X>= L && Y<=R,使得X,Y這段的連續和是LR之間的最大連續和,如果有多解,輸出X小的,接著是Y小的。

解題思路:結點保存三個附加線段,max_sub, max_suffix, max_prefix.對于每次查詢最大的連續和要不出現在左子樹的max_sub, 要不就是右子樹的max_sub, 要不就是左子樹的max_suffix + 右子樹的max_prefix.然后每次查詢的時候都返回一個新的節點,是新的控制范圍和在這個范圍內的對應的三個線段值。求max_prefix和max_suffix的時候要注意。

代碼:

#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; const int N = 5e5 + 5; #define lson(x) ((x)<<1) #define rson(x) (((x)<<1) + 1) ll A[N], S[N]; struct Segment { ll v; int l, r; Segment(int l = 0, int r = 0, ll v = 0) { this->l = l; this->r = r; this->v = v; } Segment operator + (const Segment& a) const{ Segment ans; ans.l = min (l, a.l); ans.r = max (r, a.r); ans.v = v + a.v; return ans; } bool operator < (const Segment &a) const { if (v == a.v) { if (l == a.l) return r > a.r; return l > a.l; } return v < a.v; } }; struct Node { int l, r; Segment max_sub, max_prefix, max_suffix; void set (int l, int r, Segment max_sub, Segment max_prefix, Segment max_suffix) { this->l = l; this->r = r; this->max_sub = max_sub; this->max_prefix = max_prefix; this->max_suffix = max_suffix; } }node[4 * N]; Node Seg_merge(Node a, Node b) { Node ret; ll suml = S[a.r] - S[a.l - 1]; ll sumr = S[b.r] - S[b.l - 1]; ret.l = a.l; ret.r = b.r; ret.max_sub = max(a.max_suffix + b.max_prefix, max(a.max_sub, b.max_sub)); ret.max_prefix = max (a.max_prefix, Segment(a.l, a.r, suml) + b.max_prefix); ret.max_suffix = max (b.max_suffix, a.max_suffix + Segment(b.l, b.r, sumr)); return ret; } void build (int u, int l, int r) { if (l == r) { Segment max_sub(l, r, A[l]); Segment max_prefix(l, r, A[l]); Segment max_suffix(l, r, A[l]); node[u].set(l, r, max_sub, max_prefix, max_suffix); } else { int m = (l + r) / 2; build(lson(u), l, m); build(rson(u), m + 1, r); node[u] = Seg_merge(node[lson(u)], node[rson(u)]); } } Node Query (int u, int ql, int qr) { if (ql <= node[u].l && qr >= node[u].r) return node[u]; int m = (node[u].l + node[u].r) / 2; if (ql > m) return Query (rson(u), ql, qr); else if (qr <= m) return Query (lson(u), ql, qr); else return Seg_merge(Query(lson(u), ql, qr), Query(rson(u), ql, qr)); } int n, m; int main () { int cas = 0; int l, r; Node ans; while (scanf ("%d%d", &n, &m) != EOF) { S[0] = 0; for (int i = 1; i <= n; i++) { scanf ("%lld", &A[i]); S[i] = S[i - 1] + A[i]; } printf ("Case %d: ", ++cas); build(1, 1, n); for (int i = 0; i < m; i++) { scanf ("%d%d", &l, &r); ans = Query(1, l, r); printf ("%d %d ", ans.max_sub.l, ans.max_sub.r); } } return 0; }
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 国产成人久久精品二区三区牛 | 国产亚洲图片 | 国产乱码精品一区二区三区中 | 欧洲精品一区二区 | 美国一级毛片片aa久久综合 | 欧洲精品一区二区 | 日韩欧美中文字幕出 | 免费激情视频网站 | 欧美精品国产一区二区三区 | 涩涩片影院 | 欧美夜夜片a | 亚洲精品一区二区观看 | 91福利国产在线观看 | 亚洲18卡通动漫在线播放 | 国产免费一级高清淫日本片 | 国产一国产一级毛片视频 | 在线中文字幕观看 | 国产精品jizz在线观看软件 | 欧美性生活视频 | 日韩欧美伊人久久大香线蕉 | 国产精品欧美日韩精品 | 亚洲欧美日产综合在线看 | 久久婷婷人人澡人人爱91 | 97精品国产福利一区二区三区 | 欧洲美女a视频一级毛片 | 人人澡人人擦人人免费 | 国产亚洲欧美日韩在线一区 | 日本一区二区三区四区五区 | 伊人8| 日韩小视频在线播放 | 18videosex性欧美69超高清 | 男人边吃奶边做性视频 | 亚洲免费影视 | 欧美性videos高清精品 | 伊人久久大香线蕉综合亚洲 | 亚洲一区二区色 | 亚洲一区二区精品推荐 | 丁香五月好婷婷深深爱 | 国产美女啪啪 | 手机在线一区二区三区 | 九九成人免费视频 |