n种珠宝。每种各1个。有价格ci元,美度vi。  要求分别输出1元到m元 可买的最大优美度。

整数 :0<n<=10000000, 0<ci<=300,0<=vi<=10^9, 0<m<=50000;

之前 系统的看过有关背包的题目。。然而这个做法还没见过。

首先复杂度是 300*m*log(m)+n

对1~300的每个价格 x, 按v从大到小排序,形成一个b数组。记录了价格为x的vi的前缀和(这里记为bj,   b[j]=b[j-1]+vi(当然。若j*x>m时 不用再继续记录。)

因为固定了当前只取价格为x的珍宝,所以,设f[i]为i元能买的最大价值  f[i]只能由f[i-t*u](t为自然数)更新而来。。 而b数组是上凸壳(①b是不减的,②因为对相同的价格,按vi从大到小排序。所以b的斜率是不增的。)

那么就可以用栈来做了:  设a[]为上一种价格x'计算完后 的f[],然后用a[]和b[]来更新f[]  ,那么f[i]=max(a[i-k*x]+b[i]), 换句话说,可以发现 每个a[i]可以在一段l~r上 作为max,且不会有另外的位置它会作max,同时i越大,对应的l,r也大。

  可以设 i%x=u  那么枚举u=0~x-1, 然后O(m/x)的扫一遍——for(i=u;i<=m;i+=x) , 用栈求出 每个a[i] 的l~r, 然后更新f[]。

细节多*意识模糊=一个晚上的颓废。。。。 上代码

 #include <cmath>
#include <cstdio>
#include <cctype>
#include <algorithm>
#define LL long long
using namespace std;
template<class T> inline void gn(T &x) {
char c; while(!isdigit(c=getchar())); x=c-'';
while(isdigit(c=getchar())) x=x*+c-'';
}
struct bla{
int c; LL v;
}o[];
int l,r,u,n,m,k,t,x,y,z,p,q,d[],e[];
LL b[],a[],f[];
inline bool cmp(bla a,bla b){if (a.c!=b.c) return a.c<b.c; return a.v>b.v;}
inline int get(int p,int q){
int L=(p-u)/x,R=(q-u)/x,l=R-,r=(m-u)/x,j;
while (l<r){
j=l+r+>>;
if(a[p]+b[j-L]>=a[q]+b[j-R]) l=j; else r=j-;
}
return u+l*x;
}
int main(){
freopen("jewelry.in","r",stdin);
freopen("jewelry.out","w",stdout);
gn(n); gn(m);
for (int i=;i<=n;++i) gn(o[i].c),gn(o[i].v);
sort(o+,o+n+,cmp);
for (int I=,J;I<=n;I=J){
x=o[I].c;
for (int i=;i<=k;++i) b[i]=; k=;
for (J=I;o[J].c==o[I].c;++J)
if (k*x+x<=m) b[++k]=b[k-]+o[J].v;
if (k*x>m) --k;
for (int i=;i<=m;++i) a[i]=f[i],f[i]=;
for (u=;u<x;++u){
t=;
for (int i=u;i<=m;i+=x){
while (t){
e[t]=get(d[t],i);
if (e[t]>e[t-]) break;
--t;
}
d[++t]=i;
}
e[t]=(m-u)/x*x+u;
for (int i=;i<=t;++i)
for (int j=e[i];j>e[i-];j-=x) f[j]=max(f[j],a[d[i]]+b[(j-d[i])/x]);
}
}
for (int i=;i<=m;++i){
f[i]=max(f[i],f[i-]);
printf("%I64d ",f[i]);
}
return ;
}

Sad

珠宝 jewelry 省选模拟的更多相关文章

  1. 【洛谷比赛】[LnOI2019]长脖子鹿省选模拟赛 T1 题解

    今天是[LnOI2019]长脖子鹿省选模拟赛的时间,小编表示考的不怎么样,改了半天也只会改第一题,那也先呈上题解吧. T1:P5248 [LnOI2019SP]快速多项式变换(FPT) 一看这题就很手 ...

  2. 省选模拟赛第四轮 B——O(n^4)->O(n^3)->O(n^2)

    一 稍微转化一下,就是找所有和原树差距不超过k的不同构树的个数 一个挺trick的想法是: 由于矩阵树定理的行列式的值是把邻接矩阵数值看做边权的图的所有生成树的边权乘积之和 那么如果把不存在于原树中的 ...

  3. NOI2019省选模拟赛 第五场

    爆炸了QAQ 传送门 \(A\) \(Mas\)的童年 这题我怎么感觉好像做过--我记得那个时候还因为没有取\(min\)结果\(100\to 0\)-- 因为是个异或我们肯定得按位考虑贡献了 把\( ...

  4. NOI2019省选模拟赛 第六场

    传送门 又炸了-- \(A\) 唐时月夜 不知道改了什么东西之后就\(A\)掉了\(.jpg\) 首先,题目保证"如果一片子水域曾经被操作过,那么在之后的施法中,这片子水域也一定会被操作&q ...

  5. 省选模拟赛 arg

    1 arg (arg.cpp/in/out, 1s, 512MB)1.1 Description给出一个长度为 m 的序列 A, 请你求出有多少种 1...n 的排列, 满足 A 是它的一个 LIS. ...

  6. 【NOI省选模拟】小奇的花园

    「题目背景」 小奇在家中的花园漫步时,总是会思考一些奇怪的问题. 「问题描述」 小奇的花园有n个温室,标号为1到n,温室以及以及温室间的双向道路形成一棵树. 每个温室都种植着一种花,随着季节的变换,温 ...

  7. [JZOJ6257] 【省选模拟8.9】修路

    题目 题目大意 有一堆点,每个点都有其权值\(c_i\). 每次插入边\((u,v)\),\(u\)和\(1\)连通,\(v\)和\(1\)不连通.最后保证形成一棵树. 每次插入的时候询问\(1\)到 ...

  8. @省选模拟赛03/16 - T3@ 超级树

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取 ...

  9. 5.10 省选模拟赛 拍卖 博弈 dp

    LINK:拍卖 比赛的时候 前面时间浪费的有点多 写这道题的时候 没剩多少时间了. 随便设了一个状态 就开始做了. 果然需要认真的思考.其实 从我的状态的状态转移中可以看出所有的结论. 这里 就不再赘 ...

随机推荐

  1. POJ 3615 Cow Hurdles

    http://poj.org/problem?id=3615 floyd 最短路径的变形 dist[i][j]变化为 : i j之间的最大边 那么输入的时候可以直接把dist[i][j] 当作i j ...

  2. java容器详解(以Array Arrays ArrayList为例)

    //先记录一个想法……java实在是太臃肿了,纯面向对象也有不少弊端…… //能不能把java精简一下啊! 先上结论: Array:认真看api索引的话,Array有两个.一个是sql中的接口,一个是 ...

  3. linux mail 发邮件

    system('echo "'.$xmlHeader.$xmlBody.$xmlFooter.'" | mail -s "百度新闻源生成成功,地址=>http:// ...

  4. POJ 2104 K-th Number【整体二分 + 树状数组】

    本来只是想学一下CDQ,还是先把整体二分搞懂一点. 这题窝几个月前分别用划分树,树套树,主席树和挑战上介绍的分桶法实现了一发(然而现在都忘得差不多了) 最快的是划分树,其次是主席树,然后是树套树,还有 ...

  5. Codeforces 658B Bear and Displayed Friends【set】

    题目链接: http://codeforces.com/contest/658/problem/B 题意: 给定元素编号及亲密度,每次插入一个元素,并按亲密度从大到小排序.给定若干操作,回答每次询问的 ...

  6. powerDigner使用

    PowerDesigner是一款功能非常强大的建模工具软件,足以与Rose比肩,同样是当今最著名的建模软件之一.Rose是专攻UML对象模型的建模工具,之后才向数据库建模发展,而PowerDesign ...

  7. Java时间戳转化为今天、昨天、明天(字符串格式)

    原文:http://www.open-open.com/code/view/1435301895825 时间戳,相信大家一定都不陌生,服务器经常会传回来时间戳,需要我们对时间戳进行处理.各种麻烦不断, ...

  8. python执行

    转载:https://www.cnblogs.com/zflibra/p/4180796.html

  9. 使用WIN32汇编语言实现一个基本windows窗体的过程分析

    一个常规的windows窗体一般都是一些一样的构造.你假设想要更改一些个性化的设置,你能够在这个一般的模板伤添砖加瓦.构造自己比較喜欢的类型.下边就分析一下一般的windows窗体的一般模板. 一. ...

  10. 【LeetCode】Swap Nodes in Pairs 链表指针的应用

    题目:swap nodes in pairs <span style="font-size:18px;">/** * LeetCode Swap Nodes in Pa ...