http://poj.org/problem?id=2750

题意:在一个圈中取若干个相邻的数,求他们的最大序列和。不能够同时取所有的数。

看了一篇解题报告写的很详细。。http://blog.csdn.net/non_cease/article/details/7437690

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <algorithm>
 4 #include <string.h>
 5 const int N=100010;
 6 using namespace std;
 7 struct node
 8 {
 9     int l,r,sum,minsum,maxsum;
10     int lmax,rmax,lmin,rmin;
11 } Tree[4*N];
12 int a[N];
13 void pushup(int rt)
14 {
15     int l = 2*rt;
16     int r = 2*rt+1;
17     Tree[rt].sum=Tree[l].sum+Tree[r].sum;
18     Tree[rt].minsum=min(min(Tree[l].minsum,Tree[r].minsum),Tree[l].rmin+Tree[r].lmin);
19     Tree[rt].maxsum=max(max(Tree[l].maxsum,Tree[r].maxsum),Tree[l].rmax+Tree[r].lmax);
20     Tree[rt].lmax=max(Tree[l].lmax,Tree[l].sum+Tree[r].lmax);
21     Tree[rt].rmax=max(Tree[r].rmax,Tree[r].sum+Tree[l].rmax);
22     Tree[rt].lmin=min(Tree[l].lmin,Tree[l].sum+Tree[r].lmin);
23     Tree[rt].rmin=min(Tree[r].rmin,Tree[r].sum+Tree[l].rmin);
24 }
25 void build(int l,int r,int rt)
26 {
27     Tree[rt].l = l;
28     Tree[rt].r = r;
29     if (l==r)
30     {
31         Tree[rt].sum=Tree[rt].minsum=Tree[rt].maxsum=a[r];
32         Tree[rt].lmax=Tree[rt].rmax=Tree[rt].lmin=Tree[rt].rmin=a[r];
33         return ;
34     }
35     int mid = (l+r)>>1;
36     build(l,mid,2*rt);
37     build(mid+1,r,2*rt+1);
38     pushup(rt);
39 }
40 void update(int pos,int val,int rt)
41 {
42     if (Tree[rt].l==Tree[rt].r)
43     {
44         Tree[rt].sum=Tree[rt].minsum=Tree[rt].maxsum=val;
45         Tree[rt].lmax=Tree[rt].rmax=Tree[rt].lmin=Tree[rt].rmin=val;
46         return ;
47     }
48     int mid=(Tree[rt].l+Tree[rt].r)>>1;
49     if (pos<=mid)
50         update(pos,val,2*rt);
51     else
52         update(pos,val,2*rt+1);
53     pushup(rt);
54 }
55 int main()
56 {
57     int n,m,pos,val;
58     scanf("%d",&n);
59     for (int i = 1; i <=n; i++)
60     {
61         scanf("%d",&a[i]);
62     }
63     build(1,n,1);
64     scanf("%d",&m);
65     while(m--)
66     {
67         scanf("%d%d",&pos,&val);
68         update(pos,val,1);
69         if(Tree[1].sum==Tree[1].maxsum)
70         {
71             printf("%d\n",Tree[1].sum-Tree[1].minsum);
72         }
73         else
74         {
75             printf("%d\n",max(Tree[1].maxsum,Tree[1].sum-Tree[1].minsum));
76         }
77     }
78     return 0;
79 }

View Code

转载于:https://www.cnblogs.com/lahblogs/p/3557062.html

Potted Flower(线段树+dp)相关推荐

  1. POJ2750 Potted Flower (线段树+动态规划)

    题目链接:传送门 题意:题目的意思是说在一个环形的盆中选取连续的子区间使得价值/吸引力最大,然后我们有一种操作即将花盆A的吸引力替换为B(单点修改),然后每次修改输出吸引力的最大价值 解题思路:把环从 ...

  2. P1295 [TJOI2011]书架(线段树dp)

    P1295 [TJOI2011]书架(线段树dp) 我好菜 先考虑普通dp: d p i = m i n ( d p j + m a x ( h j + 1 , h j + 2 - , h i ) ) ...

  3. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  4. CodeForces - 1557D Ezzat and Grid(线段树+dp)

    题目链接:点击查看 题目大意:给出 nnn 个 010101 串,现在问最少需要删掉多少个串,才能使得剩下的串拼起来是连通的 规定两个 010101 串是连通的,当且仅当存在至少一列,在两个串中都为 ...

  5. CodeForces - 487B Strip(线段树+dp+二分)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在要求分成尽可能少的子段,且每个子段需要满足: 最大值与最小值的差值小于等于 s 子段长度大于等于 l 题目分析:dp[ i ] 代表的是前 ...

  6. Educational Codeforces Round 81 (Rated for Div. 2) E. Permutation Separation 线段树 + dp

    传送门 文章目录 题意: 思路: 题意: 给你一个打乱的排列,每个位置都各有一个价值,让你选择一个分界点,分成p1,p2,...,prp_1,p_2,...,p_rp1​,p2​,...,pr​和pr ...

  7. Atcoder 077E - guruguru(线段树+dp)

    题目链接:http://arc077.contest.atcoder.jp/tasks/arc077_c 分析:如果某条线段包含x,显然应该先按一下到x,再从x走,反之必然是直接走过去,很容易想到用d ...

  8. POJ1769(线段树+DP)

    飞翔 题意 : 给定一个区间长度 n ,接下来给出 m 个子区间,要求最少选出多少个区间才能使得 1~n 这个区间被所选的所有子区间覆盖 分析: 首先是动态规划,dp[i]表示把最大值从1位置搞到第i ...

  9. Codeforces 1398 F. Controversial Rounds —— 线段树+dp

    This way 题意: 给你一个字符串,有些位置是已知的,有些是未知的,从位置1开始,如果有连续的0或者1大于等于k个,那么就算一轮游戏,然后0,1重新计数.问你当k=1~n的时候,游戏轮数最多是多 ...

最新文章

  1. UITableView数据的添加、删除、移动
  2. android防治方法被反射,通过去classLoader避免Android P反射限制后还原classLoader的方法...
  3. 某大学园区网规划(设想)
  4. 函数计算支持应用中心功能
  5. python输入两个正整数m和n用for循环求其最大公约数_输入两个正整数,m和n,求其最大公约数和最小公倍数。...
  6. django HttpResponse的用法
  7. python多线程框架_Python爬虫第七天:多线程爬虫|Scrapy框架
  8. c语言连续生成不同随机数_【转】关于C语言生成不重复的随机数
  9. java随机抽取数字_java 获取随机数字的三种方法
  10. Visio 安装后提示 Dos 共享冲突
  11. 使用fiddler+itunes来做到下载APP在AppStore中的历史版本 注意事项
  12. Ubuntu 下五笔拼音混合输入法
  13. 整理了上千个Python类库,简直太酷啦!
  14. JavaScrip 防止别人复制,剪切,查看源代码,页面另存为的操作
  15. 农业虫害识别相关论文——调研整理
  16. 学习淘淘商城第三十四课(在业务逻辑中添加缓存)
  17. 贝加莱PLC使用的几个注意点
  18. 《超新星纪元》读后感
  19. iframe与主框架跨域相互访问方法
  20. iBase4J nginx配置

热门文章

  1. Linux中vectormath无法通过pip安装的解决办法
  2. 计算机科学之美,计算机科学的美学探讨
  3. 10许可证即将到期_食品经营许可证延续
  4. ubuntu 安装搜狗输入法_超详细的ubuntu14.04安装搜狗输入法教程
  5. 聚类分析:1.相似性测度
  6. 数据统计作业0429_因子分析/FA
  7. SAP License:SAP项目上线的时间选择
  8. 特征做得好,模型没烦恼
  9. 项目管理系统、工作台、经营看板、质量管理、合同管理、合同审核、新建合同、分包商管理、立项审批、创建项目、项目模板、项目统计、计划管理、结项申请、审批流程、审批记录、审批状态、参数设置、axure原型
  10. SAS基础练习(一)