博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj2750 PottedFlower(线段树的环状操作)
阅读量:6720 次
发布时间:2019-06-25

本文共 1866 字,大约阅读时间需要 6 分钟。

题目:

大意:该你一个换环,求环上的最大连续的和(如果最大和包含所有数,要求减去最小的一个)。
思路:这道题的思路并不难,需要在线段树里维护区间的最大和,最小和(应为是环状的,所以答案有可能是总和减去最小和),然后需要用一个区间左边的最大最小,右边的最大最小来维护区间的最大和最小和。这道题的解法就是这样。

代码奉上

#include
#include
using namespace std;#define M(i) ((t[(i)].l + t[i].r) >> 1)const int MAXN = 1e5 + 5;const int INF = 1e9;struct node{ int l,r,lmx,rmx,lmn,rmn,sum,mx,mn;}t[MAXN << 2];int n, p[MAXN], m;void build(int i, int l, int r){ t[i].l = l; t[i].r = r; t[i].lmx = t[i].rmx = t[i].mx = -INF; t[i].lmn = t[i].rmn = t[i].mn = INF; if(l == r) {p[l] = i; return;} build(i<<1, l, M(i)); build(i<<1|1, M(i)+1, r);}int max(int a,int b,int c){ return max(a,max(b,c));}int min(int a,int b,int c){ return min(a,min(b,c));}void upd(int pos, int v){ int i = p[pos]; t[i].lmx = t[i].rmx = t[i].sum = t[i].lmn = t[i].rmn = t[i].mx = t[i].mn = v; i >>= 1; while(i) { t[i].lmx = max(t[i<<1].lmx, t[i<<1].sum + t[i<<1|1].lmx); t[i].lmn = min(t[i<<1].lmn, t[i<<1].sum + t[i<<1|1].lmn); t[i].rmx = max(t[i<<1|1].rmx, t[i<<1|1].sum + t[i<<1].rmx); t[i].rmn = min(t[i<<1|1].rmn, t[i<<1|1].sum + t[i<<1].rmn); t[i].sum = t[i<<1].sum + t[i<<1|1].sum; t[i].mx = max(t[i<<1].mx,t[i<<1].rmx+t[i<<1|1].lmx,t[i<<1|1].mx); t[i].mn = min(t[i<<1].mn,t[i<<1].rmn+t[i<<1|1].lmn,t[i<<1|1].mn); i >>= 1; }}int main(){ int t1, t2; scanf("%d", &n); build(1, 1, n); for(int i = 1; i <= n; i++) { scanf("%d", &t1); upd(i, t1); } scanf("%d", &m); for(int i = 1; i <= m; i++) { scanf("%d%d", &t1, &t2); upd(t1, t2); if(t[1].mx == t[1].sum && t[1].sum > 0) printf("%d\n",t[1].sum - t[1].mn); else printf("%d\n",max(t[1].mx,t[1].sum - t[1].mn)); } return 0;}

转载于:https://www.cnblogs.com/geng4512/p/5296950.html

你可能感兴趣的文章
B和strong以及i和em的区别(转)
查看>>
CSS text-transform 属性——转换文本的大小写格式
查看>>
第一阶段检查结果
查看>>
ACM-ICPC (10/11)
查看>>
24.层模型--相对定位
查看>>
css 基础知识
查看>>
LeetCode 387. First Unique Character in a String
查看>>
非常好的博客!!!linux内存管理概述【转】
查看>>
ibevent 和 libev 提高网络应用性能【转】
查看>>
linux 串口0x03,0x13的问题【转】
查看>>
TypedValue.applyDimension的使用
查看>>
LeetCode OJ:Add and Search Word - Data structure design(增加以及搜索单词)
查看>>
关于js类中闭包调用this问题
查看>>
Storm程序的并发机制(重点掌握)
查看>>
Eclipse 改变字体大小,设置背景色
查看>>
c# 窗体滑动显示
查看>>
讲解ping中的TTL是什么意思
查看>>
Data manipulation in python (module 5)
查看>>
UWP 禁止Pivot swip 手势
查看>>
赋予管理员操作系统文件的权限
查看>>