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 ...
最新文章
- JS --正则表达式验证、实战之邮箱模式
- 技术扫盲:关于低代码编程的可持续性交付设计和分析
- vue中使用Base64编码和解码
- 8786:方格取数 (多线程dp)
- Window_Open详解
- Visual Studio 2010授权修改
- python赋值语句的作用_Python之语句与函数
- linux mmap实例_Linux下通过共享内存和mmap实现进程间通讯(含实例)
- 将现有企业级模板项目从 Visual Studio .NET 2003 迁移到 Visual Studio 2005
- 抖音APP终极瘦身方案
- js实现23种设计模式
- CCNA之EIGRP(IGRP)
- 从网上骂人言论看其浮躁无知的一面
- React Native Camera的新手教程
- 搭建一个颜值超高的发卡网站
- 最大公因数及其求解算法(GCD)
- HttpClient实战爬虫B站番剧
- C语言程序设计2009版张磊,C语言程序设计(第2版普通高等教育十一五国家级规划教材)...
- struts2.1.6的bug之空指针(与tomcat安装)
- 重庆邮电大学计算机硕士录取,2018年重庆邮电大学硕士研究生复试录取工作方案_计算机考研复试...
热门文章
- revit二次开发概念_BIM百科 | Revit二次开发入门--创建一个简单的程序
- signature=12e3283d637b587235bcb4cbbfa1a5b3,A pathogen-inducible endogenous siRNA in plant immunity
- 余弦函数导数推导过程_对三角函数深入理解以及换元法的应用
- excel日期格式改不了_画进度计划横道图,Excel就够了
- java吃豆人代码讲解_在吃豆人的这一关里,隐藏着来自程序员的深深恶意
- tp5.0 php版本,ThinkPHP v5.0.2官方下载-ThinkPHP v5.0.2 完整版官方最新版-东坡下载
- 中如何构造有参和无惨_混凝土二次构造柱输送泵可提升施工效率
- css3转换图形展示,CSS3的常见transformation图形变化用法小结
- mysql跨服务器链表_MySQL 源码链表的实现
- 电脑应用程序错误怎么办_电脑Windows出错信息解析及解决方案