[HDU多校]Ridiculous Netizens
[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的更多相关文章
- Solution -「HDU 6643」Ridiculous Netizens
\(\mathcal{Description}\) Link. 给定一棵含有 \(n\) 个结点的树,点 \(u\) 有点权 \(w_u\),求树上非空连通块的数量,使得连通块内点权积 \(\ ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- 2015 HDU 多校联赛 5363 Key Set
2015 HDU 多校联赛 5363 Key Set 题目: http://acm.hdu.edu.cn/showproblem.php? pid=5363 依据前面给出的样例,得出求解公式 fn = ...
- 2015 HDU 多校联赛 5317 RGCDQ 筛法求解
2015 HDU 多校联赛 5317 RGCDQ 筛法求解 题目 http://acm.hdu.edu.cn/showproblem.php? pid=5317 本题的数据量非常大,測试样例多.数据 ...
- HDU - 6643: Ridiculous Netizens(点分治+依赖背包+空间优化)
题意:给定带点权的树,问多少个连通块,其乘积<=M; N<=2000,M<1e6; 思路:连通块-->分治: 由于普通的树DP在合并的时候复杂度会高一个M,所以用依赖背包来做. ...
- 【杂题总汇】HDU多校赛第十场 Videos
[HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...
- hdu多校1002 Balanced Sequence
Balanced Sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s) ...
- HDU多校(Distinct Values)
Problem Description Chiaki has an array of n positive integers. You are told some facts about the ar ...
随机推荐
- 十七、CI框架之数据库操作insert用法
一.代码如下: 二.我们访问一下页面 三.查看数据库,已经插入了一条数据 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码打赏任意金额给作者(微信号:382477247)哦,谢谢.
- php语言注意点
PHP大小写问题 http://www.jb51.net/article/38579.htm 推荐大家始终坚持“大小写敏感”,遵循统一的代码规范.1. 变量名区分大小写 2. 函数名.方法名.类名不区 ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring中Bean的作用域
作用域的种类 Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域.Spring3 为 Bean 定义了五种作用域,具体如下. 1)singleton 单例模式,使用 sing ...
- 19 01 08 javascript 初学
变量 JavaScript 是一种弱类型语言,javascript的变量类型由它的值来决定. 定义变量需要用关键字 'var' 变量类型 5种基本数据类型:1.number 数字类型2.string ...
- CSU_1414 Query On a Tree BFS序+DFS时间戳进行预处理
2014 csu校赛 I 题,比赛的时候拿着他看了几个小时愣是没弄出好的方法,我们也想过统计出每个root的节点总数,然后减去离它d层的子节点的数目,即为答案.但是因为树的存储是无序的,所以每次为了找 ...
- 【MySQL 组复制】1.组复制技术简介
组复制有两种模式 单主模式(single-primary/single-master)下自动选举出一个主节点,从而只允许在同一时刻只有该主节点可以更新数据. 对于MySQL的高级使用人员,可以通过复制 ...
- 吴裕雄--天生自然JAVA线程编程笔记:创建线程
public class ThreadRuning extends Thread{ public ThreadRuning(String name){ //重写构造,可以对线程添加名字 super(n ...
- 寒假day08
今天爬了部分与人才动态相关的数据,还刷了剑指offer的部分算法题
- Ubuntu的奇技淫巧
sudo apt-get install cmatrix 输入密码,安装后,按F11把terminal全屏,输入cmatrix -b sudo apt-get install sl 安装后执行sl,屏 ...
- php速成_day2
一.PHP中的多维数组 1.多维数组及其用途 多维数组用来存储多个元素,元素是一个数组的结构. 之前学习的数组,是一个一维数组. $person = array( 'name' => 'xiao ...