设a[i]为当前方案中第 1..i 天变质的蔬菜有几个,b[i]为前i天至少能卖出几个,方案可行的条件是对任意i有a[i]<=b[i],用线段树维护b[i]-a[i]。

从小到大枚举天数,枚举到第w天时,对所有u>=w,b[u]+=m,表示第w天从可以卖0个变为m个

选一个蔬菜,在第w天变质,则相当于对所有u>=w,a[u]+=1,因此必须保证w在b[i]-a[i]的最右一个零点的右侧

对每种蔬菜都贪心先取变质时间晚的,用另一颗线段树维护变质时间>=w的最大价值,每次贪心选可行的价值最大的一个更新答案

可以构造一个等价的费用流模型,从而证明贪心的正确性

#include<bits/stdc++.h>
const int N=1e5+;
typedef long long i64;
char ib[N*],*ip=ib,ob[N*],*op=ob;
int _(){
int x=;
while(*ip<)++ip;
while(*ip>)x=x*+*ip++-;
return x;
}
void pr(i64 x){
int ss[],sp=;
do ss[++sp]=x%+;while(x/=);
while(sp)*op++=ss[sp--];
*op++=;
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int n,m,qp;
i64 as[N],ans=;
int qs[N],md=;
struct item{
int a,s,c,x;
void R(){
a=_(),s=_(),c=_(),x=_();
a+=s;
}
void ins();
void dec(){
ans+=a;
--c;
if(s)a-=s,s=;
}
int tm(){
if(!x)return md;
return min(md,(c+x-)/x);
}
bool operator<(const item&i)const{return a>i.a;}
}is[N];
std::multiset<item>st[N];
int tr[<<|],mx=;
void up(int x){
tr[mx+x]=st[x].size()?st[x].begin()->a:;
for(x=mx+x>>;x;x>>=)tr[x]=max(tr[x<<],tr[x<<^]);
}
void item::ins(){
if(c<=)return;
int x=tm();
st[x].insert(*this);
up(x);
}
void maxs(int&a,int b){if(a<b)a=b;}
void mins(int&a,int b){if(a>b)a=b;}
int _l,_a;
struct node{
node*lc,*rc;
int L,R,M;
int v,a,p;
void add(int x){
v+=x,a+=x;
}
void add(){
if(_l<=L)return add(_a);
dn();
if(_l<=M)lc->add();
rc->add();
up();
}
void dn(){
if(a){
lc->add(a);
rc->add(a);
a=;
}
}
void up(){
v=rc->v,p=rc->p;
if(lc->v<v)v=lc->v,p=lc->p;
}
}ns[N*],*np=ns,*rt;
node*build(int L,int R){
node*w=np++;
w->L=L,w->R=R;
w->p=R;
if(L<R){
int M=w->M=L+R>>;
w->lc=build(L,M);
w->rc=build(M+,R);
}
return w;
}
bool chk(int pos){
int mw=;
for(int w=mx+pos-;w;w>>=)if((~w&)&&tr[w+]>tr[mw])mw=w+;
if(!mw)return ;
for(;mw<mx;mw<<=,mw+=(tr[mw]<tr[mw+]));
mw-=mx;
item i=*st[mw].begin();
st[mw].erase(st[mw].begin());up(mw);
i.dec();
i.ins();
_l=mw,_a=-,rt->add();
return ;
}
int main(){
fread(ib,,sizeof(ib),stdin);
n=_();m=_();qp=_();
for(int i=;i<n;++i)is[i].R();
for(int i=;i<qp;++i)maxs(md,qs[i]=_());
rt=build(,md);
for(mx=;mx<=md+;mx<<=);
for(int i=;i<n;++i)is[i].ins();
for(int i=;i<=md;++i){
_l=i,_a=m,rt->add();
while(){
int pos=rt->v?:rt->p+;
if(pos>n||!chk(pos))break;
}
as[i]=ans;
}
for(int i=;i<qp;++i)pr(as[qs[i]]);
fwrite(ob,,op-ob,stdout);
return ;
}

noi2017 day2t2的更多相关文章

  1. NOIP 2012 Day2T2 借教室题解

    NOIP 2012 Day2T2 借教室题解 题目传送门:http://codevs.cn/problem/1217/ 题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动 ...

  2. LOJ_2305_「NOI2017」游戏 _2-sat

    LOJ_2305_「NOI2017」游戏 _2-sat 题意: 给你一个长度为n的字符串S,其中第i个字符为a表示第i个地图只能用B,C两种赛车,为b表示第i个地图只能用A,C两种赛车,为c表示第i个 ...

  3. [NOI2017]蔬菜

    [NOI2017]蔬菜 题目描述 大意就是有\(n\)种物品,第\(i\)个物品有\(c_i\)个,单价是\(a_i\).然后每天你可以卖出最多\(m\)个物品.每天结束后第\(i\)种物品会减少\( ...

  4. BZOJ4946[Noi2017]蔬菜——线段树+堆+模拟费用流

    题目链接: [Noi2017]蔬菜 题目大意:有$n$种蔬菜,每种蔬菜有$c_{i}$个,每种蔬菜每天有$x_{i}$个单位会坏掉(准确来说每天每种蔬菜坏掉的量是$x_{i}-$当天这种蔬菜卖出量), ...

  5. [NOI2017]游戏(2-SAT)

    这是约半年前写的题解了,就搬过来吧 感觉这是NOI2017最水的一题(当然我还是不会2333),因为是一道裸的2-SAT.我就是看着这道题学的2-SAT 算法一:暴力枚举.对于abc二进制枚举,对于x ...

  6. 【BZOJ4946】[NOI2017]蔬菜(贪心)

    [BZOJ4946][NOI2017]蔬菜(贪心) 题面 BZOJ 洛谷 UOJ 题解 忽然发现今年\(NOI\)之前的时候切往年\(NOI\)的题目,就\(2017\)年的根本不知道怎么下手(一定是 ...

  7. [NOI2017]泳池——概率DP+线性递推

    [NOI2017]泳池 实在没有思路啊~~~ luogu题解 1.差分,转化成至多k的概率减去至多k-1的概率.这样就不用记录“有没有出现k”这个信息了 2.n是1e9,感觉要递推然后利用数列的加速技 ...

  8. bzoj4946: [Noi2017]蔬菜 神烦贪心

    题目链接 bzoj4946: [Noi2017]蔬菜 题解 挺神的贪心 把第次买的蔬菜拆出来,记下每种蔬菜到期的日期,填第一单位蔬菜比其他的要晚 按价格排序后,贪心的往前面可以填的位置填就可以了.找可 ...

  9. NOI2017 游记

    成功在NOI2017退役……现在的我已经是一只退役狗了 结果也一直到了退役,我都还不会半平面交,不会单纯形,不会非旋转版Treap…… FWT我也不熟,分治FFT我也只写过一道板子题 但是现在已经退役 ...

随机推荐

  1. 20155208 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155208 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验内容及步骤 (一)使用JDK编译.运行简单的java程序 命令行下的程序开发 打开windows下的 ...

  2. 2018.4.23 深入理解java虚拟机(转)

    深入理解java虚拟机 精华总结(面试) 一.运行时数据区域 Java虚拟机管理的内存包括几个运行时数据内存:方法区.虚拟机栈.本地方法栈.堆.程序计数器,其中方法区和堆是由线程共享的数据区,其他几个 ...

  3. Cloth

    https://www.youtube.com/watch?v=2zd1AI198I8Blender Tutorial For Beginners: Cloth Napkin 建模, 1透明玻璃杯, ...

  4. linux后台运行之&和nohup区别,模拟后台守护进程

    先来看一下&的使用 root@BP:~# cat test.sh #!/bin/bash while true do echo "linux">/dev/null d ...

  5. scanf() gets() fgets()使用注意事项

    1.scanf() 遇到'\n'停止从输入缓冲区中接收,接收完后‘\n’还存在于缓冲区中.当输入的字符数少于缓冲区大小时,字符后面有自动补上‘\0’,当输入字符大于缓冲区时,也直接拷贝到缓冲中,因此缓 ...

  6. solr 5.0.0 bin/start脚本详细解析

    参考文档:https://cwiki.apache.org/confluence/display/solr/Solr+Start+Script+Reference#SolrStartScriptRef ...

  7. 几张简单的terraform flow 图——可以快速了解terraform的使用

    以下是一个简单额terraform flow 我们快速的了解terraform 的使用,基于流程 参考图 参考架构 简单使用流程 说明 从上图我们可以看出terraform 的使用 tf 内容编写 定 ...

  8. java文件夹相关操作 演示样例代码

    java文件夹相关操作 演示样例代码 package org.rui.io; import java.io.File; import java.io.FilenameFilter; import ja ...

  9. S老师 C#编程数据结构篇 学习

    直接插入排序                                                       冒泡排序 简单选择排序 线性表: using System; using Sy ...

  10. resolve和reject不会终结Promise的参数函数的执行