「JLOI2015」战争调度 解题报告
「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」战争调度 解题报告的更多相关文章
- 「JLOI2015」骗我呢 解题报告?
「JLOI2015」骗我呢 这什么神仙题 \[\color{purple}{Link}\] 可以学到的东西 对越过直线的东西翻折进行容斥 之类的..吧? Code: #include <cstd ...
- 「JLOI2015」城池攻占 解题报告
「JLOI2015」城池攻占 注意到任意两个人的战斗力相对大小的不变的 可以离线的把所有人赛到初始点的堆里 然后做启发式合并就可以了 Code: #include <cstdio> #in ...
- 「JLOI2015」管道连接 解题报告
「JLOI2015」管道连接 先按照斯坦纳树求一个 然后合并成斯坦纳森林 直接枚举树的集合再dp一下就好了 Code: #include <cstdio> #include <cct ...
- 「JLOI2015」战争调度
题目 [内存限制:256 MiB][时间限制:1000 ms] [标准输入输出][题目类型:传统][评测方式:文本比较] 题目描述 脸哥最近来到了一个神奇的王国,王国里的公民每个公民有两个下属或者没有 ...
- 【LOJ】#2111. 「JLOI2015」战争调度
题解 记录一个数组dp[i][S][k]表示第i个点,它上面所有的点的状态(参军或者后勤)可以用状态S来表示,一共有k个平民参军的最大收益,当然数组开不下,可以用vector动态开 我们对于每个平民枚 ...
- 「FJOI2016」神秘数 解题报告
「FJOI2016」神秘数 这题不sb,我挺sb的... 我连不带区间的都不会哇 考虑给你一个整数集,如何求这个神秘数 这有点像一个01背包,复杂度和值域有关.但是你发现01背包可以求出更多的东西,就 ...
- 「ZJOI2016」大森林 解题报告
「ZJOI2016」大森林 神仙题... 很显然线段树搞不了 考虑离线操作 我们只搞一颗树,从位置1一直往后移动,然后维护它的形态试试 显然操作0,1都可以拆成差分的形式,就是加入和删除 因为保证了操 ...
- 「SCOI2016」背单词 解题报告
「SCOI2016」背单词 出题人sb 题意有毒 大概是告诉你,你给一堆n个单词安排顺序 如果当前位置为x 当前单词的后缀没在这堆单词出现过,代价x 这里的后缀是原意,但不算自己,举个例子比如abc的 ...
- 「NOI2015」寿司晚宴 解题报告
「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...
随机推荐
- agora入门案例
一,下载agora的WebSDK 二,运行index.html 三,输入appID 1.找到appID 2.页面输入appID,查看效果
- PAT L3-016 二叉搜索树的结构
https://pintia.cn/problem-sets/994805046380707840/problems/994805047903240192 二叉搜索树或者是一棵空树,或者是具有下列性质 ...
- react购物车demo
import React, { Component } from 'react'; import './App.css'; import {connect} from 'react-redux'; i ...
- 2 JAVA 项目名称前红色叹号如何解决
1 Java 项目前出现红色叹号Eclipse找不到项目需要的JAR包,可以在这里面解决: ① 右键点击项目,选择[Build Path].[Configure Build Path...] ② 在这 ...
- 源码追踪,解决Could not locate executable null\bin\winutils.exe in the Hadoop binaries.问题
在windows系统本地运行spark的wordcount程序,会出现一个异常,但不影响现有程序运行. >>提君博客原创 http://www.cnblogs.com/tijun/ & ...
- Java语言中姐种遍历List的方法总结
遍历 List 的方法: 1. for 2. advanced for 3. Iterator 4. while 5. ListIterator List<E> list 1. for f ...
- Python实现百度贴吧自动顶贴机
开发这款小工具,我们需要做一些准备: url.txt:多个需要顶起的帖子地址. reply:多条随机回复的内容. selenium:浏览器自动化测试框架 首先,我们先使用pip完成selenium的安 ...
- VS Code & MacOS & Zsh
VS Code & MacOS & Zsh https://code.visualstudio.com/docs/setup/mac solution OK bug $ cat .zs ...
- js模拟ctrl+c的问题
1.这种方式只可以对显示的textbox和textarea使用,对于display:none和visibility hidden 以及其他标签无效 var message = document.get ...
- js的常用文档对象,document
1.document的概念:window的子对象,由于DOM对象模型的默认对象就是window,因此Window对象中的方法和子对象不需要通过Window来引用. - 2.document的组成:属性 ...