#2566. 「SDOI2018」荣誉称号

 

休闲游戏玩家小 Q 不仅在算法竞赛方面取得了优异的成绩,还在一款收集钻石的游戏中排名很高。 这款游戏一共有 n 种不同类别的钻石,编号依次为 1 到 n。小 Q 已经玩了这款游戏很久了,对于第 i 种钻石,他已经收集到了 ai 个。这款游戏最大的亮点就是,钻石只有一种获得途径,那就是从商城中 购买。具体来说,第 i 种钻石的单价为 bi 点券。为了鼓励玩家充值,每种钻石都没有数量上限,只要肯 充钱,就可以拥有任意多的钻石。但是这款游戏并没有开发 “丢弃道具” 功能,因此小 Q 不能通过丢弃 钻石去完成任务。 最近这款游戏推出了一个限时成就任务,完成任务的玩家可以获得荣誉称号,而完成任务条件则是: 给定正整数 k 和 m,对于任意一个整数 x(2k ≤ x ≤ n),ax + a⌊ x 2 ⌋ + a⌊ x 4 ⌋ + a⌊ x 8 ⌋ + ... + a⌊ x 2k ⌋ 都要是 m 的倍数。 高玩小 Q 当然想完成这个限时成就任务,但是在充钱之前他想知道他究竟需要多少点券才能完成这 个任务。请写一个程序帮助小 Q 计算最少需要的点券数量。

Input 第一行包含一个正整数 T,表示测试数据的组数。 每组数据第一行包含 9 个正整数 n, k, m, p, SA, SB, SC, A, B,其中 n 表示钻石种类数,k, m 表示任 务条件。 为了在某种程度上减少输入量,a[] 和 b[] 由以下代码生成:

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;
}
void gen(){
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;
}
}

如对数据的生成方式仍有疑问,请参考下发文件中的参考程序。

输出格式

对于每组数据,输出一行一个整数,即最少需要的点券数量。

样例

输入样例 1

2
3 1 2 3 11111 22222 33333 1 1
1 5
2 3
3 6
7 2 3 7 11111 22222 33333 1 1
6 9
4 5
3 7
5 2
2 4
1 7
9 6

输出样例 1

3
14

样例 2

见下发文件。

数据范围与提示

• 1 ≤ T ≤ 10,

• 1 ≤ k ≤ 10 且 2 k ≤ n,

• 1 ≤ p ≤ min(n, 100000),10000 ≤ SA, SB, SC ≤ 1000000,

• 1 ≤ A, B, ai , bi ≤ 107。

子任务 1(30 分):满足 1 ≤ n ≤ 1000 且 m = 2。

子任务 2(40 分):满足 1 ≤ n ≤ 10^5 且 m ≤ 200。

子任务 3(30 分):满足 1 ≤ n ≤ 10^7 且 m ≤ 200。

首先我们发现他是一颗完全二叉树。

对于一条深度为i的点,我们发现深度为i+k的点与他%m同余一个节点的两个叶子也同余。

于是我们可以将标号大于2^k的点去除,将他的贡献加到编号为1-2^k的点上。

我们处理出编号为1-2^k的点中将他%m的值改为j的最小代价g[i][j]

显然g可以用dp求出。

之后我们在大小为2^k的树上做树形dp。

f[i][j]表示节点i到叶子的和%m余j的最小代价。

答案为f[1][0]

 #include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<cstdio>
#define maxn 10000005
#define ll long long
using namespace std;
inline int read() {
int x=,f=;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-;
for(;isdigit(ch);ch=getchar()) x=x*+ch-'';
return x*f;
}
int T;int n,k,m;
unsigned int SA, SB, SC;int p, A, B;
int a[maxn],b[maxn];
unsigned int rng61(){
SA ^= SA << ;SA ^= SA >> ;SA ^= SA << ;
unsigned int t = SA;
SA = SB;SB = SC;SC ^= t ^ SA;
return SC;
}
void gen(){
n=read(),k=read(),m=read(),p=read();
scanf("%u%u%u%d%d",&SA, &SB, &SC, &A, &B);
for(int i = ; i <= p; i++)scanf("%d%d", &a[i], &b[i]);
for(int i = p + ; i <= n; i++){
a[i] = rng61() % A + ;
b[i] = rng61() % B + ;
}
}
ll g[][],f[][],sum[];
int lim;
void init() {
memset(g,,sizeof(g));
memset(sum,,sizeof(sum));
memset(f,,sizeof(f));
}
int main() {
T=read();
while(T--) {
gen();init();k++;
lim=(<<k)-;
int l=;
for(int i=;i<=n;i++) {
int j=i;
while((j>>l)>lim) l+=k;
j>>=l;
a[i]%=m;sum[j]+=b[i];
g[j][]+=(m-a[i])*b[i];
g[j][a[i]]-=m*b[i];
}
for(int i=;i<=lim;i++)
for(int j=;j<m;j++) g[i][j]+=g[i][j-]+sum[i];
for(int i=lim;i>=;i--) {
if(i*>lim) {
for(int j=;j<m;j++) f[i][j]=g[i][j];
continue;
}
for(int j=;j<m;j++) {
f[i][j]=214748364700000000ll;
for(int k=;k<m;k++) {
int tt=j-k;tt=tt<?tt+m:tt;
f[i][j]=min(f[i][j],f[i<<][tt]+f[(i<<)+][tt]+g[i][k]);
}
}
}
printf("%lld\n",f[][]);
}
}

[loj#2566][BZOJ5333] [Sdoi2018]荣誉称号 树形dp的更多相关文章

  1. BZOJ5333 [Sdoi2018]荣誉称号 【差分 + 树形dp】

    题目链接 BZOJ5333 题解 看到式子,立即想到二叉树上一个点及其\(k\)个父亲权值和[如果有的话]模\(m\)意义下为\(0\) 考虑如何满足条件 我们假设\(1\)号为第\(0\)层 那么我 ...

  2. bzoj5333: [Sdoi2018]荣誉称号

    请不要去改题目给的输入,不然你会wa穿... 这么故弄玄虚的题目,肯定要先转换问题 看到这个不断的除2想起别人家的线段树的写法...x的两个孩子是x<<1和x<<1|1 然后问 ...

  3. 2018.09.01 loj#2330. 「清华集训 2017」榕树之心(树形dp)

    传送门 树形dp好题啊. 我们用w[i]" role="presentation" style="position: relative;">w[ ...

  4. 【BZOJ5333】荣誉称号(动态规划)

    [BZOJ5333]荣誉称号(动态规划) 题面 BZOJ 洛谷 题解 今天早上贱狗老师讲的.然而我还是不会. 只好照着\(zsy\)代码大力理解一波. 首先观察等式,如果比较熟悉线段树,会发现就是线段 ...

  5. bzoj4455 & loj2091 [Zjoi2016]小星星 容斥原理+树形DP(+状压DP?)

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4455 https://loj.ac/problem/2091 题解 很不错的一道题.(不过在当 ...

  6. 树形DP 学习笔记

    树形DP学习笔记 ps: 本文内容与蓝书一致 树的重心 概念: 一颗树中的一个节点其最大子树的节点树最小 解法:对与每个节点求他儿子的\(size\) ,上方子树的节点个数为\(n-size_u\) ...

  7. P5405-[CTS2019]氪金手游【树形dp,容斥,数学期望】

    前言 话说在\(Loj\)下了个数据发现这题的名字叫\(fgo\) 正题 题目链接:https://www.luogu.com.cn/problem/P5405 题目大意 \(n\)张卡的权值为\(1 ...

  8. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  9. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

随机推荐

  1. linux配置虚拟机网络环境(老师要求的host-only)

    我这个人就是懒,这TMD是全天下最坑爹的缺点了,当然爆粗口也是缺点,让我发泄一下吧.T^T 从n久之前,开了hadoop课的一天,我就想着要配置好,结果两次课连眼镜都忘了带,可想而知是什么陪我度过了那 ...

  2. noip模拟赛 大芳的逆行板载

    题目背景 大芳有一个不太好的习惯:在车里养青蛙.青蛙在一个n厘米(11n毫米s)的Van♂杆子上跳来跳去.她时常盯着青蛙看,以至于突然逆行不得不开始躲交叉弹.有一天他突发奇想,在杆子上每1厘米为一个单 ...

  3. git fatal: 拒绝合并无关的历史的错误解决

    本地初始化的项目 与 github 版本不一致, 导致无法提交 $ git pull origin master 来自 https://github.com/itaken/python-login-d ...

  4. MSSQL Procudure Sample

    代码: USE [Internal_Timesheet] GO /****** Object: StoredProcedure [dbo].[ManageTSReminder] Script Date ...

  5. 企业CEO最核心的应该是销售意识

    一个企业的本质是赚利润,利润怎么来?靠卖东西,所以企业里面最重要的应该是销售人员.在一些500强的外企里有一个规定,没有做过销售的人是很难升到总经理的,在以色列的军队中,没有当过班长,是不可以被提拔为 ...

  6. 基本控件文档-UISwitch属性---iOS-Apple苹果官方文档翻译

    本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址 //转载请注明出处--本文永久链接:http://www.cnblogs.com/Ch ...

  7. (转)matlab练习程序(HOG方向梯度直方图)

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  8. 【洛谷 P1390】 公约数的和 (欧拉函数)

    题目链接 做过\(n\)遍这种题了... 答案就是\(\sum_{i=1}^{n}\sum_{j=1}^{n/i}[\varphi(j)*i]\) 线筛欧拉函数求前缀和直接算就行. #include ...

  9. python调参神器hyperopt

    一.安装 pip install hyperopt 二.说明 Hyperopt提供了一个优化接口,这个接口接受一个评估函数和参数空间,能计算出参数空间内的一个点的损失函数值.用户还要指定空间内参数的分 ...

  10. 【转】debian下的update-rc.d的使用

    在Linux系统下,一个Services的启动.停止以及重启通常是通过/etc/init.d目录下的脚本来控制的.然而,在启动或改变运行级别时, 是在/etc/rcX.d中来搜索脚本.其中X是运行级别 ...