给定一棵有根树,记$f_{i}$表示$i$的父亲,每一个点有一个代价$c_{i}$

给定常数$D$和$X$,再给每个点赋一个权值$v_{i}$($v_{i}\ge 0$),满足以下条件下最大化$\sum_{i=1}^{n}v_{i}$

条件:1.$\forall 2\le i\le n,v_{f_{i}}\le v_{i}\le v_{f_{i}}+D$;2.$\sum_{i=1}^{n}c_{i}v_{i}\le X$

$2\le n\le 50$,$1\le f_{i}<i$,$0\le D\le 10^{9}$,$1\le X,c_{i}\le 10^{9}$

构造$d_{i}=v_{i}-v_{f_{i}}$(特别的$d_{1}=v_{1}$),那么$v_{i}=d_{i}+v_{f_{i}}=...=\sum_{j为i祖先}d_{j}$

考虑每一个点的贡献,则有$\sum_{i=1}^{n}v_{i}=\sum_{i=1}^{n}d_{i}sz_{i}$和$\sum_{i=1}^{n}c_{i}v_{i}=\sum_{i=1}^{n}d_{i}sum_{i}$(其中$sz_{i}$为以$i$为根的子树大小,$sum_{i}$为以$i$为根子树中所有$c_{i}$的和)

可以看作一个背包,$n$个物品质量为$sum_{i}$,价值为$sz_{i}$,数量限制为$D$

先将所有物品按照“性价比”$\frac{sz_{i}}{sum_{i}}$从大到小排序,则若存在$x<y$满足$d_{x}+sz_{y}\le D$且$d_{y}\ge sz_{x}$,那么不妨令$d'_{y}=d_{y}-sz_{x}$且$d'_{x}=d_{x}+sz_{y}$,显然质量之和不变且价值不减少,因此最优解中必然不存在这类点对

由于$sz_{i}\le n$,将条件收缩为存在$x<y$满足$d_{x}+n\le D$且$d_{y}\ge n$

进一步的,将最终答案中的$d_{i}$分为三类:1.$D-n<d_{i}\le D$;2.$n\le d_{i}\le D-n$;3.$0\le d_{i}<n$,根据上述结论,任意第$i$类一定要在任意第$i+1$类前,且第2类数量不超过1(形象地,即构成了111……2333……)

对于第1类,转化为$D-n+1+d'_{i}$;对于第2类,转化为$d'_{i}+\lfloor\frac{d_{i}}{n}\rfloor n$,则都有$0\le d'_{i}<n$

先对$d'_{i}$背包,由于价值范围为$o(n^{3})$,那么令$f[i][j]$表示前$i$个物品,价值和为$j$的最小质量来dp即可,时间复杂度为$o(n^{4}\ln n)$或$o(n^{4})$(前者利用物品数量小于$\frac{n^{3}}{sz_{i}}$,后者用单调队列

枚举$\sum_{i=1}^{n}d'_{i}sz_{i}$(共$o(n^{3})$种),根据第$i$类要在第$i+1$类前的性质,对于剩下的部分贪心即可

(过程一眼看可能会有点假,注意$d'_{i}$是由$d_{i}$强制构造出来的,然后贪心根据的是结论)

特别的,对于$sz_{x}=n$这个位置(即原来的根),其没有数量限制,以第2类的方式构造$d'_{i}$,然后其贪心时没有上限

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 105
4 #define ll long long
5 struct ji{
6 int nex,to;
7 }edge[N];
8 int E,n,m,d,x,head[N],id[N],sz[N],f[2][N*N*N];
9 ll ans,sum[N];
10 bool cmp(int x,int y){
11 return sz[x]*sum[y]>sz[y]*sum[x];
12 }
13 void add(int x,int y){
14 edge[E].nex=head[x];
15 edge[E].to=y;
16 head[x]=E++;
17 }
18 void dfs(int k){
19 sz[k]=1;
20 for(int i=head[k];i!=-1;i=edge[i].nex){
21 dfs(edge[i].to);
22 sz[k]+=sz[edge[i].to];
23 sum[k]+=sum[edge[i].to];
24 }
25 }
26 int main(){
27 scanf("%d%d%d%lld",&n,&m,&d,&sum[1]);
28 memset(head,-1,sizeof(head));
29 for(int i=2;i<=n;i++){
30 scanf("%lld%d",&sum[i],&x);
31 add(x,i);
32 }
33 dfs(1);
34 for(int i=1;i<=n;i++)id[i]=i;
35 sort(id+1,id+n+1,cmp);
36 int mm=n*n*n;
37 for(int i=1;i<=mm;i++)f[0][i]=m+1;
38 for(int i=1;i<=n;i++){
39 int p=(i&1);
40 for(int j=0;j<=mm;j++){
41 f[p][j]=m+1;
42 for(int k=0;(k<=min(n,d))&&(k*sz[id[i]]<=j);k++)
43 f[p][j]=min((ll)f[p][j],f[p^1][j-k*sz[id[i]]]+k*sum[id[i]]);
44 }
45 }
46 for(int i=0;i<=mm;i++)
47 if (f[(n&1)][i]<=m){
48 int s=m-f[(n&1)][i];
49 ll tot=i;
50 for(int j=1;j<=n;j++)
51 if ((id[j]==1)||(sum[id[j]]*(d-n)>s)){
52 tot+=1LL*sz[id[j]]*(s/sum[id[j]]);
53 s-=sum[id[j]]*(s/sum[id[j]]);
54 }
55 else{
56 if (d<n)continue;
57 tot+=1LL*sz[id[j]]*(d-n);
58 s-=sum[id[j]]*(d-n);
59 }
60 ans=max(ans,tot);
61 }
62 printf("%lld",ans);
63 }

[atARC096F]Sweet Alchemy的更多相关文章

  1. *AtCoder Regular Contest 096F - Sweet Alchemy

    $n \leq 50$的树,每个点有权值,现要选点(可多次选一个点)使点数尽量多,如下限制:选的总权值不超过$C \leq 1e9$:$c_i$表示$i$选的次数,$p_i$表示$i$的父亲,那么$c ...

  2. AT4120-[ARC096D]Sweet Alchemy【贪心,背包】

    正题 题目链接:https://www.luogu.com.cn/problem/AT4120 题目大意 给出\(n\)个物品和一个容量\(m\),第\(i\)个物品体积为\(c_i\).除了第一个物 ...

  3. Atcoder Regular Contest 096 D - Sweet Alchemy(贪心+多重背包)

    洛谷题面传送门 & Atcoder 题面传送门 由于再过 1h 就是 NOI 笔试了所以题解写得会略有点简略. 考虑差分,记 \(b_i=c_i-c_{fa_i}\),那么根据题意有 \(b_ ...

  4. Atcoder 乱做

    最近感觉自己思维僵化,啥都不会做了-- ARC103 F Distance Sums 题意 给定第 \(i\) 个点到所有点的距离和 \(D_i\) ,要求构造一棵合法的树.满足第 \(i\) 个点到 ...

  5. 【AtCoder】ARC096(C - F)

    听说日本题思维都很棒,去涨涨智商qwq C - Half and Half 题解 枚举买多少个AB披萨也行 但是关于买x个AB披萨最后的总花费是个单峰函数,可以三分 这题有点像六省联考2017D1T1 ...

  6. AtCoder Regular Contest 096

    AtCoder Regular Contest 096 C - Many Medians 题意: 有A,B两种匹萨和三种购买方案,买一个A,买一个B,买半个A和半个B,花费分别为a,b,c. 求买X个 ...

  7. 使用wireshark抓包分析浏览器无法建立WebSocket连接的问题(server为Alchemy WebSockets组件)

    工作时使用了Websocket技术,在使用的过程中发现,浏览器(Chrome)升级后可能会导致Websocket不可用,更换浏览器后可以正常使用. 近日偶尔一次在本地调试,发现使用相同版本的Chrom ...

  8. Sweet Alert

    http://www.dglives.com/demo/sweetalert-master/example/ Sweet Alert A beautiful replacement for Javas ...

  9. 【转】Alchemy的使用和多项式批量计算的优化

    原文:http://www.cnblogs.com/flash3d/archive/2012/01/30/2332158.html ================================== ...

随机推荐

  1. WinForm事件与消息

    WinForm事件与消息 消息概述以及在C#下的封装 Windows下应用程序的执行是通过消息驱动的.所有的外部事件,如键盘输入.鼠标移动.按动鼠标都由OS系统转换成相应的"消息" ...

  2. 从零入门 Serverless | 课时5 函数的调试与部署

    作者 | 江昱 阿里巴巴高级产品经理 本文整理自<Serverless 技术公开课>,关注"Serverless"公众号,回复"入门",即可获取 S ...

  3. MySQL中如何选择合适的备份策略和备份工具

    ​数据库备份的重要性毋庸置疑,可以说,它是数据安全的最后一道防线.鉴于此,对于备份,我们通常会做以下要求: 多地部署 对于核心数据库,我们通常有两地三中心的部署要求.对于备份来说,也是如此. 一个备份 ...

  4. SignalR 在React/GO技术栈的生产应用

    哼哧哼哧半年,优化改进了一个运维开发web平台. 本文记录SignalR在react/golang 技术栈的生产小实践. 1. 背景 有个前后端分离的运维开发web平台, 后端会间隔5分钟同步一次数据 ...

  5. 【c++ Prime 学习笔记】第6章 函数

    6.1 函数基础 函数定义包括:返回类型.函数名字.由0个或多个形参组成的列表以及函数体 通过调用运算符()来执行函数,它作用于一个表达式,该表达式是函数或函数指针.圆括号内是一个逗号隔开的实参列表, ...

  6. SpringBoot 整合 Thymeleaf & 如何使用后台模板快速搭建项目

    如果你和我一样,是一名 Java 道路上的编程男孩,其实我不太建议你花时间学 Thymeleaf,当然他的思想还是值得借鉴的.但是他的本质在我看来就是 Jsp 技术的翻版(Jsp 现在用的真的很少很少 ...

  7. JVM:参数调优

    JVM:参数调优 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 前言 查看 JVM 系统默认值:使用 jps 和 jinfo 进行查看 -Xms:初始堆空间 - ...

  8. Scrum Meeting 0607

    零.说明 日期:2021-6-7 任务:简要汇报两日内已完成任务,计划后两日完成任务 一.进度情况 组员 负责 两日内已完成的任务 后两日计划完成的任务 困难 qsy PM&前端 重新设计产品 ...

  9. 『学了就忘』Linux基础 — 11、通过setup工具配置Linux系统IP地址

    目录 1.setup命令介绍 2.使用setup命令配置IP (1)执行setup命令 (2)进入图形化配置界面 (3)选择配置IP还是DNS (4)选择要配置的网卡 (5)进入IP地址配置页面 (6 ...

  10. 贪心-Saruman‘s Army POJ - 3069

    万恶之源 目录 题意 思路 贪心的原则是什么呢? 错解 正解 代码实现 书上的代码 我的代码 比较一下 问题 题意 给定若干个点的坐标,与范围R.每个点可以选择是否标记,标记后这个点的左右范围R内的所 ...