「SCOI2015」小凸玩密室

虽然有心里在想一些奇奇怪怪的事情的原因,不过还是写太久了..

不过这个题本身也挺厉害的

注意第一个被点亮的是任意选的,我最开始压根没注意到

\(dp_{i,j}\)代表\(i\)号点子树最后连出去的一个点连的是它第\(j\)层的祖先

\(f_{i,j}\)代表\(i\)号点子树最后连出去的一个点连的是它第\(j\)层祖先的另一个儿子

然后我们就可以拼子树,做换根了

要讨论只有一个儿子的情况


Code:

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cctype>
  4. #include <algorithm>
  5. #define ll long long
  6. const int N=2e5+10;
  7. using std::min;
  8. template <class T>
  9. void read(T &x)
  10. {
  11. x=0;char c=getchar();
  12. while(!isdigit(c)) c=getchar();
  13. while(isdigit(c)) x=x*10+c-'0',c=getchar();
  14. }
  15. ll dp[2][N][20],a[N],edge[N],ans=1e18;
  16. int n,Log[N];
  17. #define ls (id<<1)
  18. #define rs (id<<1|1)
  19. void dfs(int id)
  20. {
  21. if(id<<1>n) return;
  22. dfs(ls),dfs(rs);
  23. for(int dep=Log[id];~dep;dep--)
  24. {
  25. if(ls<=n&&rs<=n)
  26. {
  27. dp[0][id][dep]=min(a[ls]*edge[ls]+dp[1][ls][Log[id]]+dp[0][rs][dep]
  28. ,a[rs]*edge[rs]+dp[1][rs][Log[id]]+dp[0][ls][dep]);
  29. dp[1][id][dep]=min(a[ls]*edge[ls]+dp[1][ls][Log[id]]+dp[1][rs][dep]
  30. ,a[rs]*edge[rs]+dp[1][rs][Log[id]]+dp[1][ls][dep]);
  31. }
  32. else if(ls<=n)
  33. {
  34. dp[0][id][dep]=a[ls]*edge[ls]+dp[0][ls][dep];
  35. dp[1][id][dep]=a[ls]*edge[ls]+dp[1][ls][dep];
  36. }
  37. }
  38. }
  39. void dfs0(int id,ll cost)
  40. {
  41. ans=min(ans,dp[0][id][Log[id]-1]+cost);
  42. if(ls<=n&&rs<=n)
  43. {
  44. dfs0(ls,a[rs]*edge[rs]+dp[0][rs][Log[id]-1]+cost);
  45. dfs0(rs,a[ls]*edge[ls]+dp[0][ls][Log[id]-1]+cost);
  46. }
  47. else if(ls<=n)
  48. dfs0(ls,edge[id]*a[id>>1]+cost);
  49. }
  50. int main()
  51. {
  52. int flag=0;read(n);
  53. for(int i=1;i<=n;i++) read(a[i]),Log[i]=Log[i>>1]+1;
  54. for(int i=2;i<=n;i++) read(edge[i]);
  55. memset(dp,0x3f,sizeof dp);
  56. for(int i=1;i<=n;i++)
  57. if(i<<1>n)
  58. {
  59. int typ=!(i&1),id=i>>1;ll sum=edge[i];
  60. for(int j=Log[i]-1;~j;j--)
  61. {
  62. dp[0][i][j]=a[id]*sum;
  63. dp[1][i][j]=a[id<<1|typ]*(sum+edge[id<<1|typ]);
  64. sum+=edge[id];
  65. typ=!(id&1);
  66. id>>=1;
  67. }
  68. }
  69. dfs(1);
  70. dfs0(1,0);
  71. printf("%lld\n",ans);
  72. return 0;
  73. }

2019.2.27

「SCOI2015」小凸玩密室 解题报告的更多相关文章

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

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

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

    题目链接 loj#2009. 「SCOI2015」小凸玩密室 题解 树高不会很高<=20 点亮灯泡x,点亮x的一个子树,再点亮x另外的子树, 然后回到x的父节点,点亮父节点之后再点亮父节点的其他 ...

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

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

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

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

  5. 「SCOI2015」小凸想跑步 解题报告

    「SCOI2015」小凸想跑步 最开始以为和多边形的重心有关,后来发现多边形的重心没啥好玩的性质 实际上你把面积小于的不等式列出来,发现是一次的,那么就可以半平面交了 Code: #include & ...

  6. 「SCOI2015」小凸解密码 解题报告

    「SCOI2015」小凸解密码 题意:给一个环,定义一段连续的极长\(0\)串为\(0\)区间,定义一个位置的离一个\(0\)区间的距离为这个位置离这个区间中\(0\)的距离的最小值,每次询问一个位置 ...

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

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

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

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

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

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

随机推荐

  1. echarts使用笔记三:柱子对比

    app.title = '坐标轴刻度与标签对齐'; option = { title : { //标题 x : 'center', y : 5, text : '对比图' //换行用 \n }, le ...

  2. 工程下CmakeLists.txt

    2.工程下Cmake 本小节的任务是让上一小结的程序更像一个工程: 为工程添加一个子目录 src,用来放置工程源代码 : 添加一个子目录doc,用来放置这个工程的文档 hello.txt: 在工程目录 ...

  3. Oracle 备份表数据

    --备份表数据 select * from t_owners; --创建备份表 create table t_owners_copy ( id number, name ), addressid nu ...

  4. 剑指offer(1)

    题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. ...

  5. java类型的小知识List 等

    List 复制之 浅拷贝与深拷贝 详细连接https://blog.csdn.net/never_tears/article/details/79067245 java中判断字符串是否为数字的方法的几 ...

  6. python爬虫之Anaconda安装

    Anaconda概述 Anaconda是一个用于科学计算的Python发行版,支持 Linux, Mac, Windows系统,提供了包管理与环境管理的功能,可以很方便地解决多版本python并存.切 ...

  7. Ubuntu18.04安装mysql5.7

    Ubuntu18.04安装mysql5.7 1.1安装 首先执行下面三条命令: # 安装mysql服务 sudo apt-get install mysql-server # 安装客户端 sudo a ...

  8. snv的使用

    1.搭建SVN服务器 (1)直接安装 (2)创建工号,分组,分配权限(图形化界面的直接操作,非图形界面的需要改配置文件conf文件夹下) (3)创建仓库,D:\Repositories\OA:cmd命 ...

  9. WorldCount代码检查与优化——软件测试第三次作业

    合作者:201631062222,201631062232 代码地址:https://gitee.com/biubiubiuLYQ/ceshi_secend 本次作业链接地址:https://edu. ...

  10. 老男孩python学习自修第十八天【面向对象】

    1.类与对象(构造方法与实例化) #!/usr/bin/env python # _*_ coding:UTF-8 _*_ class Province: def __init__(self, nam ...