pku2750 Potted Flower
问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子段的和。
分析:涉及到线段树的以下操作:维护区间左边开始的连续最大子段和,从右边开始的连续最大子段和,区间的最大子段和
using namespace std;
#define MAXN 100005
#define Min(a,b) (a<b?a:b)
#define Max(a,b) (a>b?a:b)
int n,m;
struct Node{
int l,r,mx,lmx,rmx,mn,lmn,rmn,sum,mnnum;
bool allpos;
}nod[3*MAXN];
void buildtree(int u,int l,int r){
nod[u].l=l;
nod[u].r=r;
nod[u].lmx=INT_MIN;
nod[u].rmx=INT_MIN;
nod[u].mx=INT_MIN;
nod[u].lmn=INT_MAX;
nod[u].rmn=INT_MAX;
nod[u].mn=INT_MAX;
nod[u].sum=0;
nod[u].mnnum=INT_MAX;
nod[u].allpos=true;
if(r==l)
return;
buildtree(2*u,l,(l+r)/2);
buildtree(2*u+1,(l+r)/2+1,r);
}
void insert(int u,int l,int r,int val){
if(nod[u].l==l && nod[u].r==r){
nod[u].mx=val;
nod[u].lmx=val;
nod[u].rmx=val;
nod[u].mn=val;
nod[u].lmn=val;
nod[u].rmn=val;
nod[u].sum=val;
nod[u].mnnum=val;
if(val>=0)
nod[u].allpos=true;
else
nod[u].allpos=false;
return;
}
if(l<=nod[2*u].r)
insert(2*u,l,r,val);
if(r>=nod[2*u+1].l)
insert(2*u+1,l,r,val);
nod[u].allpos=nod[2*u].allpos && nod[2*u+1].allpos;
nod[u].sum=nod[2*u].sum+nod[2*u+1].sum;
nod[u].lmx=Max(nod[2*u].lmx,nod[2*u].sum+nod[2*u+1].lmx);
nod[u].rmx=Max(nod[2*u+1].rmx,nod[2*u+1].sum+nod[2*u].rmx);
//nod[u].mx=Max(nod[2*u].rmx+nod[2*u+1].lmx,nod[2*u].mx,nod[2*u+1].mx);
nod[u].mx=nod[2*u].rmx+nod[2*u+1].lmx;
nod[u].mx=Max(nod[u].mx,nod[2*u].mx);
nod[u].mx=Max(nod[u].mx,nod[2*u+1].mx);
nod[u].lmn=Min(nod[2*u].lmn,nod[2*u].sum+nod[2*u+1].lmn);
nod[u].rmn=Min(nod[2*u+1].rmn,nod[2*u+1].sum+nod[2*u].rmn);
//nod[u].mn=Min(nod[2*u].rmn+nod[2*u+1].lmn,nod[2*u].mn,nod[2*u+1].mn);
nod[u].mn=nod[2*u].rmn+nod[2*u+1].lmn;
nod[u].mn=Min(nod[u].mn,nod[2*u].mn);
nod[u].mn=Min(nod[u].mn,nod[2*u+1].mn);
nod[u].mnnum=Min(nod[2*u].mnnum,nod[2*u+1].mnnum);
//环内最小的数,当环内元素全部为非负时用到
}
int main(){
int i,pos,a,mn;
while(scanf("%d",&n)!=EOF){
buildtree(1,1,n);
mn=INT_MAX;
for(i=1;i<=n;i++){
scanf("%d",&a);
if(a<mn)
mn=a;
insert(1,i,i,a);
}
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d%d",&pos,&a);
if(a<mn)
mn=a;
insert(1,pos,pos,a);
if(nod[1].allpos)//当环内元素全为非负时
printf("%d\n",nod[1].sum-nod[1].mnnum);
//解为环和去掉最小的一个元素
else
printf("%d\n",Max(nod[1].sum-nod[1].mn,nod[1].mx));
//解为环和减去最小子列和最大子列两者中的较大值
}
}
return 0;
}
转载于:https://www.cnblogs.com/zgmf_x20a/archive/2008/11/12/1332275.html
pku2750 Potted Flower相关推荐
- Potted Flower(线段树+dp)
http://poj.org/problem?id=2750 题意:在一个圈中取若干个相邻的数,求他们的最大序列和.不能够同时取所有的数. 看了一篇解题报告写的很详细..http://blog.csd ...
- POJ2750 Potted Flower (线段树+动态规划)
题目链接:传送门 题意:题目的意思是说在一个环形的盆中选取连续的子区间使得价值/吸引力最大,然后我们有一种操作即将花盆A的吸引力替换为B(单点修改),然后每次修改输出吸引力的最大价值 解题思路:把环从 ...
- poj2750 PottedFlower(线段树的环状操作)
题目:Potted Flower 大意:该你一个换环,求环上的最大连续的和(如果最大和包含所有数,要求减去最小的一个). 思路:这道题的思路并不难,需要在线段树里维护区间的最大和,最小和(应为是环状的 ...
- ICPC程序设计题解书籍系列之九:罗勇军《算法竞赛入门到进阶》
罗书<算法竞赛入门到进阶>题目一览 第1章 算法竞赛概述 HDU1000 HDU1089-HDU1096 A+B for Input-Output Practice (I)-(VIII)( ...
- MYSQL圆角矩形表示_android 利用Bitmap获取圆角矩形、圆形图片
1.在很多时候,我们要显示图片资源,需要将他的资源显示为圆角的:示例源码如下: public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,fl ...
- HDU - 6486 Flower(思维)
HDU - 6486 Flower 题目大意:有n堆草每次只能对n-1堆操作每次只能减1问最少操作几次能把这些草剪到相同高度如果不能输出-1 我们让n-1个数减1实际上可以看成使得剩下的那一个数加1. ...
- flower.php,flowerlist.php
require_once('nav.php'); ?> $sql = 'select * from flower'; $result = fetch_array($sql); ?> 鲜花列 ...
- BabyXor flower逆向寒假生涯(19/100)
BabyXor 拖进ida后查看 判断长度是否等于0x17,不等于直接退出.长度等于0x17后再近一步判断. 首先经过一个MD5加密, 然后在经过一个enc函数变换, 进入enc看看 简单变化,找出数 ...
- Celery + Flower + FastAPI + RabbitMQ ,Python实现异步消息队列和监控
@Author:Runsen 消息队列 消息队列让应用程序在用户请求之外异步执行称为任务的工作.如果应用程序需要在后台执行工作,它会将任务添加到任务队列中.这些任务稍后由工作服务执行. Celery ...
最新文章
- 莫德友_去哪儿酒店交易系统架构实践
- laravel 5.8 guzzle get 参数_Laravel速查表 Cache Cookie Request
- Python怎么安装第三方库-numpy-libnum等; (详细版)
- Android界面编程--使用活动条(ActionBar)--通过ActionBar菜单改变TextView的字体和颜色...
- 文档视图结构下多视图间的控制
- liunx java font_Linux下JDK中文字体乱码 | 学步园
- (Docker实战) 第4篇:Centos7 拉取和部署Redis
- python实例 91,92,93,94
- C ++入门系列博客一 最初的起点 — Hello World
- 六石管理学:谈管理的前提,要有一点的胸量
- atitit.javascript js 上传文件的本地预览
- XXXfragment that is not a fragment错误,fragment认不出来
- csdn 登录经常卡住无法登录
- linux创建文件夹操作步骤,linux如何用命令创建新建文件夹
- Concurrency in C# Cookbook中文翻译 :c#的并发烹饪书
- Java实现局域网流量监控
- 终于找到了!AI学习路线图——从零基础到就业
- 世界七大数学难题——千年大奖问题(转载)
- 受了点小伤,心情怎么就变坏了呢?
- 笑cry!在镜子面前,沉稳暖心的金毛同学也会瞬间化身逗比!
热门文章
- python没有错误但是不显示结果_python运行不报错又无任何结果输出
- 降采样_嫦娥五号探测器圆满完成我国首次月球采样返回任务
- uniapp 开发h5 优化加载速度
- linux查看native进程,Android 分析应用程序占用native内存
- mysql recordcount 1_[转载]ADO记录集GetRecordCount()返回记录条数为啥总为-1
- 2019安装软件安装管家_【软件安装管家】Br 2019软件安装包+安装教程
- android返回页面代码实现,Intent携带信息返回上一个界面实现基本信息的设置
- android 字体加粗有阴影,Android TextView高级显示技巧实例小结
- linux qt usb转串口通信,centos7 Qt USB转串口通信
- 不会部署并调试SpringBoot源码?一看必会IDEA操作