*LOJ#2306. 「NOI2017」蔬菜
$n \leq 100000$种蔬菜,每个蔬菜有:一单位价格;卖第一单位时额外价格;总量;每天腐烂量。每天能卖$m \leq 10$单位蔬菜,多次询问:前$k \leq 100000$天最多收入多少。价格、量$ \leq 1e9$。
我也不知道为啥88分QAQ 求大佬看看啊
把第一单位蔬菜和其他的拆开,记下他们“能卖的最后一天”,假设第一单位蔬菜比其他的要晚卖。这样,按价格排序后,只需要贪心地填入能填的最晚的一天就好了。找最晚的一天用并查集。这样就求出了天数不限时的答案。
要求有限天数内的答案,只需要从天数不限往前推,推的过程中把最便宜的那些丢掉就好了。(可以想象把多出来的空用贵的菜补上)
//#include<iostream>
#include<cstring>
#include<cstdio>
//#include<math.h>
//#include<set>
//#include<queue>
//#include<bitset>
//#include<vector>
#include<algorithm>
#include<stdlib.h>
using namespace std; #define LL long long
int qread()
{
char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
} //Pay attention to '-' , LL and double of qread!!!! int n,m,K;
#define maxn 200011
struct Node{int v,day,tot,c,id; bool operator < (const Node &b) const {return v>b.v;} }p[maxn]; int lp=; int dd[maxn],ufs[maxn];
int find(int x) {return x==ufs[x]?x:(ufs[x]=find(ufs[x]));}
void Union(int x,int y) {x=find(x); y=find(y); if (x!=y) ufs[x]=y;}
//zhu yi da de bing dao xiao de LL ans[maxn]; int list[maxn*],len=;
int main()
{
// freopen("in.txt","r",stdin);
n=qread(); m=qread(); K=qread();
for (int i=;i<=;i++) ufs[i]=i,dd[i]=m;
//我的t是他的c,我的c是他的x。。。。。
for (int i=,a,s,c,t;i<=n;i++)
{
a=qread(); s=qread(); t=qread(); c=qread();
//一种蔬菜拆两种
if (c)
{
p[++lp]=(Node){a+s,t/c+(t%c>),,,i};
if (t>) p[++lp]=(Node){a,(t-)/c+((t-)%c>),t-,c,i};
}
else
{
p[++lp]=(Node){a+s,-,,,i};
if (t>) p[++lp]=(Node){a,-,t-,c,i};
}
}
sort(p+,p++lp); //贪心放,每个蔬菜如果x>0就从“能放的最后一天”开始往前,不然就从100000开始往前放
LL Ans=; int TT=;
for (int i=;i<=lp;i++)
{
int v=p[i].v,day=p[i].day,tot=p[i].tot,c=p[i].c;
// cout<<day<<endl;
LL able=~day?(tot-(day-)*c):0x3f3f3f3f; int now=find(~day?min(day,):); //now 是哪一天,dd 是每天剩多少可以放, tot是这菜还剩多少,able是一个后缀最多放多少菜
//able就是原来总蔬菜量减掉前now-1天的腐烂量剩下的,随着now变小会变大,要排除掉后面已经放了的 while (tot && now)
{
// cout<<able<<' '<<now<<endl;
int can=min(min((LL)tot,able),(LL)dd[now]);
//can是在now这天能放的量
dd[now]-=can; Ans+=can*1ll*v;
if (dd[now]==) Union(now,now-);
int tn=find(now-); able+=1ll*c*(now-tn)-can; now=tn; tot-=can; TT+=can;
for (int j=;j<=can;j++) list[++len]=v;
//list是把真正选中的菜按价格递减放的,偷懒就直接开个大数组丢进去了
}
// cout<<i<<' '<<p[i].v<<' '<<tot<<' '<<p[i].id<<' '<<"ANS"<<Ans<<endl;
// for (int j=1;j<=20;j++) cout<<dd[j]<<' ';cout<<endl<<endl;
} //怀疑上面就错了,用菜总量<=10000的数据算100000天的答案是不对的 //往前推前面的答案
int tmp;
ans[tmp=TT/m+(TT%m>)]=Ans;
// cout<<"tmp"<<tmp<<' '<<"TT"<<TT<<endl;
for (int i=tmp+;i<=;i++) ans[i]=ans[i-];
ans[tmp-]=ans[tmp]; for (int i=TT;i>TT-((TT-)%m+);i--) ans[tmp-]-=list[len--];
for (int i=tmp-;i;i--)
{
ans[i-]=ans[i];
for (int j=;j<=m;j++) ans[i-]-=list[len--];
} for (int i=;i<=K;i++) printf("%lld\n",ans[qread()]);
return ;
}
*LOJ#2306. 「NOI2017」蔬菜的更多相关文章
- 【LOJ】#2306. 「NOI2017」蔬菜
题解 从后往前递推 如果我们知道了第i天的最优方案和第i天选择的蔬菜,加入第i天选择的蔬菜数量为S,我们只需要减去最小的S - (i - 1) * M 个蔬菜即可 所以我们只要求出最后一天的蔬菜选择 ...
- 「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 ...
随机推荐
- 1207: [HNOI2004]打鼹鼠
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4154 Solved: 1997[Submit][Status][Discuss] Descript ...
- 牛客NOIP普及组R1 C括号(dp)
题意 题目链接 Sol maya普及组的dp都要想很长时间,我真是越来越菜了qwq 设$f[i][j]$表示当前到第$i$个位置,剩下$j$个左括号没被匹配 转移的时候判断一下即可 /* */ #in ...
- HTTP 配置与编译安装
目录 HTTP 配置与编译安装 HTTP 相关配置 DSO 定义'Main' Server 的文档页面路径 定义站点主页面 站点访问控制常见机制 基于源地址实现访问控制 日志设定 设定默认字符集 定义 ...
- 大数据的存储——HBase、HIVE、MYSQL数据库学习笔记
HBase 1.hbase为查询而生,它通过组织机器的内存,提供一个超大的内存hash表,它需要组织自己的数据结构,表在hbase中是物理表,而不是逻辑表,搜索引擎用它来存储索引,以满足实时查询的需求 ...
- 常用的几个JQuery代码片段
1. 导航菜单背景切换效果 在项目的前端页面里,相对于其它的导航菜单,激活的导航菜单需要设置不同的背景.这种效果实现的方式有很多种,下面是使用JQuery实现的一种方式: //注意:代码需要修饰完善 ...
- Bomb HDU - 3555 (数位DP)
Bomb HDU - 3555 (数位DP) The counter-terrorists found a time bomb in the dust. But this time the terro ...
- 拓扑排序+不是字典序的优先级排列(POJ3687+HDU4857)
一.前言 在过去的一周里结束了CCSP的比赛,其中有一道题卡了我9个小时,各种调错都没法完整的调处来这题,于是痛下决心开始补题,这个是计划的一部分.事实上,基于错误的理解我写了若干发拓扑排序+字典序的 ...
- 源码级强力分析hadoop的RPC机制
分析对象: hadoop版本:hadoop 0.20.203.0 必备技术点: 1. 动态代理(参考 :http://weixiaolu.iteye.com/blog/1477774 )2. Java ...
- 搭建Data Mining环境(Spark版本)
前言:工欲善其事,必先利其器.倘若不懂得构建一套大数据挖掘环境,何来谈Data Mining!何来领悟“Data Mining Engineer”中的工程二字!也仅仅是在做数据分析相关的事罢了!此文来 ...
- Android Shader渲染器:BitmapShader图片渲染
public class BitmapShader extends Shader BitmapShader, Shader家族的 专门处理图片渲染的 构造方法: public BitmapShade ...