HDU - 4670 Cube number on a tree 点分治+哈希

河洛理数【陈抟】每月月卦推演每日运卦 Step2:每卦中的日爻遇到二十四节气中的当日为节(月初)或气(月中)的时候,所代表的日期需要变更。正常来说,屯卦分别代表初一到初六,但是由于当月初二时立秋节,所以初爻就不能作为初一、而是要作为立秋节开始时(文中还精算到了立秋是从初二的午时开始),如下。说的代表月运的基础卦上进行当月日卦的推演方式。老样子,我们还是按照书中举得例子卦在这边进行一步步的推演,最后做总结。Step1:从月卦爻下一爻开始,自下而上,进行五个爻的爻变,新推演的每个卦代表六天,如下。假设当月月卦是即济卦,月爻在二爻,如图所示( 阅读详情

题目:给你一棵n个节点的树,再给你K个质数,每个节点都有一个权值,权值都是由这些质数组成,路径的长度定义成路径上的节点的权值的 乘积,问有多少路径满足路径的长度是个立方数。

思路:点分治,用map哈希一下就好了。题目虽然说节点的权值范围内有0,但是数据应该没有0,不然这样做就错了

代码:

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<list>
#include<numeric>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define INF 0x3f3f3f3f
#define mm(a,b) memset(a,b,sizeof(a))
#define PP puts("*********************");
template<class T> T f_abs(T a){ return a > 0 ? a : -a; }
template<class T> T gcd(T a, T b){ return b ? gcd(b, a%b) : a; }
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
// 0x3f3f3f3f3f3f3f3f
// 0x3f3f3f3f


const int maxn=5e4+50;
struct Node{
    int v,next;
}edge[2*maxn];
int head[maxn],tol;//节点从1开始计数
int son[maxn],f[maxn],vis[maxn];
int dep[maxn][31],siz,d[maxn][31];
int cntv,root,K,ans;
LL prime[31];
int fac[maxn][31],num[31];
map<LL,int> mp;
void init(){
    mm(head,-1);tol=0;
    mm(vis,0);
    f[0]=INF;//一定要初始化成一个很大的值
}
void addedge(int u,int v){
    edge[tol].v=v;
    edge[tol].next=head[u];
    head[u]=tol++;
}
void getroot(int u,int fa){//寻找重心
    son[u]=1,f[u]=0;
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        if(v==fa||vis[v]) continue;
        getroot(v,u);
        son[u]+=son[v];
        f[u]=max(f[u],son[v]);
    }
    f[u]=max(f[u],cntv-son[u]);//sum表示当前树的大小
    if(f[u]<f[root]) root=u;//更新当前重心
}
void getdepth(int u,int fa){
    for(int j=0;j<K;j++)
        dep[siz][j]=d[u][j];
    siz++;
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        if(v==fa||vis[v]) continue;
        for(int j=0;j<K;j++)
            d[v][j]=(d[u][j]+fac[v][j])%3;
        getdepth(v,u);
    }
}
LL change(int *arr){
    LL res=0;;
    for(int i=0;i<K;i++)
        res=res*3+arr[i];
    return res;
}
bool judge(int *arr){
    for(int i=0;i<K;i++)
        if(arr[i]!=0)
            return false;
    return true;
}
void solve(int u){//计算以u为重心的树
    vis[u]=1;
    mp.clear();
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        if(vis[v]) continue;
        for(int j=0;j<K;j++) d[v][j]=fac[v][j];
        siz=0;
        getdepth(v,0);
        for(int j=0;j<siz;j++){
            for(int k=0;k<K;k++)
                num[k]=(dep[j][k]+fac[u][k])%3;
            if(judge(num)) ans++;
            for(int k=0;k<K;k++)
                num[k]=(3-num[k])%3;
            LL x=change(num);
            ans+=mp[x];
        }
        for(int j=0;j<siz;j++){
            LL x=change(dep[j]);
            mp[x]++;
        }
    }
    for(int i=head[u];i!=-1;i=edge[i].next){
        int v=edge[i].v;
        if(vis[v]) continue;
        cntv=son[v];
        root=0;
        getroot(v,0);
        solve(root);
    }
}
int main(){

    int n,u,v;
    LL w;
    while(~scanf("%d",&n)){
        init();
        scanf("%d",&K);
        for(int i=0;i<K;i++)
            scanf("%lld",&prime[i]);
        for(int i=1;i<=n;i++){
            scanf("%lld",&w);
            for(int j=0;j<K;j++){
                fac[i][j]=0;
                while(w%prime[j]==0){
                    fac[i][j]=(fac[i][j]+1)%3;
                    w/=prime[j];
                }
            }
        }
        for(int i=1;i<n;i++){
            scanf("%d%d",&u,&v);
            addedge(u,v);
            addedge(v,u);
        }
        cntv=n;
        root=0;
        getroot(1,0);
        ans=0;
        for(int i=1;i<=n;i++)
            if(judge(fac[i]))
                ans++;
        solve(root);
        printf("%d\n",ans);
    }
    return 0;
}


【华为OD机试真题】29、组成最大数 | 机试真题+思路参考+代码解析 (C++、Java、Py、C语言、JS) 题目描述 >小组中每位都有一张卡片,卡片上是6位内的正整数,将卡片连起来可以组成多种数字,计算组成的最大数字 阅读详情

相关推荐

STGCN实战:从零构建PyTorch时空图卷积网络预测城市交通流

本文详细介绍了如何使用PyTorch从零构建时空图卷积网络(STGCN)进行城市交通流预测。通过将交通网络建模为图结构,并融合时间卷积与空间图卷积,STGCN能有效捕捉交通流的时空依赖性。文章提供了从数据预处理、核心模块(TimeBlock与STGCNBlock)搭建、模型训练到实战技巧的完整指南,帮助开发者快速掌握这一前沿的交通速度预测技术。

wasm7browser的博客 246

2024“钉耙编程”中国大学生算法设计超级联赛(1)

然后就想题目给k是什么意思,呃原来是abcd的范围是[0,2^k),那也就是说这四个数最大k位呗。直接枚举每一位,如果n当前是1就乘上12,否则乘4,然后右移即可。因为位运算是按照每一位来计算,所以第一反应是根据表达式推结果为1的时候有多少种情况,那么情况总数就是每一位的情况数相乘。这题第一眼云的时候感觉是贪心,后来要上手写代码感觉无从下手,遂反映过来是动态规划。看懂题之后就知道,a是小串,要找出b中有多少个子串在a+a中出现过。然后就是一个很简单的dp,外层枚举物品,里面枚举价值。

m0_74183164的博客 1601

【达梦8】多实例监视集群的部署测试

确认监视器具有状态确认和自动接管两个功能。在数据守护系统的故障自动切换模式下,必须部署一个确认监视器,否则在出现数据库故障时,会导致数据库服务中断。DM 提供了两种确认监视器的配置形式,分别为单实例和多实例。但是当单实例确认监视器故障时,无法继续进行集群的故障自动接管和备库故障确认,影响正常使用,故提供了多实例确认监控器来进一步提高集群的高可用性。在多实例确认监视器中,只有一个实例作为确认监视器提供服务,其它实例作为备库存在而不提供服务。

weixin_45335507的博客 1674

H - Happy Matt Friends HDU - 5119 (dp+位运算)

H - Happy Matt Friends  HDU - 5119  题意:给定n个数,从中分别取出0个,1个,2个...n个,并把他们异或起来,求大于m个总的取法。 思路:背包,第i个数,取和不取,两种状态,所以状态转移方程为dp[i][j] = dp[i-1][j] + dp[i-1][j^a[i]]; 代码: #include #include #includ

The_star_is_at的博客 440

知识检索中的四大评估指标:准确率、精确率、召回率与F1分数详解

摘要:NLP算法面试中,评估知识检索系统的核心指标包括准确率、精确率、召回率和F1分数。准确率衡量整体预测正确性,但在样本不均衡时可能失真;精确率关注预测正类中的真实比例(查准能力),召回率衡量真实正类被预测的比例(查全能力)。F1分数是两者的调和平均,提供综合评估。这些指标通过混淆矩阵计算,并存在制约关系:提高召回率往往降低精确率,反之亦然。应用场景包括文档检索(评估结果质量和覆盖度)和文本分类(如垃圾邮件过滤)。面试需掌握指标区别、适用场景及平衡方法(如调整阈值)。F1分数在样本不平衡时比准确率更具参考

Ven%的博客 1762

水文地质人必备:用Origin Pro 2023手把手教你搞定Piper三线图(附数据模板)

本文详细介绍了如何使用Origin Pro 2023绘制专业级Piper三线图,适用于水文地质数据分析。从数据准备、百分比计算到图表参数设置,提供全流程指导,并附赠数据模板和样式预设文件,帮助用户快速掌握这一水文地球化学分析的核心工具。

weixin_30568591的博客 532

hdu 4812 D Tree 树的点分治

题意 : 给你一棵树 , 每棵树有权值 , 问是否有一条路径

Lisz的专栏 709

大模型微调框架之TRL

近年来,大语言模型(LLMs)的快速发展推动了下游应用的繁荣,但如何高效地对这些模型进行对齐和微调,依然是研究与应用的热点。Hugging Face 开源的 TRL(Transformer Reinforcement Learning) 框架,提供了基于强化学习的语言模型训练方法,并支持 SFT(监督微调)、PPO(近端策略优化)、DPO(直接偏好优化)等多种方式,是目前对齐和微调 LLM 的重要工具。

和大家一起涨芝士 903

hdu 4670 Rating(概率论)

设dp【i】为i分到i+1所需场次的

u012659423的专栏 614

基于步科(Kinco HMI 2.5)的组态软件使用

本篇介绍Kinco HMI 2.5的组态软件使用,图标如下 目录   一、新建工程并配置连接 1.1 根据工程选择PLC与HMI型号 1.2 配置PLC连接与选项 二、组态画面编辑 2.1 打开画面窗口 2.2 编辑画面 2.3 组态变量与PLC程序变量连接 三、组态程序下载到HMI 3.1 连接 3.2 编译 3.3 下载 一、新建工程并配置连接 1.1 根据工...

ACanswer的专栏 1万+

【CAD】【手把手带你写一个DXF&JAVA解析框架】02——整理DXF元数据实体类,涵盖重要属性与对照组码

本文系统梳理了DXF文件解析中的核心元数据类,重点分析了Tables段(图层、块记录)、Blocks段和Entities段的关键数据结构。通过详细的组码说明和对照代码实现,阐述了图层定义(DXFLayer)、块记录(DXFBlockRecord)、应用程序标识(DXFAppId)等表对象的属性构成;同时解析了直线(DXFLine)、多段线(DXFLwPolyLine)、圆弧(DXFArc)、文字(DXFText)等实体类的几何特征与属性定义。文章还构建了顶点(Vertex)、基类(DXFEntity、DXF

Wonder ZH 267

【HDU】4812 D Tree 点分治

传送门:【HDU】4812 D Tree 题目分析:

poursoul 1006

20、Citrix 云桌面常见VDA注册问题汇总

本文总结了与 VDA 中出现的 VDA 会话断开连接、注册、会话卡住以及挂起/崩溃相关的主要支持文章。

我在Citrix、VMware、Veeam、微软和NVIDIA等领域拥有丰富经验的专业人士,专注于设计和维护虚拟化基础设施、实施备份与灾难恢复策略,致力于优化企业的IT环境。 942

【点分治】【map】【哈希表】hdu4670 Cube number on a tree

求树上点权积为立方数的路径数。 显然,分解质因数后,若所有的质因子出现的次数都%3==0,则该数是立方数。 于是在模意义下暴力统计即可。 当然,为了不MLE/TLE,我们不能存一个30长度的数组,而要压成一个long long。 存储状态用map即可,貌似哈希表可以随便卡掉……? 手动开栈……当然这样有可能MLE,所以还得改一些BFS…… <法一>map: #prag...

weixin_34334744的博客 97

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

HDOJ 4670: Cube number on a tree

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4670 题目大意: 树的每个节点有一个点权,所有的点权都可以被给定的30个质数表示出来。 在树上找合法点对。 合法点对指的是,两点间路径上的所有点(含端点)的点权乘积是立方数的点对。 注意:点对中的两个点可以是相同的,这个坑了我好久,切~ 算法: 树的点分治。 每次处

frog的小池塘 1364

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【树的分治】 HDU 4670 Cube number on a tree

点击打开链接 可将点权转化为三进制 树的分治:根据子树的节点数最小 求出树的重心 保证了复杂度尽量小 对于重心节点 的一棵子树搜一遍得到所有到那个子结点的权值积 与已经搜过的权值积 相乘 然后计算答案 #include #include #include #include #include #include using namespace std; typedef long l

Kewowlo 732

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

HDU4670 Cube number on a tree 树分治

人生的第一道树分治,要是早点学我南京赛就不用那么挫了,树分治的思路其实很简单,就是对子树找到一个重心(Centroid),实现重心分解,然后递归的解决分开后的树的子问题,关键是合并,当要合并跨过重心的两棵子树的时候,需要有一个接近O(n)的方法,因为f(n)=kf(n/k)+O(n)解出来才是O(nlogn).在这个题目里其实就是将第一棵子树的集合里的每个元素,判下有没符合条件的...

weixin_30741653的博客 145

2013 多校第七场 hdu 4670 Cube number on a tree(树上点的分治)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=4670 题目大意:给你一棵有n个顶点的树,每个节点有一个权值,给你k个prime,每个权值都可以由这k个prime的幂次方的和组成,问你在树上有多少条路径,使这条路径上的点的权值积是一个立方数。 思路:一个数是立方数,当且只当它的拆分成的所有质因子都是幂都是3的倍数,而质因子的4、7次幂和1次幂一样,5

沉溺的专栏 930

hdu4670 Cube number on a tree(点分治)

题意:每个顶点有一个权值,求权值乘积为立方数的路径个数。路径节点数可以为1。 解法:典型的树分治。 1.dfs求出通过中心的每个子树中路径长度集合,在已经遍历的子树中路径长度集合中找到每条路径的“补路径”个数,,即乘积为立方数的路径。累加起来即为结果 要点: 1.用a数组记录每个子树的路径长度集合 2.用map标记已遍历的子树路径长度及其个数

acmer的随记 494

HDU - 4670 (点分治 + 状压 + map(卡unordered_map))

Cube number on a tree The country Tom living in is famous for traveling. Every year, many tourists from all over the world have interests in traveling there. There are n provinces in the country. Acco...

Error Man 的博客 298

HDU - 4812,点分治

D Tree https://vjudge.net/problem/48318/origin There is a skyscraping tree standing on the playground of Nanjing University of Science and Technology. On each branch of the tree is an integer (The tre...

xing_mo的博客 831

HDU4670-Cube number on a tree

Cube number on a tree                                                                 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)                        

wang_128的博客 465

hdu 4670 点分治 + 哈希

这场比赛是我和杰哥两个人搞的,搞了三个小时才做两个题,几何题感觉有点思路,但最近做的不多,就懒得搞,最后想了想,反正队友搞不出其他题,自己艹出一个做的比较少的题娱乐一下吧,瞄了瞄做的比较少的题,1005,求合法点对的数量,这种题一眼题啊,分治 + 统计,XWLJ了,稍微推了下calc的过程,中间统计的时候一开始想用map,然后杰哥说可能爆吧,然后由于是比赛的后半期,也就懒得想,开了个哈希表就开始写

努力奋斗才能梦想成真 1760

hdu 4670 树的分治-求点对的个数

/* 树的分治 因为树的点权值可达到10^15,注意手动扩栈,还有int64 题意:给你一棵树,给你一些素数,给你每个点一个权值且每个权值均可由这些素数组成。现在定义任意任意两点的价值为他们路径上的权值相乘。求这样的点对的权值为立方数的个数 解: 如果直接求得话会超int64,不可行 由立方数的性质可得,一个数可有素数组成,对于这些素数可以分解为这些素数相乘的形式如,24=(2^3)*(3...

weixin_30326745的博客 164

hdu 4670 (树的分治)

题目链接  经典的男人八题的改编题目, 从边权到了点权, 而且每个节点有30个三进制的状态, 但其实做法还是和原来大同小异的在处理子问题时需要用到一个map, 复杂度为n * log(n) * log(n) * 30 #include #include #include #include #include #include #include using namespac

一个人的生活 1201

HDU 4670 Cube number on a tree ( 树的点分治 )

题意 : 给你一棵树 , 树的每个结点都有一个权值 , 问你有多少条路径权值的乘积是一个完全立方数 。 题目中给了你 K 个素数 ( K 思路 : 一个完全立方数的素因子个数都是三的倍数 , 所以我们只要求各个素数的个数就行了 , 并且我们只关心个数对三的余数 所以我们可以用一个 长整形来表示每个结点到根的各个素因子的个数( 三进制压缩 ) 。不过因为用位运算会快一点 , 所以我用

Lisz的专栏 1046
上一篇: hdu4812 D Tree
下一篇: hdu4871 Shortest-path tree
我不会额
博客等级 码龄11年 2粉丝 173原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值