分治背包+单调队列优化。

但是为什么maxn要1w多?。。。不怎么懂。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cstdlib>
#define maxn 10050
#define maxs 1050
#define maxm 300500
using namespace std;
int n,x,y,z,m,ans[maxm],up[maxn],q[maxn],vals[maxn],l,r;
struct point
{
int l,r,v,w,c;
point (int l,int r,int v,int w,int c):l(l),r(r),v(v),w(w),c(c){}
};
vector <point> v;
vector <int> dp,linker[maxn],val[maxn];
int read()
{
int data=;char ch;
while (ch<'' || ch>'') ch=getchar();
while (ch>='' && ch<='')
{
data=data*+ch-'';
ch=getchar();
}
return data;
}
void insert(int x,int y,int v,int w,vector <int> & dp)
{
while ((l<=r) && (vals[r]<=dp[x]-y*w)) r--;
q[++r]=x;vals[r]=dp[x]-y*w;
}
void DC(int left,int right,vector <point> v,vector <int> dp)
{
int mid=left+right>>;
vector <point> x,y;
for (int i=;i<v.size();i++)
{
point now=v[i];
if ((now.l==left) && (now.r==right))
{
for (int j=;j<=maxs%now.v;j++) up[j]=maxs/now.v*now.v+j;
for (int j=maxs%now.v+;j<now.v;j++) up[j]=(maxs/now.v-)*now.v+j;
for (int j=;j<now.v;j++)
{
l=;r=;int ret=up[j],lim=up[j],ret1=up[j]/now.v,ret2=up[j]/now.v;
while (ret>=)
{
while ((l<=r) && (q[l]>ret)) l++;
while ((lim>=ret-now.c*now.v) && (lim>=))
{
insert(lim,ret2,now.v,now.w,dp);
lim-=now.v;ret2--;
}
dp[ret]=vals[l]+ret1*now.w;
ret1--;ret-=now.v;
}
}
}
else if (now.r<=mid) x.push_back(now);
else if (now.l>=mid+) y.push_back(now);
else
{
x.push_back(point(now.l,mid,now.v,now.w,now.c));
y.push_back(point(mid+,now.r,now.v,now.w,now.c));
}
}
if (left==right)
{
for (int i=;i<linker[left].size();i++)
ans[linker[left][i]]=dp[val[left][i]];
return;
}
DC(left,mid,x,dp);
DC(mid+,right,y,dp);
}
int main()
{
n=read();
for (int i=;i<=n;i++)
{
x=read();y=read();z=read();
if (i!=) v.push_back(point(,i-,x,y,z));
if (i!=n) v.push_back(point(i+,n,x,y,z));
}
for (int i=;i<=maxn;i++) dp.push_back();
m=read();
for (int i=;i<=m;i++)
{
x=read();y=read();x++;
linker[x].push_back(i);val[x].push_back(y);
}
DC(,n,v,dp);
for (int i=;i<=m;i++) printf("%d\n",ans[i]);
return ;
}

BZOJ 3163 Eden的新背包问题的更多相关文章

  1. 【BZOJ】【3163】【HEOI2013】Eden的新背包问题

    多重背包/思路题 多次询问,每次从所有物品中忽略一件,问最大收益…… 这题我用的zyf的一个“暴力”做法,就是先预处理出来g1[i][j]表示1~i号物品花了j块钱的最大价值,g2[i][j]表示i~ ...

  2. BZOJ 3163: [Heoi2013]Eden的新背包问题( 背包dp )

    从左到右, 从右到左分别dp一次, 然后就可以回答询问了. ---------------------------------------------------------- #include< ...

  3. BZOJ3163&Codevs1886: [Heoi2013]Eden的新背包问题[分治优化dp]

    3163: [Heoi2013]Eden的新背包问题 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 428  Solved: 277[Submit][ ...

  4. P4095 [HEOI2013]Eden 的新背包问题

    P4095 [HEOI2013]Eden 的新背包问题 题解 既然假定第 i 个物品不可以选,那么我们就设置两个数组 dpl[][] 正序选前i个物品,dpr[][] 倒序选前i个物品 ,价格不超过 ...

  5. luogu P4095 [HEOI2013]Eden 的新背包问题 多重背包 背包的合并

    LINK:Eden 的新背包问题 就是一个多重背包 每次去掉一个物品 询问钱数为w所能买到的最大值. 可以对于每次Q暴力dp 利用单调队列优化多重背包 这样复杂度是Qnm的. 发现过不了n==10的点 ...

  6. bzoj 3163: [Heoi2013]Eden的新背包问题

    Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...

  7. 3163: [Heoi2013]Eden的新背包问题

    Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...

  8. DSY3163*Eden的新背包问题

    Description "寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听."失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的 ...

  9. bzoj3163: [Heoi2013]Eden的新背包问题

    Description “寄没有地址的信,这样的情绪有种距离,你放着谁的歌曲,是怎样的心心静,能不能说给我听.”失忆的Eden总想努力地回忆起过去,然而总是只能清晰地记得那种思念的感觉,却不能回忆起她 ...

随机推荐

  1. js(引用类型和setTimeout scope)

    题目是群中小伙伴出的. var a = [1,2,3]; c= a //todo 限制条件 c 不能出现在 = 左边 console.log(a) console.log(c) console.log ...

  2. inline-block的简单理解

    1. 概念display:inline-block 将对象呈现为inline对象,但是对象的内容作为block对象呈现.之后的内联对象会被排列在同一行内.比如我们可以给一个link(a元素)inlin ...

  3. javaSE之线程联合

    首先定义 : 一个线程A在占有CPU资源期间 ,可以让其他线程调用join()和本线程联合. 嗯哈,像书本这个列子: 如: B.join(); 我们称A在运行期间联合了B, 如果线程A在占有CPU资源 ...

  4. 一个.net mvc的例子

    控制器 ( Controller) Product 下面功能主要根据多条件搜索产品的列表的功能 public ActionResult ProductList(string cityID, strin ...

  5. eclipse中SVN分支合并到主干

    在项目开发中,需要添加一些新的功能,但是又不想影响到其他开发人员的项目进度,所以决定使用SVN分支进行开发,分支开发完毕后再合并到主干.本文介绍如何在eclipse中合并分支到主干. 1. 要想将分支 ...

  6. 知名黑客组织Anonymous(匿名者)的装备库

    原文出处: infosecinstitute   译文出处:freebuf   欢迎分享原创到伯乐头条 本文关注的是世界著名的黑客组织Anonymous(匿名者).“我将描述他们的攻击方法和方式的计划 ...

  7. Java集合——List接口

    1.定义 List是Collection的子接口,元素有序并且可以重复,表示线性表. 2.方法 add(int index,Object e):在指定索引(和数组下标类似,为0,1,2....)放入元 ...

  8. c++ boost 汉字和模式串混用的例子

    *=============================================================== * Copyright (C) All rights reserved ...

  9. MySql中添加用户/删除用户

    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 登录MYSQL: @>mysql -u root -p @>密码 ...

  10. 网卡eth0配置信息

    DEVICE=eth0:0 //虚拟网络接口,随意 ONBOOT=yes //系统启动时激活 BOOTPROTO=static //使用静态ip地址 IPADDR=192.168.6.100 //该虚 ...