pot
Description

这个假期,小h在自家院子里种了许多花,它们围成了一个圈,从1…n编号(n<=100000),小h 对每盆花都有一个喜好值xi,(-1000<=xi<=1000),小h现在觉得这样一成不变很枯燥,于是他做了m(m<=100000)个改动,每次把第ki盘花改成喜好值为di的花,然后小h要你告诉他,在这个花圈中,连续的最大喜好值是多少。

Input

第一行,n,花盆的数量
第二行,n个数,表示对于每盆花的喜好值。
第三行:m, 改动的次数
以下m行,每行两个数ki 和di 。

Output

M行,每一行对应一个更改,表示连续的最大喜好值,且不能整圈都选。(注意:是在圈上找)

Sample Input

5

3 -2 1 2 -5

4

2 -2

5 -5

2 -4

5 -1

Sample Output

4

4

3

5

题解:
对于20分,当然是用一个暴力过去啦~~~
对于30分,用O(nm)的动态规划,再加上卡常数就好了。
对于100分,此题满分做法涉及到线段树,不懂的可以去了解一下。
本题题意是数形成一个环状,又说了不可以全部数选择。那么,我们只需要求出1到n内最大的子区间和;从两边开始选的最大子区间和;1到n内最小的子区间和;从两边开始选的最小子区间和。因为我们要求出这样的东东:




那么,最优答案就是sum(表示数环的总和)-min或max。这时,我们用线段树来做这些操作,然后大体细节就好好看题,笔玩一下就可以推出线段树维护的规律。
来给个伪程序来维护max和min的操作:

{v为当前树的深度}
tree[v].sum:=tree[v*2].sum+tree[v*2+1].sum;{求sum值}     tree[v].max:=max(max(tree[v*2].max,tree[v*2+1].max),tree[v*2].rgss+tree[v*2+1].lgss);{求max的值}
tree[v].lgss:=tree[v*2].lgss;{左边的maxlgss值}
tree[v].rgss:=tree[v*2+1].rgss;{右边的maxrgss值}        tree[v].min:=min(min(tree[v*2].min,tree[v*2+1].min),tree[v*2].mrgss+tree[v*2+1].mlgss);{求min的值}
tree[v].mlgss:=tree[v*2].mlgss{求左边的minlgss值};
tree[v].mrgss:=tree[v*2+1].mrgss{求右边的minrgss值};if(tree[v*2].lgss<tree[v*2].sum+tree[v*2+1].lgss) thenbegintree[v].lgss:=tree[v*2].sum+tree[v*2+1].lgss;end;if(tree[v*2+1].rgss<tree[v*2+1].sum+tree[v*2].rgss) thenbegintree[v].rgss:=tree[v*2+1].sum+tree[v*2].rgss;end;if(tree[v*2].mlgss>tree[v*2].sum+tree[v*2+1].mlgss) thenbegintree[v].mlgss:=tree[v*2].sum+tree[v*2+1].mlgss;end;if(tree[v*2+1].mrgss>tree[v*2+1].sum+tree[v*2].mrgss) thenbegintree[v].mrgss:=tree[v*2+1].sum+tree[v*2].mrgss;end;

解答问题1:lgss和rgss有何用?答:这个可以时刻维护max的求值,具体维护法笔玩一下,这里不多说。(因为要说明就要画图)
解答问题2:如何判断有没有全部选。答:这是废话,只需要判断max值与sum值相不相等。
解答问题3:为什么sum要在树内做。答:这可以更好地去维护maxlgss、maxrgss、minlgss、minrgss的操作,当然时间会更快的问题我就不确定了。
解答问题4:线段树怎么做。答:自己研究。

标程:

typenew=recordmax:longint;lgss:longint;rgss:longint;min:longint;mlgss:longint;mrgss:longint;sum:longint;end;vari,j,k,l,n,m,t,r,x,gb,ans:longint;a:array[0..1000000] of longint;tree:array[0..1000000] of new;bz:boolean;
function max(x,y:longint):longint;
beginif x>y then exit(x)else exit(y);
end;
function min(x,y:longint):longint;
beginif x<y then exit(x)else exit(y);
end;
procedure maketree(x,st,en:longint);
varm:longint;
begintree[x].max:=-50001;tree[x].min:=50001;tree[x].lgss:=-50001;tree[x].rgss:=-50001;tree[x].mlgss:=50001;tree[x].mrgss:=-50001;if st=en thenbeginexit;endelsebeginm:=(st+en) div 2;maketree(x+x,st,m);maketree(x+x+1,m+1,en);end;
end;
procedure changenumber(v,x,l,r:longint);
vari,j,mid:longint;
beginif l=r thenbegintree[v].max:=gb;tree[v].min:=gb;tree[v].lgss:=gb;tree[v].rgss:=gb;tree[v].mlgss:=gb;tree[v].mrgss:=gb;tree[v].sum:=gb;exit;end;mid:=(r+l) div 2;if x>mid thenbeginchangenumber(v*2+1,x,mid+1,r);endelseif x<=mid thenbeginchangenumber(v*2,x,l,mid);end;tree[v].sum:=tree[v*2].sum+tree[v*2+1].sum;tree[v].max:=max(max(tree[v*2].max,tree[v*2+1].max),tree[v*2].rgss+tree[v*2+1].lgss);tree[v].lgss:=tree[v*2].lgss;tree[v].rgss:=tree[v*2+1].rgss;tree[v].min:=min(min(tree[v*2].min,tree[v*2+1].min),tree[v*2].mrgss+tree[v*2+1].mlgss);tree[v].mlgss:=tree[v*2].mlgss;tree[v].mrgss:=tree[v*2+1].mrgss;if(tree[v*2].lgss<tree[v*2].sum+tree[v*2+1].lgss) thenbegintree[v].lgss:=tree[v*2].sum+tree[v*2+1].lgss;end;if(tree[v*2+1].rgss<tree[v*2+1].sum+tree[v*2].rgss) thenbegintree[v].rgss:=tree[v*2+1].sum+tree[v*2].rgss;end;if(tree[v*2].mlgss>tree[v*2].sum+tree[v*2+1].mlgss) thenbegintree[v].mlgss:=tree[v*2].sum+tree[v*2+1].mlgss;end;if(tree[v*2+1].mrgss>tree[v*2+1].sum+tree[v*2].mrgss) thenbegintree[v].mrgss:=tree[v*2+1].sum+tree[v*2].mrgss;end;
end;
begin//assign(input,'xds.in');reset(input);//assign(output,'xds.out');rewrite(output);readln(n);maketree(1,1,n);for i:=1 to n dobeginread(a[i]);end;for i:=1 to n dobegingb:=a[i];changenumber(1,i,1,n);end;readln(m);for k:=1 to m dobeginreadln(l,r);gb:=r;changenumber(1,l,1,n);if(tree[1].max=tree[1].sum) thenbeginwriteln(tree[1].max-tree[1].min);continue;end;if(tree[1].max>=tree[1].sum-tree[1].min) thenbeginwriteln(tree[1].max);continue;end;if(tree[1].max<tree[1].sum-tree[1].min) thenbeginwriteln(tree[1].sum-tree[1].min);end;end;
end.

转载于:https://www.cnblogs.com/RainbowCrown/p/11148449.html

2017.2.12【初中部 GDKOI】模拟赛B组 T4:pot相关推荐

  1. 2017.03.04【NOIP 普及组】模拟赛C组 T4:泽泽在埃及

    **[2011.12.10普及模拟]泽泽在埃及 ** 题目描述 泽泽已52:0的比分输了球,被足球流氓打了一顿,扔进了窨井里-- 出来的时候,泽泽已经在埃及了. 滚滚的黄沙在周围飞舞,没有一样生物在这 ...

  2. GMOJ - 2021.07.20【普及组】模拟赛C组 - 排座椅(seat)、传球游戏(ball)、立体图(drawing)、间谍派遣、seek

    文章目录 luogu博客链接 GMOJ - 2021.07.20[普及组]模拟赛C组 - 排座椅(seat).传球游戏(ball).立体图(drawing).间谍派遣.seek T1 排座椅(seat ...

  3. 第十二届蓝桥杯(2021年)模拟赛 Python组(第一期) 题目+个人解答

    填空题 填空题-1 [问题描述] 如東整数a是整数b的整数倍,则称b是a的约数. 请问,有多少个正整数是2020的约数. [答案提交] 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一 ...

  4. JZOJ(中山纪念中学) 2018.02.02【NOIP普及组】模拟赛D组

    本次题目:2018.02.02[NOIP普及组]模拟赛D组 第一题 题目:第一题 公牛数字 题意: 求题目给出两个数字的乘积 分析: 这题明显只是考察学生的高精可我居然没做对,只要多练习几次,即可AC ...

  5. 2021.07.16【普及组】模拟赛C组

    2021.07.16[普及组]模拟赛C组 文章目录 2021.07.16[普及组]模拟赛C组 前言 花生采摘 题目 解析 代码 FBI树 题目 解析 代码 火星人 题目 解析 代码 麦森数 题目 解析 ...

  6. 2021.7.16模拟赛C组总结(转载XJY)

    2021.7.16模拟赛C组总结 这次比赛,题虽然不难,但丝毫不影响我打挂-唉- 0+100+50+0=150 题解 T1 题目描述: ​ 鲁宾逊先生有一只宠物猴,名叫多多.这天,他们两个正沿着乡间小 ...

  7. 2021.08.09【普及组】模拟赛C组比赛总结

    文章目录 2021.08.09[普及组]模拟赛C组比赛总结 写在前面: T1 :[普及模拟]生产武器 题目大意: 正解: T2 :[普及模拟]城市连接 题目大意: 正解: T3 :[普及模拟]抢救文件 ...

  8. 2021-07-17【普及组】模拟赛C组

    文章目录 2021.07.17[普及组]模拟赛C组 写在前面: T1: 题目大意: 正解: T2: 题目大意: 正解: T3: 题目大意: 正解: T4: 题目大意: 正解: 2021.07.17[普 ...

  9. 2021-07-15 【普及组】模拟赛C组总结

    文章目录 [普及组]模拟赛C组 写在前面: T1: 题目大意: 正解: T2: 题目大意: 正解: T3: 题目大意: 正解: T4: 题目大意: 正解: [普及组]模拟赛C组 写在前面: 今天的考试 ...

最新文章

  1. 【转】初等数论 ——原根、指标及其应用
  2. 捕捉mysql中不可忽视的知识点(一)
  3. 如何在Ubuntu上使用MultiSystem创建多启动USB盘
  4. 微信小程序出现【需要进行身份验证】弹框解决方法
  5. ubuntu mysql innodb_Ubuntu MYSQL环境搭建
  6. ubuntu 64 12.04 oracle,ubuntu server 12.04 x86_64 下安装oracle xe 11 x86_64
  7. Eclipse中的Web项目自动部署到Tomcat
  8. 【LeetCode】【字符串】题号:*299. 猜数字游戏
  9. 详解-黑莓7290激活教程
  10. deeping操作系统修改已挂载卷名称
  11. 三核浏览器Lunascape新版发布
  12. MySQL 一起重新认识下count(*) ,count(1),count(id)
  13. ISIS详细配置实验
  14. 关于 国产麒麟系统Qt强制退出应用程序qApp->exit()无效 的解决方法
  15. 硬盘内部硬件结构和工作原理详解
  16. 专利之争:诺基亚与苹果互指对方侵权(每日关注2009.12.31)
  17. 计算机桌面图标出现蓝框,win10桌面快捷图标蓝框怎么去除 附黑色方块去除/白色方块修复的方法步骤...
  18. 适合学生写的请假管理系统
  19. Diango:Django基础
  20. 生产者和消费者。举一个寄信的例子

热门文章

  1. ​Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]
  2. mysql flush 使用
  3. 指向结构体的指针别名
  4. 【翻译】Ext JS 4.2介绍
  5. Android数据存储——2.文件存储_C_DOM解析XML文档
  6. Markdown中常用的转义字符
  7. caffe:Data 层
  8. Java运行时动态加载类之ClassLoader
  9. tensorboard scalar图下载失败不完整解决
  10. Tensorflow图像通道合并,IndexError: too many indices for array