洛谷P3097 - [USACO13DEC]最优挤奶Optimal Milking
Description
给出一个\(n(n\leq4\times10^4)\)个数的数列\(\{a_n\}(a_i\geq1)\)。一个数列的最大贡献定义为其中若干个不相邻的数的和的最大值。进行\(m(m\leq5\times10^4)\)次操作,每次修改数列中的一个数并询问此时的最大贡献。
Solution
线段树。
对于线段树上每个节点\([L,R]\),维护四个值\(f_{00},f_{01},f_{10},f_{11}\),分别表示\(a_L,a_R\)都不选,不选\(a_L\)选\(a_R\),选\(a_L\)不选\(a_R\),\(a_L,a_R\)都选的最大贡献。那么\(ans=max\{f[rt]\}\)。
接下来只需要考虑如何合并。其实很简单,只要保证中间的两个不全是\(1\)就好:
f_{01}=max\{f_{00}[Ls]+f_{01}[Rs],f_{01}[Ls]+f_{01}[Rs],f_{00}[Ls]+f_{11}[Rs]\} \\
f_{10}=max\{f_{10}[Ls]+f_{00}[Rs],f_{11}[Ls]+f_{00}[Rs],f_{10}[Ls]+f_{10}[Rs]\} \\
f_{11}=max\{f_{10}[Ls]+f_{01}[Rs],f_{11}[Ls]+f_{01}[Rs],f_{10}[Ls]+f_{11}[Rs]\}\]
时间复杂度\(O(mlogn)\)。
Code
//[USACO13DEC]最优挤奶Optimal Milking
#include <cstdio>
typedef long long lint;
inline char gc()
{
static char now[1<<16],*s,*t;
if(s==t) {t=(s=now)+fread(now,1,1<<16,stdin); if(s==t) return EOF;}
return *s++;
}
inline int read()
{
int x=0; char ch=gc();
while(ch<'0'||'9'<ch) ch=gc();
while('0'<=ch&&ch<='9') x=x*10+ch-'0',ch=gc();
return x;
}
inline int max(int x,int y) {return x>y?x:y;}
const int N=16e4+10;
int n,m;
#define Ls (p<<1)
#define Rs (p<<1|1)
int rt; lint f00[N],f01[N],f10[N],f11[N];
inline void update(int p)
{
f00[p]=max(f00[Ls]+f00[Rs],max(f01[Ls]+f00[Rs],f00[Ls]+f10[Rs]));
f01[p]=max(f00[Ls]+f01[Rs],max(f01[Ls]+f01[Rs],f00[Ls]+f11[Rs]));
f10[p]=max(f10[Ls]+f00[Rs],max(f11[Ls]+f00[Rs],f10[Ls]+f10[Rs]));
f11[p]=max(f10[Ls]+f01[Rs],max(f11[Ls]+f01[Rs],f10[Ls]+f11[Rs]));
}
void ins(int p,int L0,int R0,int x,int v)
{
if(L0==x&&x==R0) {f00[p]=f01[p]=f10[p]=0,f11[p]=v; return;}
int mid=L0+R0>>1;
if(x<=mid) ins(Ls,L0,mid,x,v);
else ins(Rs,mid+1,R0,x,v);
update(p);
}
int main()
{
n=read(),m=read();
rt=1;
for(int i=1;i<=n;i++) ins(rt,1,n,i,read());
lint ans=0;
for(int i=1;i<=m;i++)
{
int x=read(),v=read();
ins(rt,1,n,x,v);
ans+=max(max(f00[rt],f01[rt]),max(f10[rt],f11[rt]));
}
printf("%lld\n",ans);
return 0;
}
P.S.
标题好长呀...
洛谷P3097 - [USACO13DEC]最优挤奶Optimal Milking的更多相关文章
- P3097 [USACO13DEC]最优挤奶Optimal Milking
P3097 [USACO13DEC]最优挤奶Optimal Milking 题意简述:给定n个点排成一排,每个点有一个点权,多次改变某个点的点权并将最大点独立集计入答案,输出最终的答案 感谢@zht4 ...
- [P3097] [USACO13DEC] [BZOJ4094] 最优挤奶Optimal Milking 解题报告(线段树+DP)
题目链接:https://www.luogu.org/problemnew/show/P3097#sub 题目描述 Farmer John has recently purchased a new b ...
- P3097 [USACO13DEC]最优挤奶(线段树优化dp)
盲猜dp系列... 题意:给定序列,选了i就不能选与i相邻的两个,求最大值,带修改 蒟蒻在考场上10min打完以为只有两种情况的错解...居然能骗一点分... 先讲下当时的思路吧. f[i][0/1] ...
- 【题解】洛谷P1073 [NOIP2009TG] 最优贸易(SPFA+分层图)
次元传送门:洛谷P1073 思路 一开始看题目嗅出了强连通分量的气息 但是嫌长没打 听机房做过的dalao说可以用分层图 从来没用过 就参考题解了解一下 因为每个城市可以走好几次 所以说我们可以在图上 ...
- 洛谷P3093 [USACO13DEC]牛奶调度Milk Scheduling
题目描述 Farmer John has N cows that need to be milked (1 <= N <= 10,000), each of which takes onl ...
- 【洛谷P1073】最优贸易
题目大意:给定一个 N 个点,M 条边(存在反向边)的有向图,点有点权,求一条从 1 到 N 的路径上,任意选出两个点 p,q (p 在前,q在后),两点点权的差值最大. 根据最短路的 dp 思想,可 ...
- 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)
题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...
- 洛谷P3094 [USACO13DEC]假期计划Vacation Planning
题目描述 有N(1 <= N <= 200)个农场,用1..N编号.航空公司计划在农场间建立航线.对于任意一条航线,选择农场1..K中的农场作为枢纽(1 <= K <= 100 ...
- 洛谷1073 NOIP2009 最优贸易
题目大意 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...
随机推荐
- Win10系统64位快速专业安装版 V2016年
win10系统64位快速专业安装版 V2016年2月 系统下载:http://www.xitongma.com/ Ghost Win10 64位正式装机专业版2016 微软向Windows用户推送了w ...
- 霍金的新语音系统 ACAT 将开源
英国理论物理学家斯蒂芬·霍金(Stephen Hawking)使用了二十年的语音通讯系统被英特尔开发的新一代通讯平台替代,显著改进了通讯效率.但霍金的声音并没有发生改变,他仍然使用相同的语音合成器.霍 ...
- WPF中给Button加上图标和文字
要实现在Button里面加入图标或者图形以及文字,我们就需要在Button里面用一个WrapPanel控件,这个WrapPanel控件会把我们的图标或者文字进行包裹,并显示出来. Xaml: < ...
- Linux中fork函数的例子
- C#背景图片自适应
1.选中窗体修改属性 2.在load添加代码 private void Form1_Load(object sender, EventArgs e) { this.BackgroundImageLay ...
- 系统学习爬虫_2_urllib
什么是urllib urlopen urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cad ...
- vue引用文件
1)css引入在vue页面中<style scoped> @import url("../assets/css/home.css");</style>2)j ...
- ulimit 值超出允许范围导致无法登陆操作系统
在linux中,使用ulimit可以设置一些资源的使用限制. [root@root ~]# ulimit -a core file size (blocks, -c) unlimit ...
- Greenplum/Deepgreen(单机/伪分布)安装文档
Greenplum/Deepgreen数据库安装(单机/伪分布) 首先去官网下载centos7:https://www.centos.org/download/,选择其中一个镜像下载即可,网上随意下载 ...
- bash编程的信号捕获:
bash编程的信号捕获: kill -l KILL无法捕捉: trap 'COMMAND' SIGNAL, 信号捕捉用于:在中途中止时做一些清理操作. 一. trap捕捉到信号之后,可以 ...