【LOJ】#2306. 「NOI2017」蔬菜
题解
从后往前递推
如果我们知道了第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」蔬菜的更多相关文章
- *LOJ#2306. 「NOI2017」蔬菜
$n \leq 100000$种蔬菜,每个蔬菜有:一单位价格:卖第一单位时额外价格:总量:每天腐烂量.每天能卖$m \leq 10$单位蔬菜,多次询问:前$k \leq 100000$天最多收入多少. ...
- 「NOI2017」蔬菜 解题报告
「NOI2017」蔬菜 首先考虑流 可以从 \(s\) 流入表示得到蔬菜,流出到 \(t\) 表示卖出蔬菜,给每个蔬菜拆点,并给它它每天应得的蔬菜. 但是我们没办法直接给,注意到如果把变质看成得到并可 ...
- loj #2305. 「NOI2017」游戏
#2305. 「NOI2017」游戏 题目描述 小 L 计划进行 nnn 场游戏,每场游戏使用一张地图,小 L 会选择一辆车在该地图上完成游戏. 小 L 的赛车有三辆,分别用大写字母 AAA.BBB. ...
- loj#2305. 「NOI2017」游戏 2-sat
链接 https://loj.ac/problem/2305 https://www.luogu.org/problemnew/show/P3825 思路 3-sat神马的就不要想了,NP问题 除去x ...
- LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推
题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...
- LOJ 2303 「NOI2017」蚯蚓排队——链表+哈希表
题目:https://loj.ac/problem/2303 想到合并的时候可以只考虑接口附近的50个,但不太会分析复杂度,而且没有清楚地想到用哈希值对应个数. 看了题解才会…… 一直想用 splay ...
- LOJ 2302 「NOI2017」整数——压位线段树
题目:https://loj.ac/problem/2302 压30位,a最多落在两个位置上,拆成两次操作. 该位置加了 a 之后,如果要进位或者借位,查询一下连续一段 0 / 1 ,修改掉,再在含有 ...
- LOJ#2307. 「NOI2017」分身术
$n \leq 100000$个点,$m \leq 100000$次询问,每次问删掉一些点后的凸包面积. 不会啦写个20暴力,其实是可以写到50的.当个计算几何板子练习. //#include< ...
- LOJ#2304. 「NOI2017」泳池
$n \leq 1e9$底边长的泳池,好懒啊泥萌自己看题吧,$k \leq 1000$.答案对998244353取膜. 现在令$P$为安全,$Q$为危险的概率.刚好$K$是极其不好算的,于是来算$\l ...
随机推荐
- python---CMDB配置管理数据库
前戏:项目目的 是一个运维自动化管理项目: 为了减少人工干预,降低人员成本 ---资产管理 --操作管理 避免人员直接操作服务器,使用后台去统一操作 一:实现方式 (一)Agent基于shell命令实 ...
- MySQL学习(一)——Java连接MySql数据库
MySQL学习(一)——Java连接MySql数据库 API详解: 获得语句执行 String sql = "Insert into category(cid, cname) values( ...
- springboot 以jar方式在linux后台运行
linux命令如下: nohup java -jar 自己的springboot项目.jar >日志文件名.log 2>&1 & 命令解释: nohup:不挂断地运行命令, ...
- php设计模式-工厂设计模式
概念: 工厂设计模式提供获取某个对象的新实例的一个接口,同时使调用代码避免确定实际实例化基类步骤. 很多高级模式都是依赖于工厂模式.
- [整理]VS2010中如何添加“依赖","库目录","包含目录"
VS2010中如何添加“依赖","库目录","包含目录" 1. 添加编译所需要(依赖)的 lib 文件[解决方案资源管理器]“项目->属性-&g ...
- jQuery中下拉框select的操作方法详解
最近在写页面的时候常常遇到要动态增删改下拉框select的情况,由于我比较习惯用jquery框架来架构我的前端js,所以就顺便把各种jquery操作下拉框select的方法总结了一下,收藏起来以便下次 ...
- 【AtCoder Grand Contest 007E】Shik and Travel [Dfs][二分答案]
Shik and Travel Time Limit: 50 Sec Memory Limit: 512 MB Description 给定一棵n个点的树,保证一个点出度为2/0. 遍历一遍,要求每 ...
- 24、List三个子类的特点
List的三个子类的特点 因为三个类都实现了List接口,所以里面的方法都差不多,那这三个类都有什么特点呢? ArrayList:底层数据结构是数组,查询快,增删慢.线程不安全,效率高. Vector ...
- Linux基础-sed+正则表达式
1,删除文件每行的第一个字符:sed -r 's/^.//g' passwd 2,删除文件每行的第二个字符:sed -r 's/^(.)(.)/\2/g' passwd 3,删除文件每行的最后一个字符 ...
- Linux基础-网络配置
任务目标:临时配置网络ip,网关,DNS,然后重启network:写配置文件永久保存网络配置 临时配置ens33网卡IP地址为192.168.30.99,查看更改完的ifconfig信息: 重新启动n ...