POJ 2750 Potted Flower(线段树+dp)
虽然是看的别的人思路,但是做出来还是挺高兴的。
首先求环上最大字段和,而且不能是含有全部元素。本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄。实际可以求出最小值,总和-最小,就可以求出,断开的情况了。
然后线段树要单点更新,这种标记,以前遇到过,不过一直没有写过,注意总和好更新,整个这一段的结果也很好更新,最难想的就是左边 和右边标记的结果,具体看pushup代码。
#include <cstring>
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
#define maxn 100100
struct node
{
int sum,lmax,lmin,rmin,rmax;
int smax,smin;
}p[*maxn];
void pushup(int rt)
{
p[rt].sum = p[rt<<].sum + p[rt<<|].sum;
p[rt].smax = max(max(p[rt<<].smax,p[rt<<|].smax),p[rt<<].rmax+p[rt<<|].lmax);
p[rt].lmax = max(p[rt<<].lmax,p[rt<<].sum+p[rt<<|].lmax);
p[rt].rmax = max(p[rt<<|].rmax,p[rt<<|].sum+p[rt<<].rmax);
p[rt].smin = min(min(p[rt<<].smin,p[rt<<|].smin),p[rt<<].rmin + p[rt<<|].lmin);
p[rt].lmin = min(p[rt<<].lmin,p[rt<<].sum+p[rt<<|].lmin);
p[rt].rmin = min(p[rt<<|].rmin,p[rt<<|].sum+p[rt<<].rmin);
}
void build(int l,int r,int rt)
{
int m;
if(l == r)
{
scanf("%d",&p[rt].sum);
p[rt].lmax = p[rt].sum;
p[rt].rmax = p[rt].sum;
p[rt].smax = p[rt].sum;
p[rt].lmin = p[rt].sum;
p[rt].rmin = p[rt].sum;
p[rt].smin = p[rt].sum;
return ;
}
m = (l+r)>>;
build(l,m,rt<<);
build(m+,r,rt<<|);
pushup(rt);
}
void update(int x,int sc,int l,int r,int rt)
{
int m;
if(l == x&&r == x)
{
p[rt].sum = sc;
p[rt].lmax = p[rt].sum;
p[rt].rmax = p[rt].sum;
p[rt].smax = p[rt].sum;
p[rt].lmin = p[rt].sum;
p[rt].rmin = p[rt].sum;
p[rt].smin = p[rt].sum;
return ;
}
m = (l+r)>>;
if(x <= m)
update(x,sc,l,m,rt<<);
if(x > m)
update(x,sc,m+,r,rt<<|);
pushup(rt);
}
int main()
{
int n,m,i,a,b;
while(scanf("%d",&n)!=EOF)
{
build(,n,);
scanf("%d",&m);
for(i = ;i <= m;i ++)
{
scanf("%d%d",&a,&b);
update(a,b,,n,);
if(p[].sum == p[].smax)//如果总和和最大值相同,断开一个最小值。
{
printf("%d\n",p[].sum - p[].smin);
}
else
{
printf("%d\n",max(p[].smax,p[].sum-p[].smin));
}
}
}
return ;
}
POJ 2750 Potted Flower(线段树+dp)的更多相关文章
- POJ.2750.Potted Flower(线段树 最大环状子段和)
题目链接 /* 13904K 532ms 最大 环状 子段和有两种情况,比如对于a1,a2,a3,a4,a5 一是两个端点都取,如a4,a5,a1,a2,那就是所有数的和减去不选的,即可以计算总和减最 ...
- POJ 2750 Potted Flower (线段树区间合并)
开始懵逼找不到解法,看了网上大牛们的题解才发现是区间合并... 给你n个数形成一个数列环,然后每次进行一个点的修改,并输出这个数列的最大区间和(注意是环,并且区间最大只有n-1个数) 其实只需要维护 ...
- Potted Flower(线段树+dp)
http://poj.org/problem?id=2750 题意:在一个圈中取若干个相邻的数,求他们的最大序列和.不能够同时取所有的数. 看了一篇解题报告写的很详细..http://blog.csd ...
- POJ 2750 Potted Flower
Potted Flower Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 3872 Accepted: 1446 Des ...
- POJ 2750 Potted Flower(线段树的区间合并)
点我看题目链接 题意 : 很多花盆组成的圆圈,每个花盆都有一个值,给你两个数a,b代表a位置原来的数换成b,然后让你从圈里找出连续的各花盆之和,要求最大的. 思路 :这个题比较那啥,差不多可以用DP的 ...
- (简单) POJ 2750 Potted Flower,环+线段树。
Description The little cat takes over the management of a new park. There is a large circular statue ...
- POJ.1769.Minimizing maximizer(线段树 DP)
题目链接 /* 题意:有m个区间,问最少要多少个区间能覆盖[1,n] 注:区间要按原区间的顺序,不能用排序贪心做 设dp[i]表示最右端端点为i时的最小值 dp[e[i]]=min{dp[s[i]]~ ...
- POJ 2750 Potted Flower (单点改动求线段树上最大子序列和)
题目大意: 在一个序列上每次改动一个值,然后求出它的最大的子序列和. 思路分析: 首先我们不考虑不成环的问题.那就是直接求每一个区间的最大值就好了. 可是此处成环,那么看一下以下例子. 5 1 -2 ...
- Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)
[题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...
随机推荐
- Leetcode 330.按要求补齐数组
按要求补齐数组 给定一个已排序的正整数数组 nums,和一个正整数 n .从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数 ...
- [uiautomator篇] 找父亲节点和其他兄弟节点
https://testerhome.com/topics/1250 Appium [已解决] UiSelector 如何根据节点定位到父节点 / 兄弟节点? liqing380 · 发布于 2014 ...
- Caffe的Solver参数设置
Caffe的solver参数设置 http://caffe.berkeleyvision.org/tutorial/solver.html solver是通过协调前向-反向传播的参数更新来控制参数优化 ...
- P1373 小a和uim之大逃离 (动态规划)
题目背景 小a和uim来到雨林中探险.突然一阵北风吹来,一片乌云从北部天边急涌过来,还伴着一道道闪电,一阵阵雷声.刹那间,狂风大作,乌云布满了天空,紧接着豆大的雨点从天空中打落下来,只见前方出现了一个 ...
- 【2018.10.18】noip模拟赛Day2 地球危机(2018年第九届蓝桥杯C/C++A组省赛 三体攻击)
题目描述 三体人将对地球发起攻击.为了抵御攻击,地球人派出了 $A × B × C$ 艘战舰,在太 空中排成一个 $A$ 层 $B$ 行 $C$ 列的立方体.其中,第 $i$ 层第 $j$ 行第 $k ...
- LightOJ1106 Gone Fishing
Gone Fishing John is going on a fishing trip. He has h hours available, and there are n lakes in the ...
- jmeter监控linux cpu 内存 网络 IO
下载地址:http://jmeter-plugins.org/downloads/all/ PerfMon: 用来监控Server的CPU.I/O.Memory等情况 ServerAgent-2.2. ...
- Linux 下 GCC 编译共享库控制导出函数的方法
通过一些实际项目的开发,发现这样一个现象,在 Windows 下可以通过指定 __declspec(dllexport) 定义来控制 DLL(动态链接库)中哪些函数可以导出,暴露给其他程序链接使用,哪 ...
- 社区发现(Community Detection)算法
作者: peghoty 出处: http://blog.csdn.net/peghoty/article/details/9286905 社区发现(Community Detection)算法用来发现 ...
- 洛谷P1061 Jam的计数法
题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字 ...