[HDU多校]Ridiculous Netizens

  • 点分治

    • 分成两个部分:对某一点P,连通块经过P或不经过P.
    • 经过P采用树形依赖背包
    • 不经过P的部分递归计算
  • 树型依赖背包

    • v点必须由其父亲u点转移过来
    • 即必须经过P点
    • \(dp[v][s*a[v]]+=dp[u][s]\)
    • 第二维代表连通块的乘积
    • 第一维代表经过该点并且一定经过P点的方案数
    • 所以最后父节点还要加上子节点的方案数
  • 空间优化

    • 第二维不能开这么大
    • 稍稍转变含义,改成还能"装下"多少体积
    • \(\lfloor \frac{m}{s}\rfloor\)就可以划分很多个等价的状态
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn = 2010;
const int mod = 1e9+7;
struct edge{
int to,next;
}e[maxn<<1];
ll val[maxn],kuai[maxn];
ll dp[maxn][maxn];
int nowN,rt,maxP,head[maxn],tol,cnt,n;
int Size[maxn];
bool vis[maxn<<1];
ll ans;
int m;
inline void Mod(ll &a,ll b){
a=a+b<mod?a+b:a+b-mod;
}
void init(int n){
tol=1;
for(int i=0;i<=n;++i){
head[i]=0;
}
rt=0;
cnt=ans=0;
}
void add(int u,int v){
tol++;
vis[tol]=0;
e[tol].to=v;
e[tol].next=head[u];
head[u]=tol;
}
void get_rt(int u,int fa){
int max_part=0;
Size[u]=1;
for(int i=head[u],v;i;i=e[i].next){
v=e[i].to;
if(vis[i]||v==fa)continue;
get_rt(v,u);
Size[u]+=Size[v];
max_part=max(max_part,Size[v]);
}
max_part=max(nowN-Size[u],max_part);
if(max_part<maxP){
maxP=max_part;
rt=u;
}
}
void dfs(int u,int fa){
for(int i=1;i<=cnt;++i) dp[u][i]=0;
ll k=val[u],t;
for(int i=1,j=1;i<=cnt;++i){
t=kuai[i]/k;
if(t==0)break;
while(kuai[j]>t)++j;
Mod(dp[u][j],dp[fa][i]);
}
for(int i=head[u],v;i;i=e[i].next){
if(vis[i]) continue;
v=e[i].to;
if(v==fa) continue;
dfs(v,u);
for(int j=1;j<=cnt;++j) Mod(dp[u][j],dp[v][j]);
}
}
void calc(){
dp[0][1]=1;
dfs(rt,0);
for(int i=1;i<=cnt;++i) Mod(ans,dp[rt][i]);
for(int i=head[rt],v;i;i=e[i].next){
if(vis[i])continue;
v=e[i].to;
vis[i^1]=1;
nowN=Size[v];
maxP=n+5;
rt=0;
get_rt(v,0);
calc();
}
}
int main(){
int _;
scanf("%d",&_);
while(_--){
scanf("%d%d",&n,&m);
init(n);
for(int i=1;i<=n;++i)scanf("%lld",&val[i]);
for(int i=1;i<=m;i=m/(m/i)+1){
kuai[++cnt]=m/i;
}
for(int i=1,u,v;i<n;++i){
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
nowN=n;
maxP=n+5;
get_rt(1,1);
calc();
printf("%lld\n",ans);
}
return 0;
}

代码量还是集中在点分治,不过套班子即可

DP还是好理解的.

[HDU多校]Ridiculous Netizens的更多相关文章

  1. Solution -「HDU 6643」Ridiculous Netizens

    \(\mathcal{Description}\)   Link.   给定一棵含有 \(n\) 个结点的树,点 \(u\) 有点权 \(w_u\),求树上非空连通块的数量,使得连通块内点权积 \(\ ...

  2. 2018 HDU多校第四场赛后补题

    2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...

  3. 2018 HDU多校第三场赛后补题

    2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...

  4. 2015 HDU 多校联赛 5363 Key Set

    2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php? pid=5363 依据前面给出的样例,得出求解公式 fn = ...

  5. 2015 HDU 多校联赛 5317 RGCDQ 筛法求解

    2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目  http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据 ...

  6. HDU - 6643: Ridiculous Netizens(点分治+依赖背包+空间优化)

    题意:给定带点权的树,问多少个连通块,其乘积<=M; N<=2000,M<1e6; 思路:连通块-->分治: 由于普通的树DP在合并的时候复杂度会高一个M,所以用依赖背包来做. ...

  7. 【杂题总汇】HDU多校赛第十场 Videos

    [HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...

  8. hdu多校1002 Balanced Sequence

    Balanced Sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s) ...

  9. HDU多校(Distinct Values)

    Problem Description Chiaki has an array of n positive integers. You are told some facts about the ar ...

随机推荐

  1. https://www.jianshu.com/p/fc78dab5736f

    在学习Swift 3的过程中整理了一些笔记,如果想看其他相关文章可前往<Swift 3必看>系列目录 swift 3中对C层级的GCD的API进行了彻头彻尾的改变.本文将从实际使用场景来了 ...

  2. HZNU-ACM寒假集训Day2小结 二分答案

    Day2 ---二分 这里直接给出模板 两种对应不同的情况 可以借助数轴理解 int bsearch_1(int l, int r) { while (l < r) { ; if (check( ...

  3. .NET Core开发实战(第11课:文件配置提供程序)--学习笔记

    11 | 文件配置提供程序:自由选择配置的格式 文件配置提供程序 Microsoft.Extensions.Configuration.Ini Microsoft.Extensions.Configu ...

  4. redis常用命令--zsets

    zsets常用命令: zadd key score1 mb1 [score2 mb2....]:像key中添加元素和这个元素的分数,如果元素已经存在,则替换分数. zscore key mb :获取k ...

  5. 应用架构的演进--MVC,RPC,SOA,微服务架构

    MVC架构:垂直应用架构 当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率. 当业务规模很小时,将所有功能都部署在同一个进程中,通过双机或者前置负载均衡 ...

  6. 第七届(16年)蓝桥杯java B组决赛真题 愤怒的小鸟 解题思路

    愤怒小鸟 X星球愤怒的小鸟喜欢撞火车! 一根平直的铁轨上两火车间相距 1000 米两火车 (不妨称A和B) 以时速 10米/秒 相对行驶. 愤怒的小鸟从A车出发,时速50米/秒,撞向B车,然后返回去撞 ...

  7. JAVA多线程的基础

    线程与进程的区别 1.线程与进程 每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行.也可以把它理解为代码运行的上下文.所 ...

  8. Java中Scanner类在nextInt()后无法输入nextLine()的问题

    首先,Scanner是一个扫描器,它扫描数据都是去内存中一块缓冲区中进行扫描并读入数据的,而我们在控制台中输入的数据也都是被先存入缓冲区中等待扫描器的扫描读取.这个扫描器在扫描过程中判断停止的依据就是 ...

  9. 直击JDD | 徐雷:智能化零售,以技术为驱动力的突破路径

    "京东零售已经成为一家典型的以技术驱动为主的零售公司".在11月19日召开的 2019京东全球科技探索者大会上,京东零售集团CEO徐雷首次阐释了京东零售的智能化零售路径. 徐雷指出 ...

  10. Block实现代理/通知效果

    例子1:A控制器->跳转—>B控制器 , 假设想从B控制器回传数组给A控制器 实现:B控制器.h文件定义一个block参数,.m文件执行block,A控制器设置block内容 B.h文件/ ...