首页 > 其他分享 >LOJ6039 「雅礼集训 2017 Day5」珠宝

LOJ6039 「雅礼集训 2017 Day5」珠宝

时间:2023-12-07 18:55:05浏览次数:39  
标签:typedef int Day5 mid long 雅礼 maxn LOJ6039 define

LOJ 传送门

显然枚举物品做背包没有前途,于是我们把体积相等的物品捆绑在一起。

设 \(f_{i, j}\) 为考虑完体积 \(\in [1, i]\) 的物品,背包容量为 \(j\) 的最大值。可以贪心求出 \(g_{i, j}\) 为选 \(j\) 个体积为 \(i\) 的物品的价值最大值。

分 \(j \bmod i\) 的余数转移,发现可以决策单调性,然后就 \(O(k c_i \log k)\) 做完了。?

code
// Problem: #6039. 「雅礼集训 2017 Day5」珠宝 /「NAIPC2016」Jewel Thief
// Contest: LibreOJ
// URL: https://loj.ac/p/6039
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)

#include <bits/stdc++.h>
#define pb emplace_back
#define fst first
#define scd second
#define mkp make_pair
#define mems(a, x) memset((a), (x), sizeof(a))

using namespace std;
typedef long long ll;
typedef double db;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;

const int maxn = 50050;

ll n, m, f[310][maxn], g[maxn], h[maxn], K;
vector<ll> a[maxn], b[maxn];

void dfs(int l, int r, int pl, int pr, int k) {
	if (l > r || pl > pr) {
		return;
	}
	int mid = (l + r) >> 1, p = -1;
	for (int i = max(pl, mid - (int)a[k].size()); i <= min(mid, pr); ++i) {
		ll val = g[i] + b[k][mid - i];
		if (val > h[mid]) {
			h[mid] = val;
			p = i;
		}
	}
	dfs(l, mid, pl, p, k);
	dfs(mid + 1, r, p, pr, k);
}

void solve() {
	scanf("%lld%lld", &n, &m);
	for (int _ = 0, x, y; _ < n; ++_) {
		scanf("%d%d", &x, &y);
		a[x].pb(y);
	}
	for (int i = 1; i <= 300; ++i) {
		sort(a[i].begin(), a[i].end(), greater<ll>());
		ll s = 0;
		b[i].pb(0);
		for (ll x : a[i]) {
			s += x;
			b[i].pb(s);
		}
	}
	for (int i = 1; i <= 300; ++i) {
		for (int j = 0; j < i; ++j) {
			K = 0;
			for (int k = j; k <= m; k += i) {
				g[++K] = f[i - 1][k];
				h[K] = -1e18;
			}
			dfs(1, K, 1, K, i);
			for (int k = j, t = 1; k <= m; k += i, ++t) {
				f[i][k] = h[t];
			}
		}
	}
	for (int i = 1; i <= m; ++i) {
		printf("%lld ", f[300][i]);
	}
}

int main() {
	int T = 1;
	// scanf("%d", &T);
	while (T--) {
		solve();
	}
	return 0;
}

标签:typedef,int,Day5,mid,long,雅礼,maxn,LOJ6039,define
From: https://www.cnblogs.com/zltzlt-blog/p/17883712.html

相关文章

  • day5代码随想录
    哈希表理论基础;242.有效的字母异位词349.两个数组的交集202.快乐数1.两数之和来源:代码随想录(programmercarl.com)​6.2哈希冲突-Hello算法(hello-algo.com)1哈希表理论基础又称散列表一般哈希表都是用来快速判断一个元素是否出现集合里。当我们遇到了......
  • Leetcode刷题day5-哈希表.异位词.交集.快乐数.两数和
    242.有效的字母异位词242.有效的字母异位词-力扣(LeetCode)给定两个字符串 _s_ 和 _t_ ,编写一个函数来判断 _t_ 是否是 _s_ 的字母异位词。注意:若 _s_ 和 _t_ 中每个字符出现的次数都相同,则称 _s_ 和 _t_ 互为字母异位词。示例 1:输入:s="anagram",......
  • day5
    day5black-java学习二维数组格式1数据类型[][]变量名=new数据类型[m][n]m表示这个二维数组有多少个一维数组n表示每一个一维数组的元素个数举例:int[][]arr=newint[3][2];定义了一个二维数组arr这个二维数组有3个一维数组,名称是arr[],arr[1],arr......
  • 雅礼信奥 2023.11.22 习题课记录(讲解版)
    雅礼信奥\(2023.11.22\)习题课记录(讲解版)都是CF题,不如AT。剧情版后面会更。A-YarikandArray(CF1899C)dp题,作为学OI\(3\)年的萌新OIer,后面才想到dp真是太蒟蒻了,时间复杂度\(O(tn)\)。初始\(f_1=1\),其他为\(0\)。状态转移方程:\(\begin{cases}\text{if}&......
  • Day59 | 力扣695:岛屿的最大面积
    力扣链接写在前面这道题和200.岛屿数量很像,只不过200.岛屿数量是求岛屿总个数,这道题是求最大的岛屿面积,基本代码逻辑是一样的,只不过具体处理细节有一点不一样思路在主函数maxAreaOfIsland中遍历,遇到岛屿temp就计数为1,然后进入dfs函数,每次遍历到一个岛屿,temp就加1,用变量tem......
  • DataWhale DAY5 条件语句
    DataWhaleDAY5条件语句本次学习python中的条件语句。语法博客:https://www.cnblogs.com/hewo/p/17635277.html注意点位:1.减少炫技般的使用特殊方法的判断,从理解方面简化你的代码,对于python,没有必要时不用使用奇技淫巧优化。对于true/false和0/1:​ 首先,bool是int的......
  • Day5
    变量定义就是可以改变的量。变量相当于一个空间位置,位置是定的,而位置内存放的数据是可以改变的Java变量是程序中最基本的存储单元,其中包括变量名,数据类型(Java是强类型语言,必须声明变量的数据类型,可以是基本数据类型也可以是引用类型)和作用域数据类型变量名=值;每......
  • 23 年牛客提高组模拟赛 Day5 T3
    给你一个长为\(n\)的数组\(b_i\)表示原数组\(a_i\)中以\(i\)结尾的LIS长度,问对于所有\(1\leqa_i\leqm\),原数组有多少种不同的可能\(n\leq20,m\leq3000\)看到数据范围容易想到状压dp,赛事想了个比较朴素的dp:设\(dp_{S,i}\)表示填了集合\(S\)的数,其......
  • python_day5 对象
    对象设计类(class):classStudent:name=None创建对象stu_1=Student()对象属性赋值stu_1.name="周杰伦"类的定义和使用class类名称:class是关键字,表示要定义类了类的属性:定义在类中的变量类的行为:即定义在类中的函数创建类对象的语法:对象=类名......
  • 加训日记 Day5——codeforces round 899 再战div2
    Day5,9.25,codeforcesround899div2  ·事实证明自己的思维和手速都还不够快,晚上还晚来了一点  ·B题属实是,上来就想着并查集(菜鸡是这样的)然后发现不会写捏  ·思考了很久(看数据量)感觉是枚举暴力,但是又想不到怎么去枚举  ·一题遗憾离场  ·顺理成章的-26......