【BZOJ1495】[NOI2006]网络收费 暴力+DP
【BZOJ1495】[NOI2006]网络收费
Description


Input
Output
你的程序只需要向输出文件输出一个整数,表示NS中学支付给网络公司的最小总费用。(单位:元)
Sample Input
1 0 1 0
2 2 10 9
10 1 2
2 1
3
Sample Output
HINT
【样例说明】 将1号用户的付费方式由B改为A,NS中学支付给网络公司的费用达到最小
题解:先观察表格,发现当nA<nB时,我们可以将选A看成系数为1,选B看成系数为0,这样就可以将点对的贡献拆开来考虑。为此我们预处理cost[i][j],表示i与所有和i的lca深度为j的点构成的点对费用之和,这样我们就相当于将花费都放到了叶子节点处。
但是我们需要知道每个点是nA<nB还是nA>=nB才能确定叶子节点的费用,但由于是完全二叉树,所以我们可以枚举每个节点是nA<nB还是nA>=nB,然后就能确定叶子节点的取A或B的费用,接着用f[x][y]表示x子树中有y个B,其余都是A的最小费用,那么从将一个非叶子节点的两个儿子的DP值进行背包合并便得到了该点的DP值。由于我们已经钦定了该点是nA<nB或是nA>=nB,所以我们在DP时将不合法的状态去掉即可。
以上做法看起来可能比较暴力,不过实际复杂度呢?$T(n)=4(n-1)+2^{2n}$,所以每一层的复杂度都是$O(2^{2n})$的,一共log层;而搜一次叶子节点消耗的时间是n,每个叶子都要被搜到$O(2^n)$次,一共$2^n$个叶子,所以两个地方的复杂度都是$O(2^{2n}n)$的。
然而正解是把我的暴力改成状压。。。都差不多。
goubiGXZ交我程序还加读入优化拿Rank1。
#include <cstdio>
#include <cstring>
#include <iostream>
#define ls x<<1
#define rs x<<1|1
using namespace std;
const int maxn=2100;
typedef long long ll;
int n;
ll ans;
int tp[maxn],B[20],s[20];
ll cost[maxn][12],f[maxn][maxn],C[maxn][2];
inline int lca(int a,int b)
{
int i;
for(i=n-1;i>=0;i--) if((a>>i)!=(b>>i)) break;
return n-i-1;
}
inline int rd()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
void dfs(int x,int dep)
{
if(dep==n)
{
f[x][0]=C[x-B[n]][0];
f[x][1]=C[x-B[n]][1];
for(int i=0;i<dep;i++) f[x][s[i]^1]+=cost[x-B[n]][i];
return ;
}
s[dep]=0;
memset(f[x],0x3f,sizeof(f[x][0])*(B[n-dep]+1));
dfs(ls,dep+1),dfs(rs,dep+1);
for(int i=0;i<=B[n-dep-1];i++) for(int j=0;i+j<=B[n-dep-1];j++) f[x][i+j]=min(f[x][i+j],f[ls][i]+f[rs][j]);
s[dep]=1;
dfs(ls,dep+1),dfs(rs,dep+1);
for(int i=1;i<=B[n-dep-1];i++) for(int j=B[n-dep-1]+1-i;j<=B[n-dep-1];j++) f[x][i+j]=min(f[x][i+j],f[ls][i]+f[rs][j]);
}
int main()
{
//freopen("network.in","r",stdin);
//freopen("network.out","w",stdout);
n=rd();
int i,j,v,a;
for(i=0;i<=n;i++) B[i]=1<<i;
for(i=0;i<B[n];i++) tp[i]=rd();
for(i=0;i<B[n];i++) C[i][tp[i]]=0,C[i][tp[i]^1]=rd();
for(i=0;i<B[n];i++) for(j=i+1;j<B[n];j++)
{
a=lca(i,j),v=rd();
cost[i][a]+=v,cost[j][a]+=v;
}
dfs(1,0);
ans=1ll<<60;
for(i=0;i<=B[n];i++) ans=min(ans,f[1][i]);
printf("%lld",ans);
return 0;
}
【BZOJ1495】[NOI2006]网络收费 暴力+DP的更多相关文章
- 5.21 省选模拟赛 luogu P4297 [NOI2006]网络收费 树形dp
LINK:网络收费 还是自己没脑子. 早上思考的时候 发现树形dp不可做 然后放弃治疗了. 没有合理的转换问题的模型是我整个人最大的败笔. 暴力也值得一提 爆搜之后可以写成FFT的形式的计算贡献的方法 ...
- 【bzoj1495】[NOI2006]网络收费 暴力+树形背包dp
题目描述 给出一个有 $2^n$ 个叶子节点的完全二叉树.每个叶子节点可以选择黑白两种颜色. 对于每个非叶子节点左子树中的叶子节点 $i$ 和右子树中的叶子节点 $j$ :如果 $i$ 和 $j$ 的 ...
- BZOJ1495 [NOI2006]网络收费 【树形dp + 状压dp】
题目链接 BZOJ1495 题解 观察表格,实际上就是分\(A\)多和\(B\)两种情况,分别对应每个点选\(A\)权值或者\(B\)权值,所以成对的权值可以分到每个点上 所以每个非叶节点实际对应一个 ...
- BZOJ1495 [NOI2006]网络收费
题意 传送门 MY市NS中学,大概是绵阳市南山中学. 分析 参照Maxwei_wzj的题解. 因为成对的贡献比较难做,我们尝试把贡献算到每一个叶子节点上.我们发现按照题目中的收费方式,它等价于对于每棵 ...
- bzoj1495 [NOI2006]网络收费 复杂度分析+树上背包
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=1495 题解 通过观察可以发现,对于一个 \(lca\),如果 \(nA \leq nB\),那 ...
- BZOJ_1495_[NOI2006]网络收费_树形DP
BZOJ_1495_[NOI2006]网络收费_树形DP Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而, 不可忽视的一点就 ...
- 洛谷 P4297 [NOI2006]网络收费
P4297 [NOI2006]网络收费 题目背景 noi2006 day1t1 题目描述 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而,不可忽视的 ...
- 并不对劲的[noi2006]网络收费
题目略长,就从大视野上复制了. 听上去好像费用流,然而…… ***************************表示略长的题目的分界线************************ 1495: [ ...
- 【简】题解 P4297 [NOI2006]网络收费
传送门:P4297 [NOI2006]网络收费 题目大意: 给定一棵满二叉树,每个叶节点有一个状态(0,1),任选两个叶节点,如果这两个叶节点状态相同但他们的LCA所管辖的子树中的与他们状态相同的叶节 ...
随机推荐
- HttpPutFormContentFilter 和 ContextLoaderListener 讲解
1 ContextLoaderListener 继承自ContextLoader,并且实现ServletContextListener接口. 肯定得实现这个接口了,不然怎么作为Servlet的监听器呢 ...
- Atitit.故障排除系列---php 程序网站数据库错误排除流程
Atitit.故障排除系列---php 程序网站数据库错误排除流程 Php页面报告的错误不能定位到myusql的db配置上...字说是db conn err Mysql 接入错误...大概查看哈能不能 ...
- Linux Shell编程之常用技巧
前言 本文集中介绍了bash编程中部分高级编程方法和技巧.通过学习本文内容,可以帮你解决以下问题: 1.bash可以网络编程么? 2..(){ .|.& };. 据说执行这些符号可以死机,那么 ...
- Struts2初学 struts.xml详解 一
一.简介 Struts 2是一个MVC框架,以WebWork设计思想为核心,吸收了Struts 1的部分优点 二.详解 首先让我们看一下一个简单的struts.xml文件的结构 < ...
- js基本知识2
一.提示框 1. 弹出警示框 alert(); window.alert(); window 窗口 2. 控制台输出 console.log() 3. 文档打印 document 文档 documen ...
- 在编写JSP的时候出现XXX cannot be resolved to a type
今天遇到这个情况,却发现是eclipse抽风,说javax.servlet.http.Cookie找不到定义,但是经过浏览器测试,可以运行,而JSP源文件中eclipse死活要报错.表示无语. 关于e ...
- jquery 给表格tbody t 加事件
jquery给所有td加事件 $('#erji_list_table').on('click','td', function(){ $('#yuan_content').slideToggle(&qu ...
- 使用python对mysql主从进行监控,并调用钉钉发送报警信息
1.编写python的监控脚本 A.通过获取mysql库中的状态值来判断这个mysql主从状态是否正常 B.进行两个状态值的判断 C.进行调取钉钉机器人,发送消息 2.设置定时任务进行脚本运行 cro ...
- Photoshop学习笔记(1)--界面设置
根据慕课网教学视频整理(抄了一个妹子的评论): http://www.imooc.com/video/9813 ps版本:CS6 步骤: 1.视图->显示->智能参考线,以及视图-> ...
- 一款基于css3鼠标经过圆形旋转特效
今天给大家分享一款基于css3鼠标经过圆形旋转特效.当鼠标经过的时候图片边框颜色旋转,图片显示详情.该实例适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗 ...