题目大意:
给定n个点排成一排,每个点有一个点权,有m次修改,每次改变某个点的点权并将最大点独立集计入答案,输出最终的答案

其中n≤40000 , m≤50000n≤40000,m≤50000n\le 40000\ , \ m\le 50000

QWQ说实话,一开始看这个题,没啥思路呀

后来看了题解才知道是线段树

我们考虑对一个区间,我们只需要关心左右节点是否取,就可以从小的区间更新大区间。
从而实现线段树的区间合并了

QWQ我们定义
f[i].bothf[i].bothf[i].both表示左右边界都取
f[i].leftf[i].leftf[i].left表示只取左边界
f[i].rightf[i].rightf[i].right表示只取右边界
f[i].neitherf[i].neitherf[i].neither表示左右边界都不取

对于每种情况,我们分开讨论

首先定义l=2∗root,r=2∗root+1l=2∗root,r=2∗root+1l=2*root,r=2*root+1
对于f[root].bothf[root].bothf[root].both
f[root].both=max(f[l].left+max(f[r].both,f[r].right),f[l].both+f[r].right);f[root].both=max(f[l].left+max(f[r].both,f[r].right),f[l].both+f[r].right);f[root].both=max(f[l].left+max(f[r].both,f[r].right),f[l].both+f[r].right);
也就是如果左边只取左,右边可以都取或者只取右
如果左边都取,那么右边只能取右了(因为中间的左右区间的交界处也是不能同时取到的)

对于f[root].right,f[root].leftf[root].right,f[root].leftf[root].right,f[root].left

f[root].left=max(f[l].left+max(f[r].neither,f[r].left),f[l].both+f[r].neither);f[root].left=max(f[l].left+max(f[r].neither,f[r].left),f[l].both+f[r].neither);f[root].left=max(f[l].left+max(f[r].neither,f[r].left),f[l].both+f[r].neither);
f[root].right=max(f[l].neither+max(f[r].right,f[r].both),f[l].right+f[r].right);f[root].right=max(f[l].neither+max(f[r].right,f[r].both),f[l].right+f[r].right);f[root].right=max(f[l].neither+max(f[r].right,f[r].both),f[l].right+f[r].right);

同样的方法,处理一下

而对于f[root].neitherf[root].neitherf[root].neither

f[root].neither=max(max(f[l].neither+f[r].neither,f[l].right+f[r].neither),f[r].left+f[l].neither)f[root].neither=max(max(f[l].neither+f[r].neither,f[l].right+f[r].neither),f[r].left+f[l].neither)f[root].neither=max(max(f[l].neither+f[r].neither,f[l].right+f[r].neither),f[r].left+f[l].neither)

然后考虑更新的部分话

将一个点权修改也就是重新更新那个节点的f[root].bothf[root].bothf[root].both,然后将其他的清零。
最后更新就行

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<map>
#include<vector>using namespace std;inline int read()
{int x=0,f=1;char ch=getchar();while (!isdigit(ch)) {if (ch=='-') f=-1;ch=getchar();}while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;
}const int maxn = 40010;struct Node{int left,right,both,neither;
};Node f[4*maxn];
int n,a[maxn];
int m;
long long ans;void up(int root)
{int l = 2*root,r=2*root+1;f[root].both=max(f[l].left+max(f[r].both,f[r].right),f[l].both+f[r].right);f[root].left=max(f[l].left+max(f[r].neither,f[r].left),f[l].both+f[r].neither);f[root].right=max(f[l].neither+max(f[r].right,f[r].both),f[l].right+f[r].right);f[root].neither=max(max(f[l].neither+f[r].neither,f[l].right+f[r].neither),f[r].left+f[l].neither);
}void build(int root,int l,int r)
{if (l==r){f[root].left=f[root].right=f[root].neither=0;f[root].both=a[l];return;}int mid = (l+r) >> 1;build(2*root,l,mid);build(2*root+1,mid+1,r);up(root);
}void update(int root,int l,int r,int x,int p)
{if (l==r){f[root].left=f[root].right=f[root].neither=0;f[root].both=p;return;}int mid =(l+r) >> 1;if (x<=mid) update(2*root,l,mid,x,p);if (x>mid) update(2*root+1,mid+1,r,x,p);up(root);
}int main()
{n=read();m=read();for (int i=1;i<=n;i++) a[i]=read();build(1,1,n);for (int i=1;i<=m;i++){int day,x;day=read(),x=read();update(1,1,n,day,x);long long tmp=max(f[1].left,max(f[1].right,max(f[1].both,f[1].neither)));ans+=tmp;}cout<<ans<<endl;return 0;
}

bzoj4094 luogu3097 最优挤奶相关推荐

  1. bzoj4094[Usaco2013 Dec]Optimal Milking最优挤奶

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4094 题目大意: 约翰有N 台挤奶机器,这些机器排成了一条直线,其中第i台机器工作效率是A ...

  2. 【BZOJ4094】[Usaco2013 Dec]Optimal Milking 线段树

    [BZOJ4094][Usaco2013 Dec]Optimal Milking Description Farmer John最近购买了N(1 <= N <= 40000)台挤奶机,编号 ...

  3. 【bzoj1727】[Usaco2006 Open]The Milk Queue 挤奶队列 贪心

    题目描述 Every morning, Farmer John's N (1 <= N <= 25,000) cows all line up for milking. In an eff ...

  4. 中国挤奶点控制器市场趋势报告、技术动态创新及市场预测

    出版商:贝哲斯咨询 获取报告样本: 企业竞争态势 该报告涉及的主要国际市场参与者有Afimilk.ATL-Agricultural Technology.BioControl.CAPAR Milkin ...

  5. 【BZOJ4094】 【Usaco2013 Dec】Optimal Milking(权限题)

    Description Farmer John最近购买了N(1 <= N <= 40000)台挤奶机,编号为1 ... N,并排成一行.第i台挤奶机每天能够挤M(i)单位的牛奶 (1 &l ...

  6. [bzoj4094][Usaco2013 Dec]Optimal Milking 线段树

    4094: [Usaco2013 Dec]Optimal Milking Time Limit: 10 Sec  Memory Limit: 128 MB [Submit][Status][Discu ...

  7. 除了“卖奶”给伊利,“乳业上游第一股”优然牧业还有什么盼头?

    在失去了泡面"自由"之后,我们又开始逐渐失去牛奶"自由". 现在的牛奶正在变得越来越贵,过去一盒250ml的纯牛奶只要两块五,如今已经涨到了四块起步.与此同时, ...

  8. 澳乐优,中国宝宝与澳洲牧场的美丽邂逅!

    如果要问哪里的婴幼儿奶粉最受家长们的喜爱,那么被誉为世界上"最后一片净土"的澳大利亚一定是有名有份的.只有在这片被隔绝在工业革命和战火之外,遍地充满自然之美,原始和现代激烈碰撞却又 ...

  9. JVM内存调优原则及几种JVM内存调优方法

    JVM内存调优原则及几种JVM内存调优方法 1.堆大小设置. 2.回收器选择. 1.在对JVM内存调优的时候不能只看操作系统级别Java进程所占用的内存,这个数值不能准确的反应堆内存的真实占用情况,因 ...

  10. pyspark性能调优参数

    20220311 参数调节 把executor数量调小,其他参数值调大,不容易报错 一.指定spark executor 数量的公式 executor 数量 = spark.cores.max/spa ...

最新文章

  1. iOS进阶之底层原理-block本质、block的签名、__block、如何避免循环引用
  2. 软件级负载均衡器(LVS/HAProxy/Nginx)的特点简介和对比
  3. Java实现搜索回溯经典题目
  4. VTK:科赫雪花用法实战
  5. Go 函数特性和网络爬虫示例
  6. day 13 课后作业
  7. spark streaming checkpointing
  8. 计算机毕业设计中用Java实现商场库存清单案例
  9. 【数字信号调制】基于matlab二进制数字振幅调制与解调(2ASK)【含Matlab源码 996期】
  10. 如何自学html5 web前端工程师培训视频教程
  11. 台式计算机的显卡,台式电脑显卡天梯图-台式机显卡性能排名
  12. EDK2编译环境搭建、编译、在模拟器运行、在笔记本运行
  13. js和安卓app互相传数据(安卓app页面集成html页面,获取数据并给安卓返回数据)
  14. 【论文笔记】CVR预估之ESMM模型
  15. Nmap学习4 - 主机发现 实验一
  16. VS Code 也能预览 Markdown - 一个无意中发现的小技巧
  17. 史上最简单笔记本选购攻略(给对笔记本配置完全不懂的小白,建议收藏)
  18. 针对chromium IME的外接输入法框架
  19. Android中添加思源字体/NotoSansCJK/SourceHanSans
  20. Android8.1 MTK 平台 Launcher3 修改定制

热门文章

  1. 中国网络游戏未来发展方向
  2. 树莓派系列(一):树莓派介绍
  3. 适应iPhone5的尺寸
  4. animation动画不生效_你可能不知道的Animation动画技巧与细节
  5. redirect_uri参数错误
  6. Ubuntu中安装VirtualBox
  7. xp系统远程桌面关闭计算机,系统是xp在本机开启远程桌面后,别人使用远程桌面连接我的电脑,我的电脑就会出现蓝屏停止代码是0x0000007f...
  8. thinkphp使用163/126邮箱发送
  9. Pycharm新建项目,new environment 和 existing interpreter的区别
  10. 怎么将两台计算机ping接通,小编教你手把手教你一根网线连接两台电脑实现数据传送...