请不要去改题目给的输入,不然你会wa穿。。。

这么故弄玄虚的题目,肯定要先转换问题

看到这个不断的除2想起别人家的线段树的写法。。。x的两个孩子是x<<1和x<<1|1

然后问题就转换成给你一棵树,你可以增加树的权值,要让树上每一条长度为k+1的链上的点权和%m都等于0

先%m把取值范围降到[0,m-1]

观察一下性质,假如通过加权确定了根节点的点权=d,就确定了所有和它距离为k+1的点的点权必须也要变成d

据此我们把点分成k+1组,那是不是每一组的点权都要变成相同的呢?

然而并不,正确的答案应该是这棵树上面的前2^(k+1)-1个点,它们的点权是不受约束的,然后它们覆盖了下面的所有点

我们可以处理出一个c数组,表示第i组全部改成j的花费

然后就是裸的树包了

然而暴力处理c只能得到70分的好成绩,能不能再优化一下呢

我想法是上一个线段树,然而其实可以先把ci,0处理出来,然后DP出其他的值

ci,j=ci,j-1+∑bk(k属第i组)  - m*∑u(u属第i组且初始值为u)bu

两个∑都是可以预处理的,所以是O(2^k*m)的复杂度

背包O(2^k*m^2)没什么毛病

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL; int n,k,m,Bin[];LL a[],b[];
unsigned int SA, SB, SC;int p, A, B;
unsigned int rng61(){
SA ^= SA << ;
SA ^= SA >> ;
SA ^= SA << ;
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 = ; i <= p; i++)scanf("%lld%lld", &a[i], &b[i]);
for(int i = p + ; i <= n; i++){
a[i] = LL(rng61() % A + );
b[i] = LL(rng61() % B + );
}
} //-----------------------------scanf----------------------------------------- LL c[][],sum[];//和i点合并,一起变成j的费用cij
void dfs(int x)
{
if(x>n)return ; int f=x;
while(f/Bin[k]>)f/=Bin[k]; if(a[x]!=)
{
if(f==)
{
int t;t++;
}
c[f][]+=(LL(m)-a[x])*b[x];
c[f][a[x]]-=b[x]*m;
}
sum[f]+=b[x]; dfs(x<<);
dfs(x<<|);
}
void getc()
{
for(int i=;i<Bin[k];i++)
for(int j=;j<m;j++)
c[i][j]+=c[i][j-]+sum[i];
} //------------------------------------init---------------------------------------------------- LL f[][];
void treeDP(int x)
{
if(x*>=Bin[k])
{
memcpy(f[x],c[x],sizeof(f[x]));
return ;
} int lc=x<<,rc=x<<|;
treeDP(x<<);
treeDP(x<<|); for(int i=;i<m;i++)
for(int j=;j<m;j++)
{
int u=(i-j+m)%m;
f[x][i]=min(f[x][i],f[lc][u]+f[rc][u]+c[x][j]);
}
} int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
Bin[]=;for(int i=;i<=;i++)Bin[i]=Bin[i-]*;
int T;
scanf("%d",&T);
while(T--)
{
gen();k++;
for(int i=;i<=n;i++)a[i]%=m;
memset(c,,sizeof(c));
memset(sum,,sizeof(sum));
dfs();
getc(); memset(f,,sizeof(f));
treeDP();
printf("%lld\n",f[][]);
}
return ;
}

bzoj5333: [Sdoi2018]荣誉称号的更多相关文章

  1. [loj#2566][BZOJ5333] [Sdoi2018]荣誉称号 树形dp

    #2566. 「SDOI2018」荣誉称号   休闲游戏玩家小 Q 不仅在算法竞赛方面取得了优异的成绩,还在一款收集钻石的游戏中排名很高. 这款游戏一共有 n 种不同类别的钻石,编号依次为 1 到 n ...

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

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

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

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

  4. BZOJ5333:[SDOI2018]荣誉称号——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=5333 https://www.luogu.org/problemnew/show/P4620 题意 ...

  5. [SDOI2018]荣誉称号

    题解: 并不需要什么算法 首先我们随便画一画就会发现 能画出一颗满二叉树 然后要满足每个点从上往下的路径和都相同(%m意义下) 一个点上可能对应了多个点 然后这样我们可以暴力dp $2^k*m^2+n ...

  6. SDOI2018

    SD的题有点反人类啊... d1t1[SDOI2018]物理实验 感觉比较好想但不太好写,写了一半弃了 d1t2[SDOI2018]战略游戏 建出圆方树,每次建虚树,答案就是虚树上的原点个数减去询问的 ...

  7. SDOI2018:荣誉称号

    题解: https://files.cnblogs.com/files/clrs97/title-solution.pdf Code: #include<cstdio> #include& ...

  8. [SDOI2018] 旧试题

    推狮子的部分 \[ \sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sigma(ijk) =\sum_{i=1}^A\sum_{j=1}^B\sum_{k=1}^C\sum_ ...

  9. 【BZOJ5332】[SDOI2018]旧试题(数论,三元环计数)

    [BZOJ5332][SDOI2018]旧试题(数论,三元环计数) 题面 BZOJ 洛谷 题解 如果只有一个\(\sum\),那么我们可以枚举每个答案的出现次数. 首先约数个数这个东西很不爽,就搞一搞 ...

随机推荐

  1. oracle备份表和数据

    oracle 备份数据 如果备份表存在 原表t_base_employee,备份表t_base_employee20180718 insert into t_base_employee0718 sel ...

  2. 【ITOO 5】启用MSDTC后的各种问题,以及解决方案

    导读:在上篇博客中说到,通过启动微软的msdtc来实现分布式事务处理,随后,问题就来了,现在,一一总结这个过程中的问题. 一.已禁用对分布式事务管理器(MSDTC)的网络访问. 1.1,问题描述 已禁 ...

  3. 【RMAN】RMAN跨版本恢复(下)--大版本异机恢复

    [RMAN]RMAN跨版本恢复(下)--大版本异机恢复 BLOG文档结构图 ORACLE_SID=ORA1024G 关于10g的跨小版本恢复参考:http://blog.chinaunix.net/u ...

  4. Oracle臨時表空間過大問題解決

    查詢資料庫伺服器時,發現資料庫伺服器磁片使用空間達到了98%,分析總共的資料檔案也不可能達到如此大,經過查詢發現原來臨時表空間的使用方式達到了 32G,導致磁碟空間使用緊張.搜索了相應的文檔與資料後, ...

  5. [Usaco2006 Nov] Fence Repair 切割木板

    Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1356  Solved: 714[Submit][Status][Discuss] Description ...

  6. jQuery根据属性模糊匹配元素

    1.查看带有指定属性的元素: [attribute] 例如: $("div[id]") 2.查看属性值是某个特定值的元素: [attribute=value] 例如: $(&quo ...

  7. PB编译

    java -jar wire-compiler-1.8.0-jar-with-dependencies.jar --java_out=./  ngame.proto 其中java_out是指输出要放在 ...

  8. hdu3622 2-sat问题,二分+判断有无解即可。

    /*2-sat问题初破!题意:每一对炸弹只能选一个(明显2-sat),每个炸弹半径自定,爆炸范围不可 相交,求那个最小半径的最大值(每种策略的最小半径不同).思:最优解:必然是选择的点最近 的俩个距离 ...

  9. java构造方法的特点和理解--三只坚果

    构造方法的特点:1.首先构造方法是基于类,名字必须与类的名字完全相同(构造方法一般是自己编写的类需要初始化)2.每个类都有一个默认的构造方法,既无参数又无返回值,其作用是使用new操作符创建新对象后初 ...

  10. makefile的语法及写法

    什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和professional的程序员,makefile还是要 ...