【BZOJ5333】荣誉称号(动态规划)
【BZOJ5333】荣誉称号(动态规划)
题面
题解
今天早上贱狗老师讲的。然而我还是不会。
只好照着\(zsy\)代码大力理解一波。
首先观察等式,如果比较熟悉线段树,会发现就是线段树的前\(k\)个祖先
而线段树是完全二叉树,也就所有东西形成了一个完全二叉树。
并且任意节点和它的前\(k\)次祖先的和都要是\(0\)(以下都是在模\(m\)意义下)
所以,我们可以轻易推出一个结论,\(x\)节点和\(x\)的\(k\)次祖先同余。
所以,我们只需要考虑前\(k\)层就好了,剩下的点全部可以按照同余的关系归并到了一起。
这样子节点个数就从\(10^7\)降到了\(2^{11}\)
现在也就是任意一个叶子节点到根节点的和都是要\(0\)
那么直接\(dp\)
设\(f[i][j]\)表示第\(i\)个节点到达它所有儿子的路径和都是\(j\)的最小代价。
转移的时候考虑一下儿子的权值是多少以及当前点是多少。
当前点变成某个权值的代价可以提前预处理。
这样子复杂度就是\(O(2^km^2)\)了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define MAX 11111111
#define W 2050
unsigned int SA,SB,SC;int p,A,B;
unsigned int rng61()
{
SA^=SA<<16;SA^=SA>>5;SA^=SA<<1;
unsigned int t=SA;
SA=SB;SB=SC;SC^=t^SA;
return SC;
}
int n,k,m,a[MAX],b[MAX],fa[MAX];
ll val[W][200],sum[W],cal[W][200],f[W][200];
void init()
{
memset(val,0,sizeof(val));memset(sum,0,sizeof(sum));
memset(cal,0,sizeof(cal));memset(f,63,sizeof(f));
scanf("%d%d%d%d%u%u%u%d%d",&n,&k,&m,&p,&SA,&SB,&SC,&A,&B);
for(int i=1;i<=p;i++)scanf("%d%d",&a[i],&b[i]);
for(int i=p+1;i<=n;i++)a[i]=rng61()%A+1,b[i]=rng61()%B+1;
for(int i=n+1;i<(1<<(k+1));++i)a[i]=b[i]=0;n=max(n,(1<<(k+1))-1);
for(int i=1;i<=n;++i)
{
a[i]%=m;
if(i<(1<<(k+1)))fa[i]=i;
else fa[i]=fa[i>>(k+1)];
val[fa[i]][0]+=a[i]?b[i]*(m-a[i]):0;
sum[fa[i]]+=b[i];cal[fa[i]][a[i]]+=b[i]*m;
}
for(int i=1;i<(1<<(k+1));++i)
for(int j=1;j<m;++j)
val[i][j]=val[i][j-1]+sum[i]-cal[i][j];
}
int main()
{
int T;scanf("%d",&T);
while(T--)
{
init();
for(int i=1<<k;i<(1<<(k+1));++i)
for(int j=0;j<m;++j)f[i][j]=val[i][j];
for(int i=(1<<k)-1;i;--i)
for(int j=0;j<m;++j)
for(int l=0;l<m;++l)
f[i][j]=min(f[i][j],f[i<<1][(j-l+m)%m]+f[i<<1|1][(j-l+m)%m]+val[i][l]);
printf("%lld\n",f[1][0]);
}
return 0;
}
【BZOJ5333】荣誉称号(动态规划)的更多相关文章
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- BZOJ5333 [Sdoi2018]荣誉称号 【差分 + 树形dp】
题目链接 BZOJ5333 题解 看到式子,立即想到二叉树上一个点及其\(k\)个父亲权值和[如果有的话]模\(m\)意义下为\(0\) 考虑如何满足条件 我们假设\(1\)号为第\(0\)层 那么我 ...
- [loj#2566][BZOJ5333] [Sdoi2018]荣誉称号 树形dp
#2566. 「SDOI2018」荣誉称号 休闲游戏玩家小 Q 不仅在算法竞赛方面取得了优异的成绩,还在一款收集钻石的游戏中排名很高. 这款游戏一共有 n 种不同类别的钻石,编号依次为 1 到 n ...
- BZOJ5333:[SDOI2018]荣誉称号——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=5333 https://www.luogu.org/problemnew/show/P4620 题意 ...
- bzoj5333: [Sdoi2018]荣誉称号
请不要去改题目给的输入,不然你会wa穿... 这么故弄玄虚的题目,肯定要先转换问题 看到这个不断的除2想起别人家的线段树的写法...x的两个孩子是x<<1和x<<1|1 然后问 ...
- 增强学习(三)----- MDP的动态规划解法
上一篇我们已经说到了,增强学习的目的就是求解马尔可夫决策过程(MDP)的最优策略,使其在任意初始状态下,都能获得最大的Vπ值.(本文不考虑非马尔可夫环境和不完全可观测马尔可夫决策过程(POMDP)中的 ...
- 简单动态规划-LeetCode198
题目:House Robber You are a professional robber planning to rob houses along a street. Each house has ...
- 动态规划 Dynamic Programming
March 26, 2013 作者:Hawstein 出处:http://hawstein.com/posts/dp-novice-to-advanced.html 声明:本文采用以下协议进行授权: ...
- 动态规划之最长公共子序列(LCS)
转自:http://segmentfault.com/blog/exploring/ LCS 问题描述 定义: 一个数列 S,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 ...
随机推荐
- mybatis逆向工程 mbg运行java代码时提示找不到MBG.xml的解决方法
这里要写全路径才能找到文件
- jquery.validate使用 - 4
自定义错误消息的显示方式 默认情况下,验证提示信息用label元素来显示, 并且会添加css class, 通过css可以很方便设置出错控件以及错误信息的显示方式. /* 输入控件验证出错*/form ...
- [C++]boost dijkstra获得两点间的最短路
需求是只需要得到两点间的最短路,不需要求得单源对于全图的最短路,使用boost中的dijsktra_shortest_path,当得到目标点的最短路时直接throw exception. #inclu ...
- docker部署war包到阿里云
最近买了个阿里云服务器,配置1核2g内存,学习够了.记录下过程. 1,服务器相关,请看下图,云服务器主要配置是安全组和密钥,前者是开放端口,后者可以用于远程连接(比如我windows系统通过putty ...
- 【Linux 运维】 date的使用
date的使用 一.常用时间格式 #年.月.日 四位年大写,其余小写 [root@localhost ~]# date +%Y #长格式显示四位数年 [root@localhost ~]# date ...
- Ubuntu系统下在PyCharm里用virtualenv集成TensorFlow
我的系统环境 Ubuntu 18.04 Python3.6 PyCharm 2018.3.2 community(免费版) Java 1.8 安装前准备 由于众所周知的原因,安装中需要下载大量包,尽量 ...
- Wacom发布Cintiq Companion 2
全新的Cintiq Companion 2是一款强大的平板电脑,让创意专业人士获得最佳的屏幕笔触,让创意随时随地进行.用户还可以在家中或工作时连接到Mac或PC电脑获得无与伦比的灵活性! 2015年1 ...
- 华为中兴借eBay出海 靠零售渠道撬动市场
在跨境电商领域,大多数中国商家依靠“中国制造”的优势和价格战策略打拼出一条血路,在海外市场占领了自己的一席 之地.不过,山寨货纷纷出海的同时,中国本土的品牌商们也开始了探索海外市场之旅.目前,华为.中 ...
- 原生开发小程序 和 wepy 、 mpvue 对比
1.三者的开发文档以及介绍: 原生开发小程序文档:点此进入 wepy 开发文档:点此进入 mpvue 开发文档:点此进入 2.三者的简单对比: 以下用一张图来简单概括三者的区别: 小程序支持的是 WX ...
- scrum立会报告+燃尽图(第三周第二次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2284 项目地址:https://coding.net/u/wuyy694 ...