题目背景

Salamander见到路边有如此多的毒瘤,于是见猎心喜,从家里拿来了一个大袋子,准备将一些毒瘤带回家。

题目描述

路边共有nn 种不同的毒瘤,第i 种毒瘤有k_i 个,每个需要占据d_i 的空间。Salamander的袋子能装下的最大体积为m 。

Salamander是一个很贪心的人,不过他也不要求带尽可能多或是总体积尽可能大的毒瘤回家,他只要求袋子里再也装不下剩余的任何一种毒瘤。

Salamander想知道有多少种不同的装毒瘤的方案。两种方案不同当且仅当取的毒瘤种类不同或者至少有一种毒瘤取的数量不同。由于方案数可能太多,请输出答案对19260817 取模后的结果。

输入输出格式

输入格式:

第一行包括两个正整数nn 、mm ,表示毒瘤的种类数和袋子的大小。

接下来的nn 行,每行两个正整数k_i​ 、d_i​ ,表示一种毒瘤。

输出格式:

一行,表示不同的方案数对19260817 取模后的结果。

输入输出样例

输入样例#1:

2 5
2 3
3 1
输出样例#1:

2

说明

样例解释:

两种方案如下:

1.取1个第一种毒瘤和2个第二种毒瘤。

2.取3个第二种毒瘤。

~  ~

对于10%的数据,1\leq n,k_i,d_i\leq 101≤n,ki​,di​≤10 ,1\leq m\leq 1001≤m≤100 ;

对于30%的数据,1\leq n,k_i,d_i\leq 501≤n,ki​,di​≤50 ,1\leq m\leq 50001≤m≤5000 ;

对于另外20%的数据,k_i=1ki​=1 ;

对于100%的数据,1\leq n,k_i,d_i\leq 5001≤n,ki​,di​≤500 ,1\leq m\leq 10^5。

多重背包的一个烂大街的优化就是单调队列,这个没啥好说的。。

本题可以枚举剩的最小的体积是哪个背包,一旦最小的确定了那么对答案有贡献的dp数组的坐标范围就确定了。

所以我们把物品按体积降序排序之后依次加入然后更新答案即可。。

(我当然不会告诉你这个题坑特别多)

#include<bits/stdc++.h>
#define ll long long
#define maxn 100005
using namespace std;
const int ha=19260817;
int f[2][maxn],n,m;
int V,tot,sum;
struct node{
int v,num;
bool operator <(const node &u)const{
return v<u.v;
}
}a[505];
int ans=0; inline int add(int x,int y){
x+=y;
if(x>=ha) x-=ha;
return x;
} inline int X(int x,int y){
x-=y;
if(x<0) x+=ha;
return x;
} int main(){
scanf("%d%d",&n,&V);
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].num,&a[i].v);
tot+=a[i].num*a[i].v;
}
sort(a+1,a+n+1); if(tot<=V){
puts("1");
return 0;
} f[0][0]=1;
int now=0,pre;
for(int i=n;i;i--){
tot-=a[i].num*a[i].v;
pre=now,now^=1; int base=a[i].v,len=base*a[i].num; for(int j=0;j<base;j++){
sum=0;
for(int u=j;u<=V;u+=base){
sum=add(sum,f[pre][u]);
if(u-j>=len) sum=X(sum,f[pre][u-len]);
f[now][u]=sum;
}
} int tp=V-tot;
for(int j=max(0,tp-a[i].v+1);j<=tp;j++) ans=add(ans,f[now][j]);
for(int j=len;j<=V;j++) f[now][j]=add(f[now][j],f[pre][j-len]);
} printf("%d\n",ans);
return 0;
}

  

洛谷 U19159 采摘毒瘤的更多相关文章

  1. 洛谷P4241 采摘毒瘤

    传送门 完了我连背包都不会了…… 考虑暴力,先枚举最小的数是哪个,设大小为$d_i$,个数为$k_i$,所有比它小的数的总和是$sum$,然后把所有比它小的全都装进背包,它以及比他大的做一个多重背包, ...

  2. 洛谷 P4240 - 毒瘤之神的考验(数论+复杂度平衡)

    洛谷题面传送门 先扯些别的. 2021 年 7 月的某一天,我和 ycx 对话: tzc:你做过哪些名字里带"毒瘤"的题目,我做过一道名副其实的毒瘤题就叫毒瘤,是个虚树+dp yc ...

  3. 洛谷P4240 毒瘤之神的考验 【莫比乌斯反演 + 分块打表】

    题目链接 洛谷P4240 题解 式子不难推,分块打表真的没想到 首先考虑如何拆开\(\varphi(ij)\) 考虑公式 \[\varphi(ij) = ij\prod\limits_{p | ij} ...

  4. 洛谷P2179 骑行川藏

    什么毒瘤... 解:n = 1的,发现就是一个二次函数,解出来一个v的取值范围,选最大的即可. n = 2的,猜测可以三分.于是先二分给第一段路多少能量,然后用上面的方法求第二段路的最短时间.注意剩余 ...

  5. 洛谷模拟NOIP考试反思

    洛谷模拟NOIP考试反思 想法 考了这么简单的试qwq然而依然emmmmmm成绩不好 虽然本次难度应该是大于正常PJ难度的但还是很不理想,离预估分数差很多qwq 于是就有了本反思嘤嘤嘤 比赛链接 原比 ...

  6. [洛谷日报第62期]Splay简易教程 (转载)

    本文发布于洛谷日报,特约作者:tiger0132 原地址 分割线下为copy的内容 [洛谷日报第62期]Splay简易教程 洛谷科技 18-10-0223:31 简介 二叉排序树(Binary Sor ...

  7. 洛谷P4689 [Ynoi2016]这是我自己的发明(莫队,树的dfn序,map,容斥原理)

    洛谷题目传送门 具体思路看别的题解吧.这里只提两个可能对常数和代码长度有优化的处理方法. I 把一个询问拆成\(9\)个甚至\(16\)个莫队询问实在是有点珂怕. 发现询问的一边要么是一个区间,要么是 ...

  8. 洛谷P4581 [BJOI2014]想法(玄学算法,拓扑排序)

    洛谷题目传送门 萝卜大毒瘤 题意可以简化成这样:给一个DAG,求每个点能够从多少个入度为\(0\)的点到达(记为\(k\)). 一个随机做法:给每个入度为\(0\)的点随机一个权值,在DAG上求出每个 ...

  9. 洛谷P4891 序列(势能线段树)

    洛谷题目传送门 闲话 考场上一眼看出这是个毒瘤线段树准备杠题,发现实在太难调了,被各路神犇虐哭qwq 考后看到各种优雅的暴力AC......宝宝心里苦qwq 思路分析 题面里面是一堆乱七八糟的限制和性 ...

随机推荐

  1. java 继承小结

    [code=java] //多态的经典例子 //向上转型后,父类只能调用子类和父类的共同方法和的重写方法(方法名相同,参数也相同),不能调用重载方法(方法名相同,但参数不同) class A { pu ...

  2. elk-filebeat收集docker容器日志

    目录 使用docker搭建elk filebeat安装与配置 docker容器设置 参考文章 首发地址 使用docker搭建elk 1.使用docker-compose文件构建elk.文件如下: ve ...

  3. 使用cloudbase-init初始化windows虚拟机

    CloudBase-init简介 cloudbase-init 是 Windows 和其他系统的云初始化程序,可以设置主机名.创建用户.设置静态ip.设置密码等.对应的linux初始化程序是cloud ...

  4. cloud.cfg_for_ubuntu

    user: default disable_root: false preserve_hostname: false cloud_init_modules: - bootcmd - resizefs ...

  5. 2 28TOP100

    import json import requests from requests.exceptions import RequestException import re import time d ...

  6. HDU 4027 Can you answer these queries(线段树 + 观察 )

    这题主要考察观察能力. 2^63最多只需要开7次根号就会变成1,当数字变成1之后就不需要再对其进行操作. 对于含有大于1数字的区间,向下更新. 对于数字全为1的区间,直接返回. #include &l ...

  7. html页面分块加载

    方法:jQuery ajax - load() 方法 这个方法可以请求html页面,并把结果放在指定元素内.

  8. Vue.js特性

    1. MVVM模式 M:model,业务模型,用处:处理数据和提供数据. V:view,用户界面.用户视图. 业务模型model中的数据发生改变时,用户视图view也随之变化. 用户视图view改变的 ...

  9. 获取JNDI数据源

    1 在容器中配置数据源 Tomcat <?xml version="1.0" encoding="UTF-8"?> <Context> ...

  10. [THUWC2017][bzoj5020] 在美妙的数学王国中畅游 [LCT+泰勒展开]

    题面 LOJ传送门 思路 这里很重要 它提示我们,把给定的三个函数泰勒展开,并用LCT维护每一项泰勒展开式的值,维护十几项就满足了题目的精度要求 我们考虑一个函数在0位置的泰勒展开 $f(x)=\su ...