P4297 [NOI2006]网络收费

题目背景

noi2006 day1t1

题目描述

网络已经成为当今世界不可或缺的一部分。每天都有数以亿计的人使用网络进行学习、科研、娱乐等活动。然而,不可忽视的一点就是网络本身有着庞大的运行费用。所以,向使用网络的人进行适当的收费是必须的,也是合理的。

MY 市NS 中学就有着这样一个教育网络。网络中的用户一共有 2^N2N 个,编号依次为1, 2, 3, …, 2^N2N 。这些用户之间是用路由点和网线组成的。用户、路由点与网线共同构成一个满二叉树结构。树中的每一个叶子结点都是一个用户,每一个非叶子结点(灰色)都是一个路由点,而每一条边都是一条网线(见下图,用户结点中的数字为其编号)。

MY 网络公司的网络收费方式比较奇特,称为“ 配对收费 ”。即对于每两个用户i, j (1≤i < j ≤ 2^N2N ) 进行收费。由于用户可以自行选择两种付费方式A、B中的一种,所以网络公司向学校收取的费用与每一位用户的付费方式有关。该费用等于每两位不同用户配对产生费用之和。

为了描述方便,首先定义这棵网络树上的一些概念:

  • 祖先:根结点没有祖先,非根结点的祖先包括它的父亲以及它的父亲的祖先;

  • 管辖叶结点:叶结点本身不管辖任何叶结点,非叶结点管辖它的左儿子所管辖的叶结点与它的右儿子所管辖的叶结点;

  • 距离:在树上连接两个点之间的用边最少的路径所含的边数。

对于任两个用户i, j (1≤i<j≤ 2^N2N ),首先在树上找到与它们距离最近的公共祖先:路由点P,然后观察P 所管辖的叶结点(即用户)中选择付费方式A 与B的人数,分别记为nA 与nB,接着按照网络管理条例第X 章第Y 条第Z 款进行收费(如下表),其中 F_{i,j}Fi,j​ 为i 和j 之间的流量,且为已知量。

由于最终所付费用与付费方式有关,所以NS 中学的用户希望能够自行改变自己的付费方式以减少总付费。然而,由于网络公司已经将每个用户注册时所选择的付费方式记录在案,所以对于用户i,如果他/她想改变付费方式(由A 改为B 或由B 改为A),就必须支付 C_iCi​ 元给网络公司以修改档案(修改付费方式记录)。

现在的问题是,给定每个用户注册时所选择的付费方式以及 C_iCi​ ,试求这些用户应该如何选择自己的付费方式以使得NS 中学支付给网络公司的总费用最少(更改付费方式费用+配对收费的费用)。

输入输出格式

输入格式:

输入文件中第一行有一个正整数N。

第二行有 2^N2N 个整数,依次表示1 号,2 号,…, 2^N2N 号用户注册时的付费方式,每一个数字若为0,则表示对应用户的初始付费方式为A,否则该数字为1,表示付费方式为B。

第三行有 2^N2N 个整数,表示每一个用户修改付费方式需要支付的费用,依次为 C_1C1​ , C_2C2​ , …, C_MCM​ 。( M= 2^N2N )

以下 2^N2N -1 行描述给定的两两用户之间的流量表F,总第(i + 3)行第j 列的整数为 F_{i, j+i}Fi,j+i​ 。(1≤i< 2^N2N ,1≤j≤ 2^N2N – i)

所有变量的含义可以参见题目描述。

输出格式:

你的程序只需要向输出文件输出一个整数,表示NS 中学支付给网络公司的最小总费用。(单位:元)

输入输出样例

输入样例#1: 复制

2
1 0 1 0
2 2 10 9
10 1 2
2 1
3
输出样例#1: 复制

8

说明

【样例说明】

将 1 号用户的付费方式由B 改为A,NS 中学支付给网络公司的费用达到最小。

40%的数据中N≤4;

80%的数据中N≤7;

100%的数据中N≤10,0≤Fi, j≤500,0≤C_iCi​≤500 000。

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1050
using namespace std;
int n,N,map[maxn][maxn],c[maxn],fa[maxn][maxn],ans=0x7fffffff,sum;
int cnt[maxn][];
int a[maxn];
int father[];
void make(int sta){
for(int i=;i<=n;i++)
if(sta&(<<i-))
a[i]^=,sum+=c[i];
}
int work(){
memset(cnt,,sizeof(cnt));
int s=;
for(int i=;i<N;i++)s+=<<i;
for(int i=;i<=n;i++){
if(a[i]==)cnt[i+s][]++;
else cnt[i+s][]++;
}
for(int i=s;i>=;i--){
cnt[i][]+=cnt[i*][]+cnt[i*+][];
cnt[i][]+=cnt[i*][]+cnt[i*+][];
}
for(int i=;i<=n;i++)
for(int j=i+;j<=n;j++){
int f=fa[i][j];
if(cnt[f][]<cnt[f][]){
if(a[i]==&&a[j]==)sum+=*map[i][j];
if(a[i]^a[j])sum+=map[i][j];
}
else {
if(a[i]==&&a[j]==)sum+=*map[i][j];
if(a[i]^a[j])sum+=map[i][j];
}
}
}
void findfather(){
int s=;
for(int i=;i<N;i++)s+=<<i;
for(int i=;i<=(<<N);i++)
for(int j=i+;j<=(<<N);j++){
int a1=s+i,a2=s+j;
while(a1!=a2)a1=father[a1],a2=father[a2];
fa[i][j]=a1;
}
}
int main(){
scanf("%d",&N);
n=<<N;
for(int i=;i<=(<<N);i++)
father[i*]=i,father[i*+]=i;
findfather();
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)scanf("%d",&c[i]);
for(int i=;i<n;i++)
for(int j=i+;j<=n;j++)
scanf("%d",&map[i][j]);
for(int sta=;sta<(<<n);sta++){
sum=;
make(sta);work();
ans=min(ans,sum);
make(sta);
}
printf("%d",ans);
return ;
}

40分 暴力

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 1030
using namespace std;
int n,m,a[maxn],t[maxn];
long long c[maxn],w[maxn][maxn],v[maxn][maxn],f[maxn<<][maxn];
void make(int x,int d){
if(!d)return;
make(x<<,d-);make(x<<|,d-);
for(int i=x<<d;i<((x<<)+)<<(d-);i++)
for(int j=((x<<)+)<<(d-);j<(x+)<<d;j++)
v[i-m][x]+=w[i-m][j-m],
v[j-m][x]+=w[i-m][j-m];
}
void dfs(int x,int d){
if(!d){
f[x][a[x-m]]=;
f[x][a[x-m]^]=c[x-m];
for(int i=x>>;i;i>>=)f[x][t[i]]+=v[x-m][i];
return;
}
memset(f[x],0x3f,sizeof(f[x]));
t[x]=;
dfs(x<<,d-);dfs(x<<|,d-);
for(int i=;i<=<<(d-);i++)
for(int j=;j<=(<<(d-))-i;j++)
f[x][i+j]=min(f[x][i+j],f[x<<][i]+f[x<<|][j]);
t[x]=;
dfs(x<<,d-);dfs(x<<|,d-);
for(int i=;i<=<<(d-);i++)
for(int j=(<<(d-))-i+;j<=<<(d-);j++)
f[x][i+j]=min(f[x][i+j],f[x<<][i]+f[x<<|][j]);
}
int main(){
long long ans=1LL<<;
scanf("%d",&n);m=<<n;
for(int i=;i<m;i++) scanf("%d",&a[i]);
for(int i=;i<m;i++) scanf("%lld",&c[i]);
for(int i=;i<m;i++)
for(int j=i+;j<m;j++)
scanf("%lld",&w[i][j]);
make(,n);
dfs(,n);
for(int i=;i<=m;i++)ans=min(ans,f[][i]);
printf("%lld",ans);
return ;
}

100分 树形背包(还没看懂)

洛谷 P4297 [NOI2006]网络收费的更多相关文章

  1. 【简】题解 P4297 [NOI2006]网络收费

    传送门:P4297 [NOI2006]网络收费 题目大意: 给定一棵满二叉树,每个叶节点有一个状态(0,1),任选两个叶节点,如果这两个叶节点状态相同但他们的LCA所管辖的子树中的与他们状态相同的叶节 ...

  2. 5.21 省选模拟赛 luogu P4297 [NOI2006]网络收费 树形dp

    LINK:网络收费 还是自己没脑子. 早上思考的时候 发现树形dp不可做 然后放弃治疗了. 没有合理的转换问题的模型是我整个人最大的败笔. 暴力也值得一提 爆搜之后可以写成FFT的形式的计算贡献的方法 ...

  3. 洛谷 P1546 最短网络 Agri-Net

    题目链接 https://www.luogu.org/problemnew/show/P1546 题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当 ...

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

    [BZOJ1495][NOI2006]网络收费 Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而,不可忽视的一点就是网络本身有 ...

  5. BZOJ_1495_[NOI2006]网络收费_树形DP

    BZOJ_1495_[NOI2006]网络收费_树形DP Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而, 不可忽视的一点就 ...

  6. 并不对劲的[noi2006]网络收费

    题目略长,就从大视野上复制了. 听上去好像费用流,然而…… ***************************表示略长的题目的分界线************************ 1495: [ ...

  7. 洛谷P1546 最短网络 Agri-Net(最小生成树,Kruskal)

    洛谷P1546 最短网络 Agri-Net 最小生成树模板题. 直接使用 Kruskal 求解. 复杂度为 \(O(E\log E)\) . #include<stdio.h> #incl ...

  8. 洛谷P2812校园网络【Network of Schools加强版】

    题目背景 浙江省的几所\(OI\)强校的神犇发明了一种人工智能,可以\(AC\)任何题目,所以他们决定建立一个网络来共享这个软件.但是由于他们脑力劳动过多导致全身无力身体被\(♂\)掏\(♂\)空,他 ...

  9. 【题解】洛谷P1262 间谍网络 (强连通分量缩点)

    洛谷P1262:https://www.luogu.org/problemnew/show/P1262 思路 一看题目就知道是强连通分量缩点 当图中有强连通分量时 将其缩点 我们可以用dfn数组判断是 ...

随机推荐

  1. MySQL 学习四 SQL优化

    MySQL逻辑架构: 第一层:客户端层,连接处理,授权认证,安全等功能.   第二层:核心层,查询解析,分析,优化,缓存,内置函数(时间,数学,加密),存储过程,触发器,视图   第三层:存储引擎.负 ...

  2. c++ 图解快速排序算法

    第一.算法描述 快速排序由C. A. R. Hoare在1962年提出,该算法是目前实践中使用最频繁,实用高效的最好排序算法, 快速排序算法是采用分治思想的算法,算法分三个步骤 从数组中抽出一个元素作 ...

  3. 三种web性能压力测试工具

    三种web性能压力测试工具http_load webbench ab小结 题记:压力和性能测试工具很多,下文讨论的是我觉得比较容易上手,用的比较多的三种 http_load 下载地址:http://w ...

  4. Plain text considered harmful: A cross-domain exploit

    referer:http://balpha.de/2013/02/plain-text-considered-harmful-a-cross-domain-exploit/ Data from aro ...

  5. node install webpack -cli webpack4.xxxx

    webpack 4.xx 版本 分离了 webpack-cli ; 安装webpack4.xx 需要再安装webpack-cli;

  6. TS封装格式

    ts流最早应用于数字电视领域,其格式非常复杂包含的配置信息表多达十几个,视频格式主要是mpeg2.苹果公司发明的http live stream流媒体是基于ts文件的,不过他大大简化了传统的ts流,只 ...

  7. 使用spring-loaded实现应用热部署

    作为一名Java开发者您是否会遇到这种情况:新增一个方法或字段必须重启tomcat才能对其进行调试? 有没有办法使得不重启tomcat就能调试呢.spring-loaded就可以. spring-lo ...

  8. JAVA语法规则总结

    单继承多实现 抽象类  抽象方法 使用关键字:abstract修饰的方法就是抽象方法; 抽象方法的形式:只有方法的声明,没有方法体; 抽象方法一般存在于父类中,相当于强制要求子类必须重写该方法,相当于 ...

  9. resize和reserve的区别

    转自http://blog.csdn.net/jackywgw/article/details/6248342 首先必须弄清楚两个概念: 1.capacity 指容器在分配新的存储空间之前能存储的元素 ...

  10. poj2287 Tian Ji -- The Horse Racing

    传送门 分析 这个题和传统的田忌赛马不一样的地方就是多了平局情况,所有我们不难想到要用dp.我们先将两人的马均降序排列,用dpij表示考虑前i匹马,田忌有几匹马是按从大到小的顺序从头取的(剩下的是从尾 ...