题目大意

  有n个物品,排成一个序列,每个物品有一个di表示取到i要走的距离,vi表示i的价值。

  给m组询问[l,r] ,c,sum,问由[l,r]的di<=c的物品能否凑出sum的价值(每个物品只能用一次)

解法

  首先说整体二分。

  有m个对于区间的查询[Li,Ri],考虑当前的二分区间[L,R],对于所有包含于[L,R]的区间无非

  是位于[L,mid]内,[mid+1,R]内和横跨mid三种情况。

  前两种情况下递归求解,只需要对于第三种情况求解即可。

  本题中,维护f(i,j)表示【用[i,mid]这些物品凑出j的价值所走的最长路】 的最小值

      而  g(i,j)表示【用[mid+1,i]这些物品凑出j的价值所走的最长路】 的最小值

  这样对于一个横跨mid的区间,只需要判断 min{ max{f(Li,j), g(Ri,sumi-j)} } 是否小于等于ci即可

 #include <iostream>
#include <cstdio>
#include <cstring> #define N 20010
#define M 100010
#define INF 0x7fffffff using namespace std; struct qs
{
int l,r,c,sum,ansv,id;
}a[M],a0[M],a1[M],b[M]; int n,m,v[N],d[N],ansv[M],f[N][],g[N][]; void dp(int l,int r)
{
int mid=(l+r)>>;
for(int i=;i<=;i++) g[mid+][i]=f[mid][i]=INF;
g[mid+][]=;
g[mid+][v[mid+]]=d[mid+];
for(int i=mid+;i<=r;i++)
{
for(int j=;j<=;j++) g[i][j]=g[i-][j];
for(int j=v[i];j<=;j++)
g[i][j] = min(g[i][j], max(g[i-][j-v[i]], d[i]));
}
f[mid][]=;
f[mid][v[mid]]=d[mid];
for(int i=mid-;i>=l;i--)
{
for(int j=;j<=;j++) f[i][j]=f[i+][j];
for(int j=v[i];j<=;j++)
f[i][j] = min(f[i][j], max(f[i+][j-v[i]], d[i]));
}
} void solve(int l,int r,int L,int R)
{
if(L>R) return;
if(l==r)
{
for(int i=L;i<=R;i++)
{
if(d[l]<=a[i].c && a[i].sum==v[l]) a[i].ansv=;
else a[i].ansv=;
}
return;
}
int mid=(l+r)>>;
int tot0=,tot1=,tot=;
for(int i=L;i<=R;i++)
{
if(a[i].r<=mid) a0[++tot0]=a[i];
else if(a[i].l>mid) a1[++tot1]=a[i];
else b[++tot]=a[i];
}
for(int i=;i<=tot0;i++) a[L+i-]=a0[i];
for(int i=;i<=tot1;i++) a[L+tot0+i-]=a1[i];
dp(l,r);
for(int i=;i<=tot;i++)
{
int tmp=INF;
for(int j=;j<=b[i].sum;j++)
{
int t=max(f[b[i].l][j], g[b[i].r][b[i].sum-j]);
tmp=min(tmp,t);
}
if(tmp<=b[i].c) b[i].ansv=;
else b[i].ansv=;
}
for(int i=;i<=tot;i++) a[L+tot0+tot1+i-]=b[i];
solve(l,mid,L,L+tot0-);
solve(mid+,r,L+tot0,L+tot0+tot1-);
} int main()
{
// freopen("test.txt","r",stdin);
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++) scanf("%d",&v[i]);
for(int i=;i<=n;i++) scanf("%d",&d[i]);
for(int i=;i<=m;i++)
{
scanf("%d%d%d%d",&a[i].l,&a[i].r,&a[i].c,&a[i].sum);
a[i].id=i;
}
solve(,n,,m);
for(int i=;i<=m;i++) ansv[a[i].id]=a[i].ansv;
for(int i=;i<=m;i++) putchar(ansv[i]? '':'');
putchar('\n');
}
}

整体二分 HDU - 5808的更多相关文章

  1. HDU - 5412 CRB and Queries (整体二分)

    题目链接 动态区间第k小,但是这道题的话用主席树+树状数组套线段树的空间复杂度是O(nlog2n)会爆掉. 另一种替代的方法是用树状数组套平衡树,空间复杂度降到了O(nlogn),但我感觉平衡树是个挺 ...

  2. hdu 5412 CRB and Queries(整体二分)

    题意 动态区间第k大 (n<=100000,m<=100000) 题解 整体二分的应用. 与静态相比差别不是很大.(和CDQ还有点像)所以直接上代码. #include<iostre ...

  3. CQD(陈丹琦)分治 & 整体二分——专题小结

    整体二分和CDQ分治 有一些问题很多时间都坑在斜率和凸壳上了么--感觉斜率和凸壳各种搞不懂-- 整体二分 整体二分的资料好像不是很多,我在网上找到了一篇不错的资料:       整体二分是个很神的东西 ...

  4. 算法笔记--CDQ分治 && 整体二分

    参考:https://www.luogu.org/blog/Owencodeisking/post-xue-xi-bi-ji-cdq-fen-zhi-hu-zheng-ti-er-fen 前置技能:树 ...

  5. 整体二分初探 两类区间第K大问题 poj2104 & hdu5412

    看到好多讲解都把整体二分和$CDQ$分治放到一起讲 不过自己目前还没学会$CDQ$分治 就单独谈谈整体二分好了 先推荐一下$XHR$的 <浅谈数据结构题的几个非经典解法> 整体二分在当中有 ...

  6. HDU5412 CRB and Queries 整体二分

    传送门 刚觉得最近写代码比较顺畅没什么Bug,cdq分治真是我的一个噩梦.. 整体二分模板题,带修改的区间第k小. vjudge不知抽什么风,用不了,hdu忘了密码了一直在那里各种试,难受.. 写得比 ...

  7. 整体二分QAQ

    POJ 2104 K-th Number 时空隧道 题意: 给出一个序列,每次查询区间第k小 分析: 整体二分入门题? 代码: #include<algorithm> #include&l ...

  8. BZOJ 3110 [Zjoi2013]K大数查询 ——整体二分

    [题目分析] 整体二分显而易见. 自己YY了一下用树状数组区间修改,区间查询的操作. 又因为一个字母调了一下午. 貌似树状数组并不需要清空,可以用一个指针来维护,可以少一个log 懒得写了. [代码] ...

  9. [bzoj1901][zoj2112][Dynamic Rankings] (整体二分+树状数组 or 动态开点线段树 or 主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

随机推荐

  1. for 循环进化史

    ECMAScript 6已经逐渐普及,经过二十多年的改进,很多功能也有了更成熟的语句,比如 for 循环 这篇博客将介绍一下从最初的 for 循环,到 ES6 的 for-of 等四种遍历方法 先定义 ...

  2. 使用Google浏览器做真机页面调试

    步骤1: 从Windows,Mac或Linux计算机远程调试Android设备上的实时内容.本教程将教您如何: 设置您的Android设备进行远程调试,并从开发机器中发现它.从您的开发机器检查和调试A ...

  3. Docker 基础底层架构浅谈

    docker学习过程中,免不了需要学习下docker的底层技术,今天我们来记录下docker的底层架构吧! 从上图我们可以看到,docker依赖于linux内核的三个基本技术:namespaces.C ...

  4. 使用java连接AD域,验证账号密码是否正确

    eb项目中有时候客户要求我们使用ad域进行身份确认,不再另外做一套用户管理系统.其实客户就是只要一套账号可以访问所有的OA,CRM等办公系统.这就是第三方验证.一般有AD域,Ldap,Radius,邮 ...

  5. BUPT复试专题—字符串转换(2013计院)

    题目描述 我们将仅由若干个同一小写字母构成的字符串称之为简单串,例如"aaaa"是一个简单串,而"abcd"则不是简单串.现在给你一个仅由小写字母组成的字符串, ...

  6. 使用Python控制1602液晶屏实时显示时间(附PyCharm远程调试)

    前言 原创文章,转载引用务必注明链接.水平有限,如有疏漏,欢迎指正. 本文介绍一下UP板的GPIO资源使用,以及一个使用Python演示一个简单的demo. 本文使用Markdown写成,为获得更好的 ...

  7. linux下查看网卡信息的命令

    rhel 内核版本号信息: [root@hvrhub ~]# uname -a Linux hvrhub 2.6.18-308.el5 #1 SMP Fri Jan 27 17:17:51 EST 2 ...

  8. Spring4+SpringMVC+Hibernate4整合入门与实例

    配置web.xml <? xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&q ...

  9. Xcode 技巧充电篇

    作为project师,我们最重要的事情就是熟悉我们每天使用的日常工具,但不能仅限于此.仅仅要有可能,我们应该试着掌握和定制能使我们更快.更轻松地实现终于目标的工具.以下是一些小提示和技巧,都是我在 X ...

  10. 浅谈MySQL压缩协议细节--从源码层面

    压缩协议属于mysql通讯协议的一部分,要启用压缩协议传输功能,前提条件客户端和服务端都必须要支持zlib算法,那么,现在有个问题,假如服务端已经默认开启压缩功能,那原生客户端在连接的时候要如何才可启 ...