「JLOI2015」战争调度

感觉一到晚上大脑就宕机了...

题目本身不难,就算没接触过想想也是可以想到的

这个满二叉树的深度很浅啊,每个点只会和它的\(n-1\)个祖先匹配啊

于是可以暴力枚举祖先链的选择

然后处理某个点\(i\)时,已经枚举了\(i\)到根的祖先的选择

这时候我们发现枚举\(i\)后,左右儿子的贡献的独立的,然后左右儿子的选择对上面是没有影响的

可以直接设\(dp_{i,j}\)表示\(i\)子树\(j\)黑点的最大值

然后直接子树合并两个儿子就可以了

复杂度?

\(T(n)=2(2T(n-1)+2^n)\)

好像是这个,化出来差不多是\(O(n2^{2n})\)


Code:

#include <cstdio>
#include <cctype>
#include <algorithm>
using std::max;
template <class T>
void read(T &x)
{
x=0;char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) x=x*10+c-'0',c=getchar();
}
#define ls id<<1
#define rs id<<1|1
const int N=1<<10;
int dp[N][N],w[N][N],f[N][N],cho[N],n,m;
void dfs(int id,int k)
{
for(int i=0;i<=k;i++) dp[id][i]=0;
if(k==1)
{
for(int i=1;i<n;i++)
{
int fa=id>>i;
if(cho[fa]) dp[id][1]+=w[id][fa];
else dp[id][0]+=f[id][fa];
}
return;
}
cho[id]=0;
dfs(ls,k>>1),dfs(rs,k>>1);
for(int i=0;i<=k>>1;i++)
for(int j=0;j<=k>>1;j++)
dp[id][i+j]=max(dp[id][i+j],dp[ls][i]+dp[rs][j]);
cho[id]=1;//w[i][j]
dfs(ls,k>>1),dfs(rs,k>>1);
for(int i=0;i<=k>>1;i++)
for(int j=0;j<=k>>1;j++)
dp[id][i+j]=max(dp[id][i+j],dp[ls][i]+dp[rs][j]);
}
int main()
{
read(n),read(m);
int k=1<<n-1;
for(int i=1;i<=k;i++)
{
int id=k-1+i;
for(int j=1;j<n;j++)
read(w[id][id>>j]);//<=m
}
for(int i=1;i<=k;i++)
{
int id=k-1+i;
for(int j=1;j<n;j++)
read(f[id][id>>j]);
}
dfs(1,k);
int ans=0;
for(int i=0;i<=m;i++) ans=max(ans,dp[1][i]);
printf("%d\n",ans);
return 0;
}

2019.2.25

「JLOI2015」战争调度 解题报告的更多相关文章

  1. 「JLOI2015」骗我呢 解题报告?

    「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...

  2. 「JLOI2015」城池攻占 解题报告

    「JLOI2015」城池攻占 注意到任意两个人的战斗力相对大小的不变的 可以离线的把所有人赛到初始点的堆里 然后做启发式合并就可以了 Code: #include <cstdio> #in ...

  3. 「JLOI2015」管道连接 解题报告

    「JLOI2015」管道连接 先按照斯坦纳树求一个 然后合并成斯坦纳森林 直接枚举树的集合再dp一下就好了 Code: #include <cstdio> #include <cct ...

  4. 「JLOI2015」战争调度

    题目 [内存限制:256 MiB][时间限制:1000 ms] [标准输入输出][题目类型:传统][评测方式:文本比较] 题目描述 脸哥最近来到了一个神奇的王国,王国里的公民每个公民有两个下属或者没有 ...

  5. 【LOJ】#2111. 「JLOI2015」战争调度

    题解 记录一个数组dp[i][S][k]表示第i个点,它上面所有的点的状态(参军或者后勤)可以用状态S来表示,一共有k个平民参军的最大收益,当然数组开不下,可以用vector动态开 我们对于每个平民枚 ...

  6. 「FJOI2016」神秘数 解题报告

    「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...

  7. 「ZJOI2016」大森林 解题报告

    「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...

  8. 「SCOI2016」背单词 解题报告

    「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...

  9. 「NOI2015」寿司晚宴 解题报告

    「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...

随机推荐

  1. agora入门案例

    一,下载agora的WebSDK 二,运行index.html 三,输入appID 1.找到appID 2.页面输入appID,查看效果

  2. PAT L3-016 二叉搜索树的结构

    https://pintia.cn/problem-sets/994805046380707840/problems/994805047903240192 二叉搜索树或者是一棵空树,或者是具有下列性质 ...

  3. react购物车demo

    import React, { Component } from 'react'; import './App.css'; import {connect} from 'react-redux'; i ...

  4. 2 JAVA 项目名称前红色叹号如何解决

    1 Java 项目前出现红色叹号Eclipse找不到项目需要的JAR包,可以在这里面解决: ① 右键点击项目,选择[Build Path].[Configure Build Path...] ② 在这 ...

  5. 源码追踪,解决Could not locate executable null\bin\winutils.exe in the Hadoop binaries.问题

    在windows系统本地运行spark的wordcount程序,会出现一个异常,但不影响现有程序运行. >>提君博客原创  http://www.cnblogs.com/tijun/  & ...

  6. Java语言中姐种遍历List的方法总结

    遍历 List 的方法: 1. for 2. advanced for 3. Iterator 4. while 5. ListIterator List<E> list 1. for f ...

  7. Python实现百度贴吧自动顶贴机

    开发这款小工具,我们需要做一些准备: url.txt:多个需要顶起的帖子地址. reply:多条随机回复的内容. selenium:浏览器自动化测试框架 首先,我们先使用pip完成selenium的安 ...

  8. VS Code & MacOS & Zsh

    VS Code & MacOS & Zsh https://code.visualstudio.com/docs/setup/mac solution OK bug $ cat .zs ...

  9. js模拟ctrl+c的问题

    1.这种方式只可以对显示的textbox和textarea使用,对于display:none和visibility hidden 以及其他标签无效 var message = document.get ...

  10. js的常用文档对象,document

    1.document的概念:window的子对象,由于DOM对象模型的默认对象就是window,因此Window对象中的方法和子对象不需要通过Window来引用. - 2.document的组成:属性 ...