P6240 好吃的题目

类似于线段树分治,在每个节点预处理[l,mid],[mid+1,r][l,mid],[mid+1,r][l,mid],[mid+1,r]的背包,然后询问即可

一般代码就类似下面的写法,但是此题有点卡空间于是稍微优化了一下空间。
时间复杂度O{nlog⁡nmax⁡(hi,ti)}O\{n\log n\max(h_i,t_i)\}O{nlognmax(hi​,ti​)}

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
constexpr int N=40010;
int n,m,q;
int v[N],w[N];
ll fl[N][205],fr[N][205];
int b[200010];
ll ans[200010];
struct node
{int l,r,t,id;
};
void solve(int l,int r,vector<node> &vec)
{if(l==r) {for(node a:vec)ans[a.id]=(v[l]<=a.t?w[l]:0);return;}vector<node> vl,vr;int mid=l+r>>1,idx=0;for(int i=0;i<vec.size();i++){if(vec[i].r<=mid) vl.push_back(vec[i]);else if(vec[i].l>mid)vr.push_back(vec[i]);else b[++idx]=i;}for(int i=l;i<=r;i++) for(int j=0;j<=m;j++)fl[i][j]=fr[i][j]=-1;for(int j=0;j<=m;j++)fl[mid+1][j]=fr[mid][j]=0;for(int i=mid;i>=l;i--)for(int j=0;j<=m;j++){fl[i][j]=fl[i+1][j];if(j>=v[i]) fl[i][j]=max(fl[i][j],fl[i+1][j-v[i]]+w[i]);}for(int i=mid+1;i<=r;i++)for(int j=0;j<=m;j++){fr[i][j]=fr[i-1][j];if(j>=v[i]) fr[i][j]=max(fr[i][j],fr[i-1][j-v[i]]+w[i]);}for(int i=1;i<=idx;i++){int l=vec[b[i]].l,r=vec[b[i]].r,t=vec[b[i]].t;ll res=-1;for(int j=0;j<=t;j++) res=max(res,fl[l][j]+fr[r][t-j]);ans[vec[b[i]].id]=res;}if(vl.size()) solve(l,mid,vl);if(vr.size()) solve(mid+1,r,vr);
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>q;for(int i=1;i<=n;i++) cin>>v[i];for(int i=1;i<=n;i++) cin>>w[i];vector<node> vec;for(int i=1;i<=q;i++){int l,r,t;cin>>l>>r>>t;m=max(m,t);vec.push_back((node){l,r,t,i});}solve(1,n,vec);for(int i=1;i<=q;i++) cout<<ans[i]<<'\n';return 0;
}

优化空间后代码

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
constexpr int N=40010;
int n,m,q;
int v[N],w[N];
ll f[N][205];
int b[200010];
ll ans[200010];
struct node
{int l,r,t,id;
};
void solve(int l,int r,vector<node> &vec)
{if(l==r) {for(node a:vec)ans[a.id]=(v[l]<=a.t?w[l]:0);return;}vector<node> vl,vr;int mid=l+r>>1,idx=0;for(int i=0;i<vec.size();i++){if(vec[i].r<=mid) vl.push_back(vec[i]);else if(vec[i].l>mid)vr.push_back(vec[i]);else b[++idx]=i;}for(int i=l;i<=r;i++){for(int j=0;j<=m;j++) f[i][j]=-1;if(i==mid||i==mid+1) for(int j=0;j<=m;j++) f[i][j]=(j>=v[i]?w[i]:0);}for(int i=mid-1;i>=l;i--)for(int j=0;j<=m;j++){f[i][j]=f[i+1][j];if(j>=v[i]) f[i][j]=max(f[i][j],f[i+1][j-v[i]]+w[i]);}for(int i=mid+2;i<=r;i++)for(int j=0;j<=m;j++){f[i][j]=f[i-1][j];if(j>=v[i]) f[i][j]=max(f[i][j],f[i-1][j-v[i]]+w[i]);}for(int i=1;i<=idx;i++){int l=vec[b[i]].l,r=vec[b[i]].r,t=vec[b[i]].t;ll res=-1;for(int j=0;j<=t;j++) res=max(res,f[l][j]+f[r][t-j]);ans[vec[b[i]].id]=res;}if(vl.size()) solve(l,mid,vl);if(vr.size()) solve(mid+1,r,vr);
}
int main()
{ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);cin>>n>>q;for(int i=1;i<=n;i++) cin>>v[i];for(int i=1;i<=n;i++) cin>>w[i];vector<node> vec;for(int i=1;i<=q;i++){int l,r,t;cin>>l>>r>>t;m=max(m,t);vec.push_back((node){l,r,t,i});}solve(1,n,vec);for(int i=1;i<=q;i++) cout<<ans[i]<<'\n';return 0;
}

P6240 好吃的题目(分治+背包)相关推荐

  1. [SPOJ - FTOUR2] Free tour II(点分治 + 背包dp + 启发式合并)

    SPOJ - FTOUR2 Free tour II problem 给定一棵树,以及 mmm 个拥挤城市编号,选择一条最多包含 kkk 个拥挤城市的简单路径. 每条边有一个有趣度 www,可正可负. ...

  2. 【题解】【LibreOJ Round #6】花团 LOJ 534 时间线段树分治 背包

    Prelude 题目链接:萌萌哒传送门(/≧▽≦)/ Solution 如果完全离线的话,可以直接用时间线段树分治来做,复杂度\(O(qv \log q)\). 现在在线了怎么办呢? 这其实是个假在线 ...

  3. 【215】第K个大的数,K相关题目-分治、堆应用

    1.从大到小第K个数  在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 ...

  4. 动态规划经典题目——0-1背包

    一.题目 有N件物品和一个容量为V的背包.第i件物品的重量是w[i],价值是v[i].求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大. 二.解题思路 动态规划解题思路可详见 ...

  5. 2287. 【POJ Challenge】消失之物(数组递推\分治优化背包)

    2287. [POJ Challenge]消失之物 这题的思想和P4564 [CTSC2018]假面优化的思想一样,应该反过来说,假面那个题应该是借鉴这题的思路. 显然不能枚举每个物品消失O(n)O( ...

  6. [背包DP] 洛谷相关题目整理与练习(74题-)

    题目 以背包为标签,搜出了这么多题,按难度排序,一道一道做: (*):下面有提到 TODO 题目 难度 备忘录 AC 采药 普及- 01背包模板 AC 开心的金明 普及- 01背包模板 AC 小A点菜 ...

  7. buct2018年程序设计实训作业一部分题目解答

    背包题请拉到最后 问题 A: 不同的数字(easy) 题目描述 对于一个长度为n的数组a_1,a_2,...,a_n 你将会得到m次询问,每次询问给出l,r,你需要计算出a_l,a_(l+1),... ...

  8. Cow Frisbee Team S(变相的01背包)

    题目描述 老唐最近迷上了飞盘,约翰想和他一起玩,于是打算从他家的 NN 头奶牛中选出一支队伍. 每只奶牛的能力为整数,第 i 头奶牛的能力为R_i .飞盘队的队员数量不能少于 1.大于N.一支队伍的总 ...

  9. 经典动态规划————背包九讲

    前言 本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为<解动态规划题的基本思考方式>.现在你看到 ...

最新文章

  1. 选择排序算法实现思想个人理解
  2. block,inline和inline-block概念和区别
  3. Eclipse利用Maven的插件部署web项目到远程tomcat服务器
  4. NSIS中判断.net framework 是否安装
  5. MIPI参数配置解释
  6. LeetCode 第 30 场双周赛(477/2545,前18.7%,第2次全部通过)
  7. 从零开始学网络|搞懂OSI参考模型和TCP/IP分层模型,看这篇文章就够了
  8. nginx 配置多个域名 指向不同服务_Nginx的几个常用配置和技巧
  9. ios 倒数器_如何使用倒数计时器来停止游戏 – iOS [SWIFT] –
  10. Layui 数据表格复杂表头
  11. Python安装Talib库
  12. Xmind 2022中文高效学习思维导图
  13. STM32F107VCT6开发板 CAN总线通信实验----发送和接收
  14. dx11 Shaders for maya
  15. 程序猿必看的10部黑客电影
  16. 第三代USRP 产品对比
  17. I/O——Spring cache abstraction
  18. DSPE-PEG10-Mal可以提供不同分子量的PEG衍生物
  19. php 设置斜体字体,斜体 - FontForge 教程 | BootWiki.com
  20. 【巨人的肩膀上制造世界】——5——Unity3D实用插件之Mouse Interaction-Object Highlight,快速构建模型的悬浮高亮!悬浮提示!悬浮动画!

热门文章

  1. 地线与接地螺丝_电气接地规范与接地的各项参数
  2. 抖音ai智能机器人挂机_电销秘诀 电销企业难以拒绝的AI智能电销机器人
  3. 每天一小时python官方文档学习(一)————python的简单介绍
  4. [Nginx]负载均衡和动静分离
  5. [JavaWeb-Tomcat]web服务器软件_Tomcat介绍
  6. [观察,找规律]算法题目训练
  7. 数据结构与算法--分治算法-最大子序列和问题
  8. java 左移 返回值_java左移右移运算符详解
  9. ueditor单图上传iframe跨域_UEditor单图上传(simpleupload)跨域问题解决方案
  10. 循环队列 队空、队满 条件