spoj 1557 GSS3 - Can you answer these queries III 线段树
2015-12-06 20:38
459 查看
题目链接
给出n个数, 2种操作, 一种是将第x个数改为y, 第二种是询问区间[x,y]内的最大连续子区间。
开4个数组, 一个是区间和, 一个是区间最大值, 一个是后缀的最大值, 一个是前缀的最大值。 合并起来好麻烦......
给出n个数, 2种操作, 一种是将第x个数改为y, 第二种是询问区间[x,y]内的最大连续子区间。
开4个数组, 一个是区间和, 一个是区间最大值, 一个是后缀的最大值, 一个是前缀的最大值。 合并起来好麻烦......
#include <iostream> #include <vector> #include <cstdio> #include <cstring> #include <algorithm> #include <map> #include <set> #include <string> #include <queue> using namespace std; #define pb(x) push_back(x) #define ll long long #define mk(x, y) make_pair(x, y) #define lson l, m, rt<<1 #define mem(a) memset(a, 0, sizeof(a)) #define rson m+1, r, rt<<1|1 #define mem1(a) memset(a, -1, sizeof(a)) #define mem2(a) memset(a, 0x3f, sizeof(a)) #define rep(i, a, n) for(int i = a; i<n; i++) #define ull unsigned long long typedef pair<int, int> pll; const double eps = 1e-8; const int mod = 1e9+7; const int inf = 1061109567; const int maxn = 5e4+5; int sum[maxn<<2], suf_max[maxn<<2], pre_max[maxn<<2], maxx[maxn<<2]; void pushUp(int rt) { sum[rt] = sum[rt<<1] + sum[rt<<1|1]; suf_max[rt] = max(suf_max[rt<<1|1], suf_max[rt<<1]+sum[rt<<1|1]); pre_max[rt] = max(pre_max[rt<<1], pre_max[rt<<1|1]+sum[rt<<1]); maxx[rt] = max(maxx[rt<<1], maxx[rt<<1|1]); maxx[rt] = max(maxx[rt], suf_max[rt<<1]+pre_max[rt<<1|1]); } void build(int l, int r, int rt) { if(l == r) { scanf("%d", &maxx[rt]); sum[rt] = pre_max[rt] = suf_max[rt] = maxx[rt]; return ; } int m = l+r>>1; build(lson); build(rson); pushUp(rt); } void update(int p, int val, int l, int r, int rt) { if(l == r) { sum[rt] = pre_max[rt] = suf_max[rt] = maxx[rt] = val; return ; } int m = l+r>>1; if(p<=m) update(p, val, lson); else update(p, val, rson); pushUp(rt); } int query_sum(int L, int R, int l, int r, int rt) { if(L<=l&&R>=r) { return sum[rt]; } int m = l+r>>1, ret = 0; if(L<=m) ret += query_sum(L, R, lson); if(R>m) ret += query_sum(L, R, rson); return ret; } int query_suf(int L, int R, int l, int r, int rt) { if(L<=l&&R>=r) { return suf_max[rt]; } int m = l+r>>1; if(R<=m) return query_suf(L, R, lson); if(L>m) return query_suf(L, R, rson); return max(query_suf(L, m, lson)+query_sum(m+1, R, rson), query_suf(m+1, R, rson)); } int query_pre(int L, int R, int l, int r, int rt) { if(L<=l&&R>=r) { return pre_max[rt]; } int m = l+r>>1; if(R<=m) return query_pre(L, R, lson); if(L>m) return query_pre(L, R, rson); return max(query_pre(L, m, lson), query_pre(m+1, R, rson)+query_sum(L, m, lson)); } int query(int L, int R, int l, int r, int rt) { if(L<=l&&R>=r) { return maxx[rt]; } int m = l+r>>1; if(R<=m) return query(L, R, lson); if(L>m) return query(L, R, rson); return max(max(query(L, m, lson), query(m+1, R, rson)), query_pre(m+1, R, rson)+query_suf(L, m, lson)); } int main() { int n, q, x, y, sign; scanf("%d", &n); build(1, n, 1); scanf("%d", &q); while(q--) { scanf("%d%d%d", &sign, &x, &y); if(sign) printf("%d\n", query(x, y, 1, n, 1)); else update(x, y, 1, n, 1); } return 0; }
相关文章推荐
- 布局别名 屏幕方向限定符
- Gradle buildType作用详解
- iOS系列UI篇——UIButton
- 通过在BasicController使用ModelAttribute标签注入Request/Response/Session
- weight的使用
- oVirt guest | VM & HOST HA in one Cluster
- iOS动画和特效(二)UIKit力学行为
- ROS系列 Arduino IDE设置
- CSS3伪类:valid、invalid、required
- WS-I: (BP2120) A binding has operations that are not unique.
- leetcode@ [72/115] Edit Distance & Distinct Subsequences (Dynamic Programming)
- hdu 1242Rescue(DFS)
- iOS获取设备UUID
- UGUI中image不能使用旧版Animation
- 【iOS】UITbableView中cell的单选状态和多选状态
- vuejs学习资料
- 数据注解属性--Required
- zoj 3792 Romantic Value
- UICollectionView简单介绍
- iOS系列UI篇——自定义UIButton