zoukankan      html  css  js  c++  java
  • 「SP1716」GSS3

    传送门
    Luogu

    解题思路

    区间最大子段和板子题。
    考虑用线段树来做。
    对于一个线段树节点所包含区间,它的最大子段和有两种情况,包含中点与不包含。
    不包含的情况直接从左右子树转移。
    对于包含的情况:
    我们对每个节点维护两个值:开头是左端点的最大子段和,结尾是右端点的最大子段和。
    那么包含中点的情况可以用上面两个东西转移。
    那么这两个东西又怎么维护呢。。。
    他们也有包含与不包含中点的情况,只要记一下节点的区间和就可以了,具体方法同上。
    于是便搞定了这道题。

    细节注意事项

    • 咕咕咕

    参考代码

    #include <algorithm>
    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #include <cctype>
    #include <cmath>
    #include <ctime>
    #define rg register
    using namespace std;
    template < typename T > inline void read(T& s) {
     	s = 0; int f = 0; char c = getchar();
     	while (!isdigit(c)) f |= (c == '-'), c = getchar();
     	while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
     	s = f ? -s : s;
    }
    
    const int _ = 50010;
    
    int n, q, a[_];
    struct node { int sum, L, R, mx; }t[_ << 2];
    
    inline int lc(int rt) { return rt << 1; }
    
    inline int rc(int rt) { return rt << 1 | 1; }
    
    inline void pushup(int rt) {
    	t[rt].sum = t[lc(rt)].sum + t[rc(rt)].sum;
    	t[rt].L = max(t[lc(rt)].L, t[lc(rt)].sum + t[rc(rt)].L);
    	t[rt].R = max(t[rc(rt)].R, t[rc(rt)].sum + t[lc(rt)].R);
    	t[rt].mx = max(t[lc(rt)].R + t[rc(rt)].L, max(t[lc(rt)].mx, t[rc(rt)].mx));
    }
    
    inline void build(int rt = 1, int l = 1, int r = n) {
    	if (l == r) { t[rt] = (node) { a[l], a[l], a[l], a[l] }; return; }
    	int mid = (l + r) >> 1;
    	build(lc(rt), l, mid), build(rc(rt), mid + 1, r), pushup(rt);
    }
    
    inline void update(int id, int v, int rt = 1, int l = 1, int r = n) {
    	if (l == r) { t[rt] = (node) { v, v, v, v }; return; }
    	int mid = (l + r) >> 1;
    	if (id <= mid) update(id, v, lc(rt), l, mid);
    	else update(id, v, rc(rt), mid + 1, r);
    	pushup(rt);
    }
    
    inline node query(int ql, int qr, int rt = 1, int l = 1, int r = n) {
    	if (ql <= l && r <= qr) return t[rt];
    	int mid = (l + r) >> 1;
    	if (qr <= mid) return query(ql, qr, lc(rt), l, mid);
    	if (ql > mid) return query(ql, qr, rc(rt), mid + 1, r);
    	node ls = query(ql, mid, lc(rt), l, mid);
    	node rs = query(mid + 1, qr, rc(rt), mid + 1, r);
    	node res = { 0, 0, 0, 0 };
    	res.sum = ls.sum + rs.sum;
    	res.L = max(ls.L, ls.sum + rs.L);
    	res.R = max(rs.R, rs.sum + ls.R);
    	res.mx = max(ls.R + rs.L, max(ls.mx, rs.mx));
    	return res;
    }
    
    int main() {
    #ifndef ONLINE_JUDGE
    	freopen("in.in", "r", stdin);
    #endif
    	read(n);
    	for (rg int i = 1; i <= n; ++i) read(a[i]);
    	build();
    	read(q);
    	for (int f, x, y; q--; ) {
    		read(f), read(x), read(y);
    		if (!f) update(x, y);
    		else printf("%d
    ", query(x, y).mx);
    	}
    	return 0;
    }
    

    完结撒花 (qwq)

  • 相关阅读:
    kvm虚拟化
    kvm虚拟机管理
    认识佛教
    【书籍推荐】《自我观察:第四道入门手册》爱自己
    [推荐] 自我观察的四个基本原则
    只要你真会念,念到不起心、不动念、不分别、不执着,六根接触六尘境界就是修行
    胡小林老师最新答问(全两集)2017年3月9日发布
    蔡礼旭老师:如何经营幸福生活(武汉万人论坛)
    新视频】蔡礼旭老师:学圣贤教诲 改人生命运(2013年北京论坛)附下载
    【论坛先河,载入史册】陈大惠、钟茂森、胡小林、蔡礼旭、彭鑫老师同台答问(全三集)
  • 原文地址:https://www.cnblogs.com/zsbzsb/p/11746528.html
Copyright © 2011-2022 走看看