洛谷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 条道路中有一部分为单向通行的道路,一部分为双向通行的道路,双 ...
随机推荐
- github入门之配置github本地仓库--2
*前期准备工作 创建github账户 github地址 1.设置SSH_Key ssh-keygen -t rsa -C "你的邮箱" 2.查看秘钥 cat ~/.ssh/id_r ...
- jmeter中通过jdbc方式连接mysql数据库的配置参考
jmeter中通过jdbc方式连接mysql数据库的配置参考: Database URL=jdbc:mysql://ip:port/dbname?useUnicode=true&allowMu ...
- NBUT 1118 Marisa's Affair (排序统计,水)
题意: 每行给出一个人名和一个int值,人名可重复出现.要求对同一个人名统计int值,最大的先输出,若相同,则按照人名出现次数,若再相同,则按照人名字典序. 思路: 输入完全部进行排序,写个比较函数传 ...
- ubuntu16.0 安装 openstack
主要参考官方文档:https://docs.openstack.org/liberty/zh_CN/install-guide-ubuntu/environment-nosql-database.ht ...
- mac ssd开启trim模式
开启方法 sudo trimforce enable
- iview 表单验证 input 用失去焦点事件 blur, select下拉选框 要用change事件 验证
birthday: [{ required: true, message: '内容不能为空', trigger: 'blur' }],belongDept: [{ required: true, me ...
- oracle row_number的使用
create table studentInfo( id number(8) primary key, name varchar2(20) not null, ObjectName varcha ...
- Linux基础学习-使用PXE+Kickstart无人值守安装服务
无人值守安装系统 PXE(Preboot eXecute Environment,预启动执行环境)是由Intel公司开发的技术,可以让计算机通过网络来启动操作系统(前提是计算机上安装的网卡支持PXE技 ...
- git 常用命令及虚拟机服务器仓库搭建
$ git config --global user.email "you@example.com" $ git config --global user.name "Y ...
- (转)uibutton边框颜色
UIButton *testButton = [UIButton buttonWithType:UIButtonTypeSystem]; [testButton setFrame:CGRectMake ...