并不对劲的[noi2006]网络收费
题目略长,就从大视野上复制了。
听上去好像费用流,然而……
***************************表示略长的题目的分界线************************
1495: [NOI2006]网络收费
Description


Input
Output
你的程序只需要向输出文件输出一个整数,表示NS中学支付给网络公司的最小总费用。(单位:元)
Sample Input
1 0 1 0
2 2 10 9
10 1 2
2 1
3
Sample Output
***************************表示略长的题目结束了的分界线************************
这么长的题目告诉我们一定要学好政治。
收费方式看上去很复杂,实际上没有想象中那么复杂但是也很复杂,可以看成A少就收所有的A,B少就收所有的B。这样用前缀和就能解决收费的问题了。
根据N<10大概猜到应该是状压dp,进而猜出dp(x,y,z)表示到第x个点,有y个A(或y个B),且祖先的取舍方案为z的收费情况。
那么问题就来了:用dp[x][y][z]表示的话,空间总共要占(2^10)^3!这样空间肯定会出问题。能不能将其中两维合成一维呢?
经过一番不对劲的思考,发现每往下走一层,z就会增加一位,而y的最大值会减少一半。把这两维放在同一维似乎不错。
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<cstdlib>
#define maxm 5050
#define maxk 2050
using namespace std;
int dp[maxk][maxm],n,m,c[maxk],f[maxk][maxk];
int li[maxk],ri[maxk], ab[maxk];
int read()
{
int x=,f=;
char ch=getchar();
while(isdigit(ch)== && ch!='-')ch=getchar();
if(ch=='-')f=-;
while(isdigit(ch))x=x*+ch-'',ch=getchar();
return x*f;
}
int solve(int x,int y,int z,int l,int r,int lim)
{
li[x]=l,ri[x]=r;
int xi=x,xj=(z<<(lim+))|y;
if(dp[xi][xj]!=-)
{
return dp[xi][xj];
}
if(x>=m)
{
int tab,now=x-m+,sum=c[now]*(ab[now]!=y),lu,ru;
for(int lstu=x,u=x>>;u;lstu=u,u>>=)
{
tab=z&;
z>>=;
lu=(lstu!=(u<<))?li[u]:((li[u]+ri[u])>>)+;
ru=(lstu!=(u<<))?((li[u]+ri[u])>>):ri[u];
sum+=(f[now][ru]-f[now][lu-])*(tab!=y);
}
dp[xi][xj]=sum;
return sum;
}
else
{
int tmp=(z<<)|(y>(<<lim)-y),res=0x7fffffff,mi=(l+r)>>,siz=<<(lim-);
if(siz>y)siz=y;
for(int p=y-siz;p<=siz;p++)
{
int t=solve(x<<,p,tmp,l,mi,lim-)+solve((x<<)+,y-p,tmp,mi+,r,lim-);
res=min(res,t);
}
dp[xi][xj]=res;
return res;
}
}
int main()
{
//cout<<"Boy_next_door is playing game."<<endl;
n=read();
m=<<n;
for(int i=;i<=m;i++)
ab[i]=read();
for(int i=;i<=m;i++)
c[i]=read();
for(int i=;i<=m;i++)
for(int j=i+;j<=m;j++)
{
f[i][j]=read();
f[j][i]=f[i][j];
}
memset(dp,-,sizeof(dp));
for(int i=;i<=m;i++)
for(int j=;j<=m;j++)
f[i][j]=f[i][j-]+f[i][j];
int ans=0x7fffffff;
for(int i=;i<=m;i++)
{
int tmp1=solve(,i,,,m,n);
ans=min(ans,tmp1);
}
cout<<ans;
return ;
}
并不对劲的[noi2006]网络收费的更多相关文章
- 【BZOJ1495】[NOI2006]网络收费 暴力+DP
[BZOJ1495][NOI2006]网络收费 Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而,不可忽视的一点就是网络本身有 ...
- 洛谷 P4297 [NOI2006]网络收费
P4297 [NOI2006]网络收费 题目背景 noi2006 day1t1 题目描述 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而,不可忽视的 ...
- BZOJ_1495_[NOI2006]网络收费_树形DP
BZOJ_1495_[NOI2006]网络收费_树形DP Description 网络已经成为当今世界不可或缺的一部分.每天都有数以亿计的人使用网络进行学习.科研.娱乐等活动.然而, 不可忽视的一点就 ...
- 【简】题解 P4297 [NOI2006]网络收费
传送门:P4297 [NOI2006]网络收费 题目大意: 给定一棵满二叉树,每个叶节点有一个状态(0,1),任选两个叶节点,如果这两个叶节点状态相同但他们的LCA所管辖的子树中的与他们状态相同的叶节 ...
- 5.21 省选模拟赛 luogu P4297 [NOI2006]网络收费 树形dp
LINK:网络收费 还是自己没脑子. 早上思考的时候 发现树形dp不可做 然后放弃治疗了. 没有合理的转换问题的模型是我整个人最大的败笔. 暴力也值得一提 爆搜之后可以写成FFT的形式的计算贡献的方法 ...
- 【bzoj1495】[NOI2006]网络收费 暴力+树形背包dp
题目描述 给出一个有 $2^n$ 个叶子节点的完全二叉树.每个叶子节点可以选择黑白两种颜色. 对于每个非叶子节点左子树中的叶子节点 $i$ 和右子树中的叶子节点 $j$ :如果 $i$ 和 $j$ 的 ...
- BZOJ1495 [NOI2006]网络收费
题意 传送门 MY市NS中学,大概是绵阳市南山中学. 分析 参照Maxwei_wzj的题解. 因为成对的贡献比较难做,我们尝试把贡献算到每一个叶子节点上.我们发现按照题目中的收费方式,它等价于对于每棵 ...
- [NOI2006]网络收费
题面在这里 description 一棵\(2^n\)个叶节点的满二叉树,每个节点代表一个用户,有一个预先的收费方案\(A\)或\(B\); 对于任两个用户 \(i,j(1≤i<j≤2^n)i, ...
- BZOJ1495 [NOI2006]网络收费 【树形dp + 状压dp】
题目链接 BZOJ1495 题解 观察表格,实际上就是分\(A\)多和\(B\)两种情况,分别对应每个点选\(A\)权值或者\(B\)权值,所以成对的权值可以分到每个点上 所以每个非叶节点实际对应一个 ...
随机推荐
- [Python3网络爬虫开发实战] 1.9.5-Scrapyrt的安装
Scrapyrt为Scrapy提供了一个调度的HTTP接口,有了它,我们就不需要再执行Scrapy命令而是通过请求一个HTTP接口来调度Scrapy任务了.Scrapyrt比Scrapyd更轻量,如果 ...
- php - namespace篇
之前没有系统学习过PHP语言,直接上手TP框架了,所以认为namespace和use是TP框架的一部分,最近学习语言模块的时候遇到了这个问题,所以汇总了一下. PHP中命名空间可以解决两类问题: 用户 ...
- html页面加载初始化方法
js: 方法一: window.onload=function(){内容} 方法二(自己定义方法): function onload(){内容} onload(); jQuery: 方法一: $(do ...
- eclipse导入项目时报错不能运行问题的一个记录
一直用学校的云桌面,但是还是有一些地方不是很方便,必须要校园网以及需要离线保存: 碰到的问题:重新安装和云桌面一样版本的jdk9.0.4,以及tomcat9.0.12,以及eclipse-oxygen ...
- 基本dos
文件夹的操作: 进入指定盘符:盘符名+: dir:列出当前控制台下的所有文件以及文件夹 . cd +文件夹名称:进入指定文件夹 cd.. 返回上一级 cd \返回到当前目录的根目 ...
- [luoguP1042] 乒乓球(模拟)
传送门 终于过了这sb题了. 当初我连这道题都A不了(╯▔皿▔)╯ 代码 #include <cstdio> #include <iostream> #define N 100 ...
- Quartz.net框架使用
概述:Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔(或天)来调度作业.它实现了 ...
- Avro kafka(Producer-Consumer)
https://blog.csdn.net/mlljava1111/article/details/51376990
- csu - 1537: Miscalculation (模拟题)
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1537 因为给出的式子是必定合法的,只要用两个栈分别保存符号和数字.算出答案后和从左至右算的答案比对 ...
- JSON/xml、Processing 以及收集Java的设计模型
JSON简介: 1.基本介绍 JSON(JavaScriptObject Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于ECMAScript(欧洲计算机协会制定的js规范)的 ...