题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=4094

题目大意:

约翰有N 台挤奶机器,这些机器排成了一条直线,其中第i台机器工作效率是Ai,也就是说工作一天可以产出Ai。约翰将会开动这些机器工作Q 天。每天一早,约翰一定会维修一台机器。在第i 天早上,他维修的是第Ti 台机器,经过维修之后,这台机器的工作效率将会变成Di。在任何时候,位置相邻的两台机器都不能同时工作。请问约翰每天应该选择开动哪些机器,才能让这Q 天的总产出之和最大?

题解:

线段树

脖子上没有东西的我天真的以为直接每天取奇数位的或者偶数位的机器开,维护两个变量:和&开奇数位机器的和。但是直到我只过了两个点才发现明显的错啊qwq反例还是容易找到的[尽管我找到的反例其实并不是反例= =不管反正知道错了。

所以我的线段树后来就维护了四个变量,左端点取右端点不取,左端点不取右端点取,两个端点都取/不取的最大值。

方便不打错就直接开了个二维小数组~

方便记答案还多开了个变量mx,就是上面那四个东西中的最大值。。

好像知道怎么去维护就应该会做了吧嗯。

想了还不会再看看我那长得丑的代码↓

([0][0]就表示左右端点都不取..依此类推)

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
#define maxn 201000struct tree
{int l,r,lc,rc;LL a[2][2],mx;
}tr[maxn];int tlen;
LL mymax(LL x,LL y){return (x>y)?x:y;}
void bt(int l,int r)
{tlen++;int now=tlen;tr[now].l=l;tr[now].r=r;tr[now].lc=tr[now].rc=-1;memset(tr[now].a,0,sizeof(tr[now].a));tr[now].mx=0;if (l<r){int mid=(l+r)>>1;tr[now].lc=tlen+1;bt(l,mid);tr[now].rc=tlen+1;bt(mid+1,r);}
}
void updata(int now,int lc,int rc)//四种情况分别更新
{tr[now].a[0][0]=mymax(tr[lc].a[0][1]+tr[rc].a[0][0],tr[lc].a[0][0]+tr[rc].a[1][0]);tr[now].a[1][0]=mymax(tr[lc].a[1][1]+tr[rc].a[0][0],tr[lc].a[1][0]+tr[rc].a[1][0]);tr[now].a[0][1]=mymax(tr[lc].a[0][1]+tr[rc].a[0][1],tr[lc].a[0][0]+tr[rc].a[1][1]);tr[now].a[1][1]=mymax(tr[lc].a[1][1]+tr[rc].a[0][1],tr[lc].a[1][0]+tr[rc].a[1][1]);
}
void change(int now,int x,LL k)
{if (tr[now].l==tr[now].r){tr[now].a[1][1]=k;tr[now].mx=k;return;}int mid=(tr[now].l+tr[now].r)>>1,lc=tr[now].lc,rc=tr[now].rc;if (x<=mid) change(lc,x,k);else change(rc,x,k);updata(now,lc,rc);tr[now].mx=mymax(tr[now].a[0][0],tr[now].a[0][1]);tr[now].mx=mymax(tr[now].mx,mymax(tr[now].a[1][0],tr[now].a[1][1]));
}
int main()
{//freopen("optmilk.in","r",stdin);//freopen("optmilk.out","w",stdout);int n,q,i;LL ans,x,c;scanf("%d%d",&n,&q);tlen=0;bt(1,n);for (i=1;i<=n;i++){scanf("%lld",&x);change(1,i,x);}ans=0;while (q--){scanf("%lld%lld",&x,&c);change(1,x,c);ans+=tr[1].mx;}printf("%lld\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Euryale-Rose/p/6527835.html

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 线段树

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

  3. bzoj 4094: [Usaco2013 Dec]Optimal Milking

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

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

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

  5. BZOJ 4094 USACO 2013 Dec. Optimal Milking

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

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

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

  7. An Intuitive Guide to Optimal Transport|最优传输理论

    An Intuitive Guide to Optimal Transport|最优传输理论 最优传输:最优传输问题最早是由法国数学家蒙日于1780年代提出:其解的存在性被俄国数学家Kantorovi ...

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

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

  9. [bzoj4094]Optimal Milking

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

最新文章

  1. MongoDB给数据库创建用户
  2. windows路径操作API函数
  3. Android中Activity的四种启动模式
  4. 前端基础之JavaScript_2
  5. 将Lucene搜索集成到应用程序中
  6. java生命小游戏_Java修炼——飞机生存小游戏
  7. 基于维特比算法的概率路径
  8. 阿里技术:基于Kafka+Flink+Redis的电商大屏实时计算案例
  9. HDU.1003 Max Sum
  10. MySQL规范「索引规范」码出高效,码出质量 - 第399篇
  11. gcc怎么编写c语言程序,gcc如何编译C语言程序
  12. java升序排列数组_java数组的升序降序排列
  13. 中国计算机学会(CCF)——推荐国际学术会议和期刊目录
  14. 使用数据库进行用户身份认证
  15. UnicodeEncodeError: 'ascii' codec can't encode character '\u2013'
  16. 小麦麦穗品种识别数据集
  17. 【C程序】逻辑判断真假话问题:3人说真话,1人说假话
  18. 计算机科学创新大赛,计算机学院大学生创新项目入围挑战杯大赛
  19. 【硬件木马项目】第一篇:数据处理之Verilog HDL语言
  20. 2020万得技术校招笔试题(软件开发)

热门文章

  1. 【ARMv8】异常级别的定义EL0、EL1、EL2、EL3
  2. “This probably means that you are not using fork to start your child processes and you hav报错
  3. 基于C#在WPF中使用斑马打印机进行打印
  4. 十一、kotlin的协程(一)
  5. Redirect组件的使用
  6. Python 三人斗地主手牌生成
  7. 让人工智能完美运行:我们怎么给人工智能系统赋予价值观?
  8. 13.第十四章.文档和配置管理
  9. 别找了,这个命令让你在字符串和十六进制间自由转换
  10. 合并写(write combining)