Potted Flower(线段树+dp)
http://poj.org/problem?id=2750
题意:在一个圈中取若干个相邻的数,求他们的最大序列和。不能够同时取所有的数。
看了一篇解题报告写的很详细。。http://blog.csdn.net/non_cease/article/details/7437690
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
const int N=;
using namespace std;
struct node
{
int l,r,sum,minsum,maxsum;
int lmax,rmax,lmin,rmin;
} Tree[*N];
int a[N];
void pushup(int rt)
{
int l = *rt;
int r = *rt+;
Tree[rt].sum=Tree[l].sum+Tree[r].sum;
Tree[rt].minsum=min(min(Tree[l].minsum,Tree[r].minsum),Tree[l].rmin+Tree[r].lmin);
Tree[rt].maxsum=max(max(Tree[l].maxsum,Tree[r].maxsum),Tree[l].rmax+Tree[r].lmax);
Tree[rt].lmax=max(Tree[l].lmax,Tree[l].sum+Tree[r].lmax);
Tree[rt].rmax=max(Tree[r].rmax,Tree[r].sum+Tree[l].rmax);
Tree[rt].lmin=min(Tree[l].lmin,Tree[l].sum+Tree[r].lmin);
Tree[rt].rmin=min(Tree[r].rmin,Tree[r].sum+Tree[l].rmin);
}
void build(int l,int r,int rt)
{
Tree[rt].l = l;
Tree[rt].r = r;
if (l==r)
{
Tree[rt].sum=Tree[rt].minsum=Tree[rt].maxsum=a[r];
Tree[rt].lmax=Tree[rt].rmax=Tree[rt].lmin=Tree[rt].rmin=a[r];
return ;
}
int mid = (l+r)>>;
build(l,mid,*rt);
build(mid+,r,*rt+);
pushup(rt);
}
void update(int pos,int val,int rt)
{
if (Tree[rt].l==Tree[rt].r)
{
Tree[rt].sum=Tree[rt].minsum=Tree[rt].maxsum=val;
Tree[rt].lmax=Tree[rt].rmax=Tree[rt].lmin=Tree[rt].rmin=val;
return ;
}
int mid=(Tree[rt].l+Tree[rt].r)>>;
if (pos<=mid)
update(pos,val,*rt);
else
update(pos,val,*rt+);
pushup(rt);
}
int main()
{
int n,m,pos,val;
scanf("%d",&n);
for (int i = ; i <=n; i++)
{
scanf("%d",&a[i]);
}
build(,n,);
scanf("%d",&m);
while(m--)
{
scanf("%d%d",&pos,&val);
update(pos,val,);
if(Tree[].sum==Tree[].maxsum)
{
printf("%d\n",Tree[].sum-Tree[].minsum);
}
else
{
printf("%d\n",max(Tree[].maxsum,Tree[].sum-Tree[].minsum));
}
}
return ;
}
Potted Flower(线段树+dp)的更多相关文章
- POJ 2750 Potted Flower(线段树+dp)
题目链接 虽然是看的别的人思路,但是做出来还是挺高兴的. 首先求环上最大字段和,而且不能是含有全部元素.本来我的想法是n个元素变为2*n个元素那样做的,这样并不好弄.实际可以求出最小值,总和-最小,就 ...
- POJ 2750 Potted Flower (线段树区间合并)
开始懵逼找不到解法,看了网上大牛们的题解才发现是区间合并... 给你n个数形成一个数列环,然后每次进行一个点的修改,并输出这个数列的最大区间和(注意是环,并且区间最大只有n-1个数) 其实只需要维护 ...
- POJ.2750.Potted Flower(线段树 最大环状子段和)
题目链接 /* 13904K 532ms 最大 环状 子段和有两种情况,比如对于a1,a2,a3,a4,a5 一是两个端点都取,如a4,a5,a1,a2,那就是所有数的和减去不选的,即可以计算总和减最 ...
- Tsinsen A1219. 采矿(陈许旻) (树链剖分,线段树 + DP)
[题目链接] http://www.tsinsen.com/A1219 [题意] 给定一棵树,a[u][i]代表u结点分配i人的收益,可以随时改变a[u],查询(u,v)代表在u子树的所有节点,在u- ...
- HDU 3016 Man Down (线段树+dp)
HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Ja ...
- poj2750 线段树 +DP Potted Flower
问题描述:给定一个环形序列,进行在线操作,每次修改一个元素,输出环上的最大连续子列的和,但不能是完全序列. 算法:把环从一个地方,切断拉成一条直线,用线段树记录当前区间的非空最大子列和当前区间的非空最 ...
- lightoj1085 线段树+dp
//Accepted 7552 KB 844 ms //dp[i]=sum(dp[j])+1 j<i && a[j]<a[i] //可以用线段树求所用小于a[i]的dp[j ...
- [CF 474E] Pillars (线段树+dp)
题目链接:http://codeforces.com/contest/474/problem/F 意思是给你两个数n和d,下面给你n座山的高度. 一个人任意选择一座山作为起始点,向右跳,但是只能跳到高 ...
- HDU-3872 Dragon Ball 线段树+DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3872 题意:有n个龙珠按顺序放在一列,每个龙珠有一个type和一个权值,要求你把这n个龙珠分成k个段, ...
随机推荐
- case when里的like功能 ////// 截取(substr)
case when里的like功能 假如要用到case when又要用到like这样的功能,即如果字符串包含‘语文’就怎么怎么样,包含‘数学’就怎么怎么样,包含‘英语’就怎么怎么样,like是用于wh ...
- STL中栈stack的用法
头文件: #include <stack> 建立一个栈stack < 类型 > s //例如 stack<int> s 加入一个新的元素s.push( a ) 询问 ...
- svn汉化包安装无效的解决办法
下载svn汉化包要和对应的svn客户端版本对应,否则安装无效, 在安装前要想将svn安装目录下的languages目录下的文件全部删除 还有一点要注意的是 汉化包安装要放在svn安装目录下进行安装,它 ...
- python3 的 zip
准备放弃生命中这4个小时,然后翻开了python,人生苦短,音乐和python才味甘 1. zip 可以看到zip两个列表,返回一个元组的列表,但是它是个可迭代的对象,得用list才能调用显示: 2 ...
- dp专题备忘录
hdu 1024:基础dp题 hdu 1029:主元素问题,很快的解法,计数器 hdu 1069:LIS hdu 1074:数位dp,数位dp基础 hdu 1257:简单LIS,要仔细分析为什么是求最 ...
- WeChat-小程序-tabbar
WeChat-小程序-tabbar https://developers.weixin.qq.com/miniprogram/dev/framework/config.html#%E5%85%A8%E ...
- Maven_在Eclipse中执行Maven命令
- 【10】AngularJS SQL
AngularJS SQL 使用 PHP 从 MySQL 中获取数据 <div ng-app="myApp" ng-controller="customersCtr ...
- 字符串hash-BKDRHash
unsigned int BKDRHash(char *str) { unsigned ; // 31 131 1313 13131 131313 etc.. unsigned ; while (*s ...
- 采药 2005年NOIP全国联赛普及组&疯狂的采药
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师.为此,他想拜附近最有威望 ...