题目链接

loj#2009. 「SCOI2015」小凸玩密室

题解

树高不会很高<=20

点亮灯泡x,点亮x的一个子树,再点亮x另外的子树,

然后回到x的父节点,点亮父节点之后再点亮父节点的其他子树

所以对于一个节点x,有这样两种情况

x还没有被点亮,那么下一个被点亮的是x的一个儿子

x是叶子节点,那么下一个被点亮的是它的祖先,或者是它祖先的儿子

设f[i][j]表示点亮i之后回到i的第j个祖先的最小花费

设g[i][j]表示点亮i之后回到i的第j个祖先的另一个儿子的最小花费

然后从下到上,由儿子的状态转移到父亲的状态

讨论一下儿子个数

最后模拟点亮过程统计答案

ans要开大

代码

#include<cstdio>
#include<algorithm>
using namespace std;
inline int read() {
int x = 0,f = 1;
char c = getchar();
while(c < '0' || c > '9')c = getchar();
while(c <= '9' && c >= '0') x = x * 10 + c - '0',c = getchar();
return x * f ;
}
#define INF 2000000000000000000ll
#define LL long long
#define fa(i,j) ((1 << j - 1) <= i ? (i >> j) : -1 )
#define bro(i,j) ((i >> j - 1) ^ 1)
#define ls (i << 1)
#define rs (i << 1 | 1)
const int maxn = 200007; int n;
LL a[maxn],dp[maxn][27][2],dis[maxn][27]; int main() {
n = read();
for(int i = 1;i <= n;++ i) a[i] = read();
dis[1][1] = 0;
for(int i = 2;i <= n;++ i) {
dis[i][1] = read();
for(int j = 2;~fa(i,j);++ j) dis[i][j] = dis[fa(i,1)][j - 1] + dis[i][1];
}
for(int i = n;i >= 1;-- i) { for(int j = 1;~ fa(i,j);++ j) {
dp[i][j][0] = dp[i][j][1] = INF;
if(ls > n)
dp[i][j][0] = dis[i][j] * a[fa(i,j)], dp[i][j][1] = (dis[i][j] + dis[bro(i,j)][1]) * a[bro(i,j)];
else if(rs > n)
dp[i][j][0] = dp[ls][j + 1][0] + dis[ls][1] * a[ls], dp[i][j][1] = dp[ls][j + 1][1] + dis[ls][1] * a[ls];
else
dp[i][j][0] = min(dp[i][j][0],dp[ls][1][1] + dp[rs][j + 1][0] + dis[ls][1] * a[ls]),
dp[i][j][0] = min(dp[i][j][0],dp[rs][1][1] + dp[ls][j + 1][0] + dis[rs][1] * a[rs]),
dp[i][j][1] = min(dp[i][j][1],dp[ls][1][1] + dp[rs][j + 1][1] + dis[ls][1] * a[ls]),
dp[i][j][1] = min(dp[i][j][1],dp[rs][1][1] + dp[ls][j + 1][1] + dis[rs][1] * a[rs]);
}
}
LL ans = INF;
for(int x = 1;x <= n;x ++) {
LL tmp = dp[x][1][0];
for(int i = fa(x,1),last = x;~i;i = fa(i,1),last = fa(last,1)) {
if(bro(last,1) <= n) tmp += dis[bro(last,1)][1] * a[bro(last,1)] + dp[bro(last,1)][2][0];
else tmp += dis[i][1] * a[fa(i,1)];
}
ans = min(ans,tmp);
}
printf("%lld\n",ans);
return 0;
}

loj#2009.「SCOI2015」小凸玩密室的更多相关文章

  1. —Libre#2009. 「SCOI2015」小凸玩密室

    #2009. 「SCOI2015」小凸玩密室 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  2. 【LOJ】 #2009. 「SCOI2015」小凸玩密室

    题解 神仙dp啊QAQ 我们发现我们需要枚举一个起点,遍历完它所有的儿子然后向上爬 设\(f[i][j]\)表示第i个点的子树全部处理完之后到达i深度为j的祖先的兄弟处 我们只需要对叶子节点和只有一个 ...

  3. #2009. 「SCOI2015」小凸玩密室

    神仙题啊.完全想不出 首先看方案.可以从任意一个点开始,在这个点要先走完子树,然后走到父亲,再走兄弟,再走父亲的父亲,父亲的兄弟..一直走到1,1的另外一个子树,结束. 完全不会鸭.jpg 设f[i] ...

  4. 「SCOI2015」小凸玩密室 解题报告

    「SCOI2015」小凸玩密室 虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了.. 不过这个题本身也挺厉害的 注意第一个被点亮的是任意选的,我最开始压根没注意到 \(dp_{i,j}\)代表 ...

  5. loj2009. 「SCOI2015」小凸玩密室

    「SCOI2015」小凸玩密室 小凸和小方相约玩密室逃脱,这个密室是一棵有 $ n $ 个节点的完全二叉树,每个节点有一个灯泡.点亮所有灯泡即可逃出密室.每个灯泡有个权值 $ A_i $,每条边也有个 ...

  6. loj #2006. 「SCOI2015」小凸玩矩阵

    #2006. 「SCOI2015」小凸玩矩阵   题目描述 小凸和小方是好朋友,小方给小凸一个 N×M N \times MN×M(N≤M N \leq MN≤M)的矩阵 A AA,要求小凸从其中选出 ...

  7. LibreOJ #2006. 「SCOI2015」小凸玩矩阵 二分答案+二分匹配

    #2006. 「SCOI2015」小凸玩矩阵 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据   题目描述 ...

  8. 「SCOI2015」小凸玩矩阵 解题报告

    「SCOI2015」小凸玩矩阵 我好沙茶啊 把点当边连接行和列,在外面二分答案跑图的匹配就行了 我最开始二分方向搞反了,样例没过. 脑袋一抽,这绝壁要费用流,连忙打了个KM 然后wa了,一想这个不是完 ...

  9. AC日记——「SCOI2015」小凸玩矩阵 LiBreOJ 2006

    「SCOI2015」小凸玩矩阵 思路: 二分+最大流: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 300 ...

随机推荐

  1. 如何传递参数给ASP.NET Core的中间件(Middleware)

    问题描述 当我们在ASP.NET Core中定义和使用中间件(Middleware)的时候,有什么好的办法可以给中间件传参数吗? 解决方案 在ASP.NET Core项目中添加一个POCO类来传递参数 ...

  2. React-用create-react-app搭建项目

    安装create-react-app npm install -g create-react-app 装完之后,生成一个新的项目,可以使用下面的命令: create-react-app my-app ...

  3. Luogu P1546 最短网络 Agri-Net

    其实这道题根本没必要写,但为了测试vector+堆优化的Prim试一发. 再次觉得Prim和Dijkstra很像,堆优化版本也差不多. 和Dijkstra一样,Prim也是在之前的dis点中选取一个最 ...

  4. C# 时间戳与DateTime互转

    #region 转换时间为unix时间戳 /// <summary> /// 转换时间为unix时间戳 /// </summary> /// <param name=&q ...

  5. 调用不同目录类的protected构造器

    一.问题 二.分析 调用不同目录类的protected构造器,IDE报错. 二.解决办法: 后面添加一个{}就可以了

  6. redis持久化策略梳理及主从环境下的策略调整记录

    redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化.可以不定期的通过异步方式保存到磁盘上(即“半持久化模式”):也可以把每一次数据变化都写入到一个A ...

  7. db2修改最大连接数

    查看当前连接数,sample为数据库名db2 list applications for db sample db2 list applications for db sample show deta ...

  8. getUserMedia API及HTML5 调用摄像头和麦克风

    getUserMedia API简介 HTML5的getUserMedia API为用户提供访问硬件设备媒体(摄像头.视频.音频.地理位置等)的接口,基于该接口,开发者可以在不依赖任何浏览器插件的条件 ...

  9. Spring Cloud :断路器集群监控(Turbine)

    一. 简介      上一篇文章我们已经实现了对单个服务实例的监控,当然在实际应用中,单个实例的监控数据没有多大的价值,我们更需要的是一个集群系统的监控信息,这时我们就需要引入Turbine.Turb ...

  10. linux内核设计第七周——可执行程序的装载