题解

从后往前递推

如果我们知道了第i天的最优方案和第i天选择的蔬菜,加入第i天选择的蔬菜数量为S,我们只需要减去最小的S - (i - 1) * M 个蔬菜即可

所以我们只要求出最后一天的蔬菜选择

我们把每个蔬菜拆成c - 1个价值为a和1个价值为a + s,从大到小排序,然后用并查集维护可以选择的位置

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
//#define ivorysi
#define MAXN 100005
#define eps 1e-7
#define mo 974711
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef double db;
const int P = 100000;
int N,M,K;
int num[MAXN];
int fa[MAXN];
struct node {
int x,val,c,t;
friend bool operator < (const node &a,const node &b) {
return a.val < b.val;
}
}veg[MAXN * 2];
int MK[MAXN * 10],tot = 0;
int64 ans[MAXN];
bool cmp(node a,node b) {
return b < a;
}
void Init() {
scanf("%d%d%d",&N,&M,&K);
int a,s,c,x;
for(int i = 1 ; i <= N ; ++i) {
scanf("%d%d%d%d",&a,&s,&c,&x);
if(x == 0) {
veg[i * 2 - 1] = (node){x,a,c - 1,P};
veg[i * 2] = (node){0,a + s,1,P};
}
else {
int t = (c - 1) / x + 1;
veg[i * 2 - 1] = (node){x,a,c - 1 - (t - 1)* x,t};
veg[i * 2] = (node){0,a + s,1,t};
}
}
sort(veg + 1,veg + 2 * N + 1,cmp);
}
int find_pos(int x) {
return fa[x] == x ? x : fa[x] = find_pos(fa[x]);
}
void Solve() {
for(int i = 1 ; i <= P + 1; ++i) fa[i] = i;
for(int i = 1 ; i <= 2 * N ; ++i) {
int s = find_pos(veg[i].t);
int used = 0;
while(s && used < veg[i].c + veg[i].x * (veg[i].t - 1)) {
int now = veg[i].c + veg[i].x * (veg[i].t - s);
now -= used;
while(now && num[s] < M) {
--now;++used;num[s]++;
MK[++tot] = veg[i].val;
}
if(num[s] == M) fa[s] = find_pos(s - 1);
s = find_pos(s - 1);
}
}
sort(MK + 1,MK + tot + 1);
for(int i = 1 ; i <= tot ; ++i) ans[P] += MK[i];
int poi = 1,S = 0;
for(int i = 1 ; i <= P ; ++i) S += num[i]; for(int i = P - 1 ; i >= 1 ; --i) {
ans[i] = ans[i + 1];
int del = max(S - i * M,0);
S -= del;
for(int j = poi ; j <= poi + del - 1; ++j) {
ans[i] -= MK[j];
}
poi += del;
}
int p;
for(int i = 1 ; i <= K ; ++i) {
scanf("%d",&p);
printf("%lld\n",ans[p]);
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
}

【LOJ】#2306. 「NOI2017」蔬菜的更多相关文章

  1. *LOJ#2306. 「NOI2017」蔬菜

    $n \leq 100000$种蔬菜,每个蔬菜有:一单位价格:卖第一单位时额外价格:总量:每天腐烂量.每天能卖$m \leq 10$单位蔬菜,多次询问:前$k \leq 100000$天最多收入多少. ...

  2. 「NOI2017」蔬菜 解题报告

    「NOI2017」蔬菜 首先考虑流 可以从 \(s\) 流入表示得到蔬菜,流出到 \(t\) 表示卖出蔬菜,给每个蔬菜拆点,并给它它每天应得的蔬菜. 但是我们没办法直接给,注意到如果把变质看成得到并可 ...

  3. loj #2305. 「NOI2017」游戏

    #2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...

  4. loj#2305. 「NOI2017」游戏 2-sat

    链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...

  5. LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推

    题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...

  6. LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表

    题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...

  7. LOJ 2302 「NOI2017」整数——压位线段树

    题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...

  8. LOJ#2307. 「NOI2017」分身术

    $n \leq 100000$个点,$m \leq 100000$次询问,每次问删掉一些点后的凸包面积. 不会啦写个20暴力,其实是可以写到50的.当个计算几何板子练习. //#include< ...

  9. LOJ#2304. 「NOI2017」泳池

    $n \leq 1e9$底边长的泳池,好懒啊泥萌自己看题吧,$k \leq 1000$.答案对998244353取膜. 现在令$P$为安全,$Q$为危险的概率.刚好$K$是极其不好算的,于是来算$\l ...

随机推荐

  1. Casting a Classifier into a Fully Convolutional Network将带全连接的网络做成全卷积网络

    详见:http://nbviewer.jupyter.org/github/BVLC/caffe/blob/master/examples/net_surgery.ipynb 假设使用标准的caffe ...

  2. 缓存失效策略(FIFO,LRU,LFU)

    当缓存需要被清理时(比如空间占用已经接近临界值了),需要使用某种淘汰算法来决定清理掉哪些数据.常用的淘汰算法有下面几种: 1. FIFO:First In First Out,先进先出.判断被存储的时 ...

  3. android listview使用自定义的adapter没有了OnItemClickListener事件解决办法

    在使用listview的时用使用自定义的adapter的时候,如果你的item布局中包含有Button,Checkable继承来的所有控件,那么你将无法获取listview的onItemClickLi ...

  4. const引用与非const引用

    void print1(int a) { cout<<a<<endl; } void print2(const int& a) { cout<<a<& ...

  5. clock()、time()、clock_gettime()和gettimeofday()函数的用法和区别

    1. clock_gettime( ) 提供了纳秒的精确度 int clock_gettime(clockid_t clk_id, struct timespect *tp); clockid_t c ...

  6. Vue.js学习笔记(一)

    其它前端主流框架可以做的事,Vue.js几乎都可以做, nuxt框架:可以实现vue的服务器端渲染, weex:使用vue语法编写原生app. 基础内容 基础语法 MVVM设计模式 前端组件化 vue ...

  7. Web客户端的几种存储方式

    1.Cookie 在H5之前,cookie是主要的存储方式.cookie可以兼容到包括ie6以上的所有浏览器. Cookie数据会带到请求头的cookie字段里面,每次同主域名的请求中,都会传递数据, ...

  8. windows10安装ipython jupyter

    环境: windows 10 x64 python2.7(已经安装好numpy scipy matplotlib) 过程: 首先安装visual c++ 9.0环境,去http://aka.ms/vc ...

  9. bzoj千题计划167:bzoj3527: [Zjoi2014]力

    http://www.lydsy.com/JudgeOnline/problem.php?id=3527 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi,求Ei.      以n=4为例: ...

  10. [问题]SqlServer创建数据库出错

    SqlServer 2008 “Msg 1807, Level 16, State 3, Line 1Could not obtain exclusive lock on database ‘mode ...