bzoj4094 [Usaco2013 Dec]Optimal Milking

网友投稿 248 2022-09-16

bzoj4094 [Usaco2013 Dec]Optimal Milking

​​ Description

Farmer John最近购买了N(1 <= N <= 40000)台挤奶机,编号为1 … N,并排成一行。第i台挤奶机每天能够挤M(i )单位的牛奶 (1 < =M(i) <=100,000)。由于机器间距离太近,使得两台相邻的机器不能在同一天使用。Farmer Jo hn可以自由选择不同的机器集合在不同的日子进行挤奶。在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 HINT

Source

Gold

考虑在线段树上维护一些信息 每个节点维护v00v01v10v11分别表示这个区间左右端点的是否选择问题 那么0表示不选1表示选 更新的时候 把四个值分别用左右子树更新一下即可

只需要满足中间位置没有同时出现两个1即可 正确性:因为没有负权且每次询问都是询问全局所以一定会取到能取到的情况

#include#include#include#define lc (x<<1)#define rc (x<<1|1)using namespace std;inline char gc(){ static char now[1<<16],*S,*T; if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;} return *S++;}inline int read(){ int x=0,f=1;char ch=gc(); while(!isdigit(ch)) {if (ch=='-') f=-1;ch=gc();} while(isdigit(ch)) x=x*10+ch-'0',ch=gc(); return x*f;}const int N=40040;struct node{ int v00,v01,v10,v11;}tree[N<<2];inline void update(int x){ static int lv00,lv01,lv10,lv11; static int rv00,rv01,rv10,rv11; lv00=tree[lc].v00;lv01=tree[lc].v01;lv10=tree[lc].v10;lv11=tree[lc].v11; rv00=tree[rc].v00;rv01=tree[rc].v01;rv10=tree[rc].v10;rv11=tree[rc].v11; tree[x].v00=max(lv00+rv00,max(lv01+rv00,lv00+rv10)); tree[x].v01=max(lv00+rv11,max(lv01+rv01,lv00+rv01)); tree[x].v10=max(lv10+rv10,max(lv11+rv00,lv10+rv00)); tree[x].v11=max(lv10+rv01,max(lv11+rv01,lv10+rv11));}inline void build(int x,int l,int r){ if (l==r){tree[x].v11=read();return;} int mid=l+r>>1;build(lc,l,mid);build(rc,mid+1,r); update(x);}inline void modify(int x,int l,int r,int p,int v){ if (l==r){tree[x].v11=v;return;}int mid=l+r>>1; if(p<=mid) modify(lc,l,mid,p,v);else modify(rc,mid+1,r,p,v); update(x);}int n,m;int main(){ freopen("bzoj4094.in","r",stdin); n=read();m=read(); build(1,1,n);long long ans=0; for (int i=1;i<=m;++i){static int x,v; x=read();v=read();modify(1,1,n,x,v); ans+=max(max(tree[1].v01,tree[1].v10),max(tree[1].v00,tree[1].v11)); }printf("%lld\n",ans); return 0;}

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:bzoj3998 [TJOI2015]弦论
下一篇:bzoj4259 残缺的字符串
相关文章

 发表评论

暂时没有评论,来抢沙发吧~