Description

Farmer John最近购买了N(1 <= N <= 40000)台挤奶机,编号为1 ... N,并排成一行。第i台挤奶机每天能够挤M(i)单位的牛奶 (1 < =M(i) <=100,000)。由于机器间距离太近,使得两台相邻的机器不能在同一天使用。Farmer John可以自由选择不同的机器集合在不同的日子进行挤奶。在D(1 < = D < = 50,000)天中,每天Farmer John对某一台挤奶机进行维护,改变该挤奶机的产量。Farmer John希望设计一个挤奶方案,使得挤奶机能够在D天后获取最多的牛奶。

Input

第1行:两个整数N和D
第2..N+1行:每台挤奶机的M(i)
第N+2..N+D+1行:两个整数i和m,表示每天对机器i进行维护,机器i的产量为m。

Output

最大产量

Sample Input

5 3
1
2
3
4
5
5 2
2 7
1 10

Sample Output

32
【样例解释】
第1天,最优方案为2+4=6 ( 方案1+3+2一样)
第2天,最优方案为7+4=11
第3天,最优方案为10+3+2=15
题解
开始看起来像个dp,但是算一下复杂度是nm的,不对,后来发现可以用维护最左边和最右边选的情况,然后就可以进行区间合并了。
总结一下能用线段树维护题的性质:维护的值一定是有左右两端点的值,这样才能进行区间合并,还有题目要有连续两数之间的关系,才能用线段树维护。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=40010;
const int inf=1000000000;
int n,m,a[N];
ll ans;
struct tree{int l,r;ll f[3][3];
}t[N*4];
void update(int x,int x1,int x2){t[x].f[1][1]=max(t[x1].f[1][1]+t[x2].f[0][1],max(t[x1].f[1][0]+t[x2].f[1][1],t[x1].f[1][0]+t[x2].f[0][1]));t[x].f[1][0]=max(t[x1].f[1][0]+t[x2].f[1][0],max(t[x1].f[1][0]+t[x2].f[0][0],t[x1].f[1][1]+t[x2].f[0][0]));t[x].f[0][1]=max(t[x1].f[0][1]+t[x2].f[0][1],max(t[x1].f[0][0]+t[x2].f[0][1],t[x1].f[0][0]+t[x2].f[1][1]));t[x].f[0][0]=max(t[x1].f[0][0]+t[x2].f[1][0],max(t[x1].f[0][0]+t[x2].f[0][0],t[x1].f[0][1]+t[x2].f[0][0]));return ;
}
void build(int x,int l,int r){t[x].l=l,t[x].r=r;if(l==r){t[x].f[1][1]=a[l];t[x].f[1][0]=t[x].f[0][1]=-inf;t[x].f[0][0]=0;return ;}int mid=(l+r)>>1;build(x*2,l,mid);build(x*2+1,mid+1,r);update(x,x*2,x*2+1);
}
void change(int x,int l,int k){if(t[x].l==l&&t[x].r==l){t[x].f[1][1]=k;t[x].f[1][0]=t[x].f[0][1]=-inf;t[x].f[0][0]=0;return ;}if(t[x].l>l||t[x].r<l) return ;change(x*2,l,k);change(x*2+1,l,k);update(x,x*2,x*2+1);
}
ll query(){//printf("%d %d %d %d\n",c.f[1][1],c.f[1][0],c.f[0][1],c.f[0][0]);return max(max(t[1].f[1][1],max(t[1].f[1][0],t[1].f[0][1])),t[1].f[0][0]);
}
int main(){int x,y;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) scanf("%d",&a[i]);build(1,1,n);for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);change(1,x,y);//  cout<<query()<<endl;ans+=query();}printf("%lld\n",ans);return 0;
}

【BZOJ4094】 【Usaco2013 Dec】Optimal Milking(权限题)相关推荐

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

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

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

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

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

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

  4. bzoj 4094: [Usaco2013 Dec]Optimal Milking

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

  5. bzoj 4094: [Usaco2013 Dec]Optimal Milking 线段树

    →题目链接← [想说的话] 再次手误... [题解] 对于每个区间维护四种最大值 1.选左端点不选右端点 2.选右端点不选左端点 3.两个端点都选 4.两个端点都不选 然后用线段树搞一搞就好了 注意下 ...

  6. BZOJ 4094 USACO 2013 Dec. Optimal Milking

    线段树 每个节点保存4个值,both表示左右端点都取,neither表示左右端点都不取,left表示只取左端点,right表示只取右端点. 维护的特殊姿势: $cur$的$both=max(ls.l+ ...

  7. POJ 2112 Optimal Milking(二分+最大流)

    POJ 2112 Optimal Milking 题目链接 题意:给定一些机器和奶牛,在给定距离矩阵,(不在对角线上为0的值代表不可达),每一个机器能容纳m个奶牛.问全部奶牛都能挤上奶,那么走的距离最 ...

  8. [bzoj4094]Optimal Milking

    建立线段树,维护区间左端点选/不选,右端点选/不选且不含有相邻两个同时选的最大值,合并时注意细节即可 1 #include<bits/stdc++.h> 2 using namespace ...

  9. POJ2112 Optimal Milking

    这题的大意是有C只牛,K台机器,C只牛与K台机器的距离是已知的,现在还知道,K台机器的最多能容下M只牛,现在问说如何安排这些牛到这些机器上,使得符合上述的限制,同时要使牛与机器的最远距离最小.具体的做 ...

最新文章

  1. 安卓上的微软 Edge 浏览器新增支持长截图
  2. 如何在Dart中合并列表
  3. 每天早上喝一杯豆浆不吃饭,一个月后会是什么反应?
  4. python实践项目(五)
  5. 递归法:求n个元素的全排列
  6. 联想网络同传系统用户手册(联想EDU应用用户手册)[联想硬盘保护,联想网络控制工具]
  7. 毕设项目 - 基于SSM的音乐网站(含源码+论文)
  8. 纪念 C语言之父 丹尼斯·里奇 逝世10周年:他发明了计算机世界的钢筋水泥!...
  9. 智能机器人机器人心得_你是机器人吗
  10. 2022R1快开门式压力容器操作考试模拟100题模拟考试平台操作
  11. Python实现求二阶行列式
  12. 【字节面试-字符串】判断一组字符串能否首尾相连
  13. STC单片机 定时器时钟FOSC 1T 12T、定时器模式
  14. 让你快速逃离万能五笔的广告
  15. DELL服务器自动开机设置
  16. 虚拟机安装+win10系统
  17. HBuilder js,css压缩,增强代码的安全性
  18. 配方奶粉,尽量不用鲜奶
  19. python如何设置搜狗输入法中英文切换_2020秋季报告:手机输入法AI时代来临,百度输入法优势明显...
  20. TensorFlow-GPU的安装及keras的安装

热门文章

  1. java购物车的实现并发控制_购物车的实现原理
  2. TPC-H测试超详细介绍
  3. 类美团外卖、骑手、类快递取餐柜、整合菜品供应商、前厅、后厨、配送、智能厨电设备的智慧餐饮业务
  4. 仿苹果手机_高价回收旧手机旧电脑最终怎么处理了?能不能卖?
  5. 苹果手机怎么清除缓存_手机里的文件如何彻底删除?教你清除缓存的方法
  6. Android 开源OS
  7. 电脑电池,正确给笔记本电脑电池校正的技巧攻略
  8. 游戏界的“扛把子”,“3D 游戏之父”, 约翰•卡马克的传奇人生
  9. 可视对讲系统服务器连接失败,可视对讲系统呼叫分机、门口机不通是什么问题?...
  10. 完美国际真数苹果_让苹果数据线下岗的两款数据线!剪断了还能用!