Portal

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_{00}=max\{f_{00}[Ls]+f_{00}[Rs],f_{01}[Ls]+f_{00}[Rs],f_{00}[Ls]+f_{10}[Rs]\} \\
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的更多相关文章

  1. P3097 [USACO13DEC]最优挤奶Optimal Milking

    P3097 [USACO13DEC]最优挤奶Optimal Milking 题意简述:给定n个点排成一排,每个点有一个点权,多次改变某个点的点权并将最大点独立集计入答案,输出最终的答案 感谢@zht4 ...

  2. [P3097] [USACO13DEC] [BZOJ4094] 最优挤奶Optimal Milking 解题报告(线段树+DP)

    题目链接:https://www.luogu.org/problemnew/show/P3097#sub 题目描述 Farmer John has recently purchased a new b ...

  3. P3097 [USACO13DEC]最优挤奶(线段树优化dp)

    盲猜dp系列... 题意:给定序列,选了i就不能选与i相邻的两个,求最大值,带修改 蒟蒻在考场上10min打完以为只有两种情况的错解...居然能骗一点分... 先讲下当时的思路吧. f[i][0/1] ...

  4. 【题解】洛谷P1073 [NOIP2009TG] 最优贸易(SPFA+分层图)

    次元传送门:洛谷P1073 思路 一开始看题目嗅出了强连通分量的气息 但是嫌长没打 听机房做过的dalao说可以用分层图 从来没用过 就参考题解了解一下 因为每个城市可以走好几次 所以说我们可以在图上 ...

  5. 洛谷P3093 [USACO13DEC]牛奶调度Milk Scheduling

    题目描述 Farmer John has N cows that need to be milked (1 <= N <= 10,000), each of which takes onl ...

  6. 【洛谷P1073】最优贸易

    题目大意:给定一个 N 个点,M 条边(存在反向边)的有向图,点有点权,求一条从 1 到 N 的路径上,任意选出两个点 p,q (p 在前,q在后),两点点权的差值最大. 根据最短路的 dp 思想,可 ...

  7. 【洛谷 P1073】 最优贸易 (Tarjan缩点+拓扑排序)

    题目链接 先\(Tarjan\)缩点,记录每个环内的最大值和最小值. 然后跑拓扑排序,\(Min[u]\)表示到\(u\)的最小值,\(ans[u]\)表示到\(u\)的答案,\(Min\)和\(an ...

  8. 洛谷P3094 [USACO13DEC]假期计划Vacation Planning

    题目描述 有N(1 <= N <= 200)个农场,用1..N编号.航空公司计划在农场间建立航线.对于任意一条航线,选择农场1..K中的农场作为枢纽(1 <= K <= 100 ...

  9. 洛谷1073 NOIP2009 最优贸易

    题目大意 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...

随机推荐

  1. java代码(生成long类型数字)

    package test; public class GenerateNum { public static void main(String[] args) { //定义为long类型,需在数值后面 ...

  2. ADO1

    1. 新建Web窗体 客户端控件:html控件 服务器控件:用的比较少 2. 数据库连接 protected void btnLogin_Click(object sender, EventArgs ...

  3. 洛谷 P2353 背单词

    题目背景 小明对英语一窍不通,令老师十分头疼.于是期末考试前夕,小明被逼着开始背单词…… 题目描述 老师给了小明一篇长度为N的英语文章,然后让小明背M个单词.为了确保小明不会在背单词时睡着,老师会向他 ...

  4. SAP云平台,区块链,超级账本和智能合约

    前一篇文章<Hyperledger Fabric on SAP Cloud Platform>,我的同事Aviva已经给大家介绍了基于区块链技术的超级账本(Hyperledger)的一些概 ...

  5. Lesson2

    #ifdef __cplusplus #include <cstdlib> #else #include <stdlib.h> #endif #include <SDL/ ...

  6. velocity生成静态页面代码

    首先需要必备的jar包: web.xml <!-- load velocity property --> <servlet> <servlet-name>veloc ...

  7. [php扩展] php安装扩展注意事项

    添加扩展的时候注意此3项 用的编译器版本:VC11... 安装的php版本:x86/x64 是否线程安全:enabled / disabled

  8. Lex与Yacc学习(八)之变量和有类型的标记(扩展计算器)

    变量和有类型的标记 下一步扩展计算器来处理具有单个字母名字的变量,因为只有26个字母 (目前只关心小写字母),所以我们能在26个条目的数组(称它为vbltable)中存储变量. 为了使得计算器更加有用 ...

  9. 杭电 1159 Common Subsequence

    Problem Description A subsequence of a given sequence is the given sequence with some elements (poss ...

  10. 关于logging模块重复问题

    logger对象配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 import logging # 获取一个新日志logger = ...