【CF500F】New Year Shopping

1|0题目


题目链接:https://codeforces.com/contest/500/problem/F
n 种商品,第 i 种商品的价格是 ci ,购买后可以增加 hi 的快乐指数,将于第 ti 天上市。商品的保质期为 p 天,过期后不能再购买,即第 i 种商品只能在第 ti 天到第 ti+p1 天之间购买,每种商品只能购买一次。
q 个询问,每次给定两个整数 a,b ,求在第 a 天去购物,最多使用 b 元的情况下可以得到的最大快乐指数。询问之间互不干扰。
n3×104q2×104,所有价格 3×104,所有时间和快乐指数 2×104

2|0思路


这道题似乎有很多做法,但是我只能想到卑微的 O(nqlogn)
因为所有物品持续的时间都是一样的,所以按照上架时间排序后,每次的询问就是把一段区间的物品拿出来做 01 背包。
也就是需要维护一个队列,然后在某一时刻查询队列内所有物品的 01 背包。
而一个队列可以用两个栈 s1,s2 来实现:插入物品就往 s2 插入;删除物品就在 s1 删除;当 s1 为空时,就把 s2 所有元素依次弹出插入 s1
然后维护两个栈中每一个元素到栈底的背包。按照时间离线询问,然后只需要合并一下两个栈栈顶的背包即可。
时间复杂度 O(nq)
实现上不需要真的开栈,维护区间 [l,mid] 为第一个栈的元素,[mid+1,r] 为第二个栈的元素即可。

3|0代码


#include <bits/stdc++.h> using namespace std; const int N=4010,M=20010; int n,p,Q,l,r,mid,f[N][N],ans[M]; struct node1 { int w,v,t; }a[N]; struct node2 { int m,t,id; }b[M]; bool cmp1(node1 x,node1 y) { return x.t<y.t; } bool cmp2(node2 x,node2 y) { return x.t<y.t; } void insert(int x,int *g,int *h) { memcpy(g,h,sizeof(f[0])); for (int i=4000;i>=a[x].w;i--) g[i]=max(g[i],g[i-a[x].w]+a[x].v); } int main() { scanf("%d%d",&n,&p); for (int i=1;i<=n;i++) scanf("%d%d%d",&a[i].w,&a[i].v,&a[i].t); scanf("%d",&Q); for (int i=1;i<=Q;i++) { scanf("%d%d",&b[i].t,&b[i].m); b[i].id=i; } sort(a+1,a+1+n,cmp1); sort(b+1,b+1+Q,cmp2); l=1; mid=r=0; for (int t=1,i=1;t<=20000;t++) { for (;r<n && a[r+1].t==t;r++) insert(r+1,f[r+1],f[(r==mid)?0:r]); while (l<=mid && a[l].t+p==t) l++; if (l>mid) { mid=r; for (int j=mid;j>=l;j--) insert(j,f[j],f[(j==mid)?0:j+1]); } for (;i<=Q && b[i].t==t;i++) for (int j=0;j<=b[i].m;j++) { int res1=(l<=mid) ? f[l][j] : 0; int res2=(mid<r) ? f[r][b[i].m-j] : 0; ans[b[i].id]=max(ans[b[i].id],res1+res2); } } for (int i=1;i<=Q;i++) printf("%d\n",ans[i]); return 0; }

__EOF__

本文作者stoorz
本文链接https://www.cnblogs.com/stoorz/p/15758574.html
关于博主:菜死了 /fad
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   stoorz  阅读(54)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-01-02 【UOJ#77】A+B Problem
点击右上角即可分享
微信分享提示