poj-2750 Potted Flower

题意:

给出一个n个结点的环,在这个环上取一段区间(不能是整个环),使权值和最大;

m次修改某个结点权值,每次修改后输出最大值;

n,m<=100000;

题解:

这道题的难点主要在于给出的是一个环而不是序列;

所以选择一个点把环拆成序列,那么就可以把问题转化成:

在一个序列中,取一段子序列,或两边都取两段序列,是权值最大;

这个答案就是在这个序列里取区间的max(最大值ma,序列和sum-最小值mi);

这些都可以用线段树维护;

但是,这道题不允许取整段序列,所以直接这么搞是不行的;

考虑什么时候会取整段序列呢,那也就是没有负数的时候(有负数就直接不取它就有了更优解);

没有负数也就意味着sum==ma,于是特判就可以了;

代码:

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 110000
#define lson l,mid,no<<1
#define rson mid+1,r,no<<1|1
using namespace std;
int sum[N<<2],ma[N<<2],mi[N<<2],miL[N<<2],miR[N<<2],maL[N<<2],maR[N<<2];
void Pushup(int no)
{
	sum[no]=sum[no<<1]+sum[no<<1|1];
	maL[no]=max(maL[no<<1],sum[no<<1]+maL[no<<1|1]);
	miL[no]=min(miL[no<<1],sum[no<<1]+miL[no<<1|1]);
	maR[no]=max(maR[no<<1|1],sum[no<<1|1]+maR[no<<1]);
	miR[no]=min(miR[no<<1|1],sum[no<<1|1]+miR[no<<1]);
	ma[no]=max(max(ma[no<<1],ma[no<<1|1]),maR[no<<1]+maL[no<<1|1]);
	mi[no]=min(min(mi[no<<1],mi[no<<1|1]),miR[no<<1]+miL[no<<1|1]);
}
void build(int l,int r,int no)
{
	if(l==r)
	{
		scanf("%d",&sum[no]);
		ma[no]=mi[no]=miL[no]=miR[no]=maL[no]=maR[no]=sum[no];
	}
	else
	{
		int mid=(l+r)>>1;
		build(lson);
		build(rson);
		Pushup(no);
	}
}
void update(int l,int r,int no,int k,int val)
{
	if(l==r)
	{
		sum[no]=ma[no]=mi[no]=miL[no]=miR[no]=maL[no]=maR[no]=val;
	}
	else
	{
		int mid=(l+r)>>1;
		if(k<=mid)	update(lson,k,val);
		else		update(rson,k,val);
		Pushup(no);
	}
}
int main()
{
	int n,m,i,j,k,x,y,l,r,ans;
	scanf("%d",&n);
	build(1,n,1);
	scanf("%d",&m);
	for(i=1;i<=m;i++)
	{
		scanf("%d%d",&x,&y);
		update(1,n,1,x,y);
		if(sum[1]==ma[1])
			printf("%d\n",sum[1]-mi[1]);
		else
			printf("%d\n",max(ma[1],sum[1]-mi[1]));
	}
	return 0;
}
时间: 2024-10-25 22:00:11

poj-2750 Potted Flower的相关文章

POJ 2750 Potted Flower (单点修改求线段树上最大子序列和)

题目大意: 在一个序列上每次修改一个值,然后求出它的最大的子序列和. 思路分析: 首先我们不考虑不成环的问题.那就是直接求每个区间的最大值就好了. 但是此处成环,那么看一下下面样例. 5 1 -2 -3 4 5 那么你会发现 max = sum - min 也就是和减去最小区间和也可以得到. 所以我们最后要得到的就是两个东西.注意题目中说的不能全部取得.所以还要判断一下max 是不是等于 sum的. #include <cstdio> #include <iostream> #in

poj 2750 Potted Flower(线段树区间合并)

http://poj.org/problem?id=2750 有n个数围成一个圈,每次可以将a位置上的数变为b,对每个操作,输出区间的最大连续子段和,连续的子段长度不能超过n. 区间合并问题,因为是求连续子段的和.先把圈从1和n之间断开,变为一条链,先在链上求最长连续的和.这个最长连续的和取左节点最长连续和,右节点最长连续和,左节点从右边数最大连续和加上右节点从左边数最大连续和三者的最大值. 特殊情况就是当区间全为正的时候,最长连续和等于1-n的和,这违背题意,它应该等于区间总和减去区间内最小连

POJ 2750 Potted Flower (单点改动求线段树上最大子序列和)

题目大意: 在一个序列上每次改动一个值,然后求出它的最大的子序列和. 思路分析: 首先我们不考虑不成环的问题.那就是直接求每一个区间的最大值就好了. 可是此处成环,那么看一下以下例子. 5 1 -2 -3 4 5 那么你会发现 max = sum - min 也就是和减去最小区间和也能够得到. 所以我们最后要得到的就是两个东西.注意题目中说的不能所有取得.所以还要推断一下max 是不是等于 sum的. #include <cstdio> #include <iostream> #i

POJ 题目2750 Potted Flower(线段树求环型区间中连续区间的最大和)

Potted Flower Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4470   Accepted: 1698 Description The little cat takes over the management of a new park. There is a large circular statue in the center of the park, surrounded by N pots of f

【POJ 2750】 Potted Flower(线段树套dp)

[POJ 2750] Potted Flower(线段树套dp) Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4566   Accepted: 1739 Description The little cat takes over the management of a new park. There is a large circular statue in the center of the park, surrou

poj 2750(线段树的动态规划)

Potted Flower Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4186   Accepted: 1581 Description The little cat takes over the management of a new park. There is a large circular statue in the center of the park, surrounded by N pots of f

Pku2750 Potted Flower

Description The little cat takes over the management of a new park. There is a large circular statue in the center of the park, surrounded by N pots of flowers. Each potted flower will be assigned to an integer number (possibly negative) denoting how

POJ 2570 线段树

Potted Flower Time Limit: 2000 MS Memory Limit: 65536 KB 64-bit integer IO format: %I64d , %I64u Java class name: Main [Submit] [Status] [Discuss] Description The little cat takes over the management of a new park. There is a large circular statue in

POJ题目分类推荐 (很好很有层次感)

著名题单,最初来源不详.直接来源:http://blog.csdn.net/a1dark/article/details/11714009 OJ上的一些水题(可用来练手和增加自信) (POJ 3299,POJ 2159,POJ 2739,POJ 1083,POJ 2262,POJ 1503,POJ 3006,POJ 2255,POJ 3094) 初期: 一.基本算法: 枚举. (POJ 1753,POJ 2965) 贪心(POJ 1328,POJ 2109,POJ 2586) 递归和分治法. 递