HDU 4812 D Tree(树分治)

保姆级教程:用PCAN-View监控汽车CAN总线,从硬件连接到报文分析(附快捷键大全) 本文提供了一份详细的PCAN-View使用教程,涵盖从硬件连接到报文分析的全流程,特别适合汽车电子工程师和初学者。内容包括硬件准备、软件安装、核心功能操作、高级技巧及故障排查,并附有实用的快捷键大全,帮助用户高效监控和分析CAN总线数据。 阅读详情

题意:

一棵树,每个点有一个权值,求一对点的路径上的点的乘积取模后恰好为k,输出标号最小的点对

思路:

点分治
首先我们要求的是 (a*b)%mod=k 如果我们知道a,那么b就是(k*inv[a])%mod
而我们点分治的时候,先求出重心,然后处理出一颗子树上的点到root的乘积,然后乘root取模找逆元,看看map里面有没有,再把这些数存到map里。这样处理完一颗子树,然后把这棵子树的东西放进map,就能防止出现不合法的情况(路径没经过重心)
先求出所有逆元,然后重复上面步骤即可

错误及反思:

忘了换点对的大小结果wa了几发。。。

代码:

#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
const long long mod = 1e6 + 3;
const int N = 100100;
struct EDGE{
    int to,next;
}e[N*2];
int first[N],n,tot,si[N],maxn[N],k;
bool did[N];
long long ny[1001000],val[N];
map<long long,int> m;
pair<int,int> ans;
vector<pair<long long,int> > v;
void addedge(int x,int y){
    e[tot].to=y;
    e[tot].next=first[x];
    first[x]=tot++;
    e[tot].to=x;
    e[tot].next=first[y];
    first[y]=tot++;
}
void dfs_size(int now,int fa){
    si[now]=1;
    maxn[now]=0;
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=fa&&!did[e[i].to]){
            dfs_size(e[i].to,now);
            si[now]+=si[e[i].to];
            maxn[now]=max(maxn[now],si[e[i].to]);
        }
}
void dfs_root(int now,int fa,int& root,int& nu,int t){
    int MA=max(maxn[now],si[t]-si[now]);
    if(MA<nu){
        nu=MA;
        root=now;
    }
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=fa&&!did[e[i].to])
            dfs_root(e[i].to,now,root,nu,t);
}
void dfs2(int now,int fa,long long tlen){
    tlen%=mod;
    for(int i=first[now];i!=-1;i=e[i].next)
        if(e[i].to!=fa&&!did[e[i].to])
            dfs2(e[i].to,now,tlen*val[e[i].to]);
    v.push_back({tlen,now});
}
void solve(int now){
    int root,nu=1e9;
    m.clear();
    dfs_size(now,-1);
    dfs_root(now,-1,root,nu,now);
    did[root]=true;
    m[1]=root;
    for(int i=first[root];i!=-1;i=e[i].next){
        if(!did[e[i].to]){
            v.clear();
            dfs2(e[i].to,root,val[e[i].to]);
            for(int j=0;j<v.size();j++){
                long long ty=v[j].fi*val[root]%mod;
                int tx=m[ny[ty]*k%mod];
                if(tx){
                    int minn=min(v[j].se,tx);
                    int maxx=max(v[j].se,tx);
                    if(ans.fi==0){ ans.fi=minn,ans.se=maxx;}
                    else{
                        if(ans.fi>minn){
                            ans.fi=minn;
                            ans.se=maxx;
                        }
                        else if(ans.fi==minn)
                            ans.se=min(ans.se,maxx);
                    }
                }
            }
            for(int j=0;j<v.size();j++){
                if(m[v[j].fi]==0)
                    m[v[j].fi]=v[j].se;
                else m[v[j].fi]=min(v[j].se,m[v[j].fi]);
            }
        }
    }
    for(int i=first[root];i!=-1;i=e[i].next)
        if(!did[e[i].to])
            solve(e[i].to);
}
void init(){
    memset(first,-1,sizeof(first));
    tot=0;
    ans.fi=0;
    memset(did,false,sizeof(did));
}
int main(){
    ny[1] = 1;
    for(int i = 2; i < 1000100; i ++){
        ny[i] = (mod - mod / i) * 1ll * ny[mod % i] % mod;
    }
    while(scanf("%d%d",&n,&k)!=EOF){
        init();
        for(int i=1;i<=n;i++) scanf("%lld",&val[i]);
        for(int i=0,u,v;i<n-1;i++){
            scanf("%d%d",&u,&v);
            addedge(u,v);
        }
        solve(1);
        if(ans.fi) printf("%d %d\n",ans.fi,ans.se);
        else printf("No solution\n");
    }
}
Apache-Plc4x-Modbus-Tcp学习记录(一) 阅读详情

相关推荐

使用Bigemap下载地图流程

Bigemap地图下载简单流程,临时安排任务简单学习没有深入了解。

TKY666的博客 4846

hdu 4812 树分治

这种题目很不擅长,接下来要多加训练

t_xliang的专栏 841

XGBoost调参新姿势:Bayesian优化实战指南(附完整代码)

本文详细介绍了如何使用Bayesian优化方法高效调优XGBoost模型参数。通过解析Bayesian优化核心原理和XGBoost关键参数,提供完整的实战代码示例,帮助读者掌握这一智能调参技术,显著提升模型性能。文章特别适合机器学习工程师和数据科学家阅读。

weixin_42536058的博客 366

HDU 4812 D Tree 树分治+逆元处理

D Tree Problem Description 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 tree can be trea...

weixin_30552635的博客 163

基于SOEM的伺服电机控制实战:从配置到调试

本文详细介绍了基于SOEM的伺服电机控制实战,从硬件配置到软件调试的全过程。通过分享PDO映射、状态机控制、性能优化等核心技巧,帮助开发者快速掌握EtherCAT通信与伺服电机控制的关键技术,提升工控系统开发效率。

weixin_29165465的博客 520

Hypermesh到Abaqus CEL网格转换全攻略:解决欧拉体导入难题

本文详细解析了Hypermesh到Abaqus CEL网格转换的全流程,重点解决欧拉体导入难题。通过单元类型转换、INP文件编辑和多组件合并技术,实现流固耦合仿真的高效前处理。文章包含实用脚本和工程案例,帮助工程师突破ABAQUS CEL分析中的网格转换瓶颈。

weixin_30832143的博客 189

HDU4812 D Tree

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 tree can be treated as a connected graph with...

dezhen7015的博客 150

华为OD新系统机试真题 - 准备生日礼物(Py/Java/C/C++/Js/Go)

华为OD机试新系统真题 4.8【准备生日礼物】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【准备生日礼物】

qq_45776114的博客 1479

[HDOJ 4812][Vjudge 48318] D Tree [树的分治]

给定一颗树,点上有权值,问其上边是否有一条链,链上的点的权值的积模(10^6+3)恰好等于k。如果有解输出字典序最小的一组。 树的分治,先找重心,然后判断过重心的链,然后判断在每一个子树上的,即不过重心的链 #pragma comment(linker,"/STACK:102400000,102400000") #include #include #include #include

jinzhao1994的专栏 627

RK平台PCIE-Ethernet扩展:Intel I210移植与性能飞升之路

本文详细介绍了Intel I210千兆以太网控制器在瑞芯微RK平台的移植与优化过程。通过硬件适配、内核配置、驱动开发及性能调优四个关键环节,实现了RK平台的网络性能提升。硬件方面,重点说明了PCIE接口的规范连接与供电检查;软件方面,系统阐述了内核配置、设备树修改和驱动编译流程。在性能优化环节,详细介绍了中断优化、缓冲区设置和TCP/IP协议栈调优策略,并采用Iperf和Netperf工具进行量化测试验证。测试结果显示,优化后的网络吞吐量提升20%以上,延迟降低40%,为工业控制、智能安防等场景提供了可靠的

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 351

本地玩转AI还得靠这个,SillyTavern(酒馆)到底有多强?

SillyTavern是一款本地运行的LLM交互前端,支持文本生成、图像生成、语音合成等功能。它最初是TavernAI的分支,现已独立开发,社区活跃,功能更新频繁。SillyTavern通过前端UI和插件系统连接各种大模型后端,如OpenAI、KoboldAI等,用户可以在本地创建“虚拟酒馆”与各种角色对话。其功能亮点包括角色卡、角色记忆、世界设定、多人聊天室、自定义UI和行为脚本、插件扩展支持等。SillyTavern适合AI创作用户、AI工程师、LLM爱好者和AIGC创作者。它有两个维护分支:relea

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 8034

HDU-4812:D Tree(点分治)

D Tree Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 102400/102400 K (Java/Others) Problem Description There is a skyscraping tree standing on the playground of Nanjing University of Science a...

Mitsuha_的博客 484

uniapp ios原生插件开发 (framework,cocoapods)

已知UniApp的插件开发方式有两种, 第一种 Xcode Framework的方式,这种方式是官方指定的方式。 这种方式的优点就是简单直接, 但也有不足,比如当插件需要引入一些三方库时,操作起来就不是那么方便。 而使用Cocoapods则可以很方便的引入三方库。 接下来,本文探索使用Cocoapods的方式来进行UniApp插件开发。

Rey的技术博客 9823

HDU 4812 D Tree [树分治]

给出一棵树,点有权,问是否存在路径使其路径上的权值和MOD 1e6+3为K,若有输出字典序最小的点对<u,v>,否则输出No soluction

Asuna_acmer 696

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

hdu4812 D Tree(树分治)

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=4812 题意: 给定一棵树,N-1条边,K,每个结点都有一个权值。找到树上两个结点之间所有结点(包括起点和终点的结点)的权值乘积=K,若有多组答案,输出字典序最小的一组,否则输出"No solution"。 分析: 使用链式前向星的数据结构,不熟悉的先往这走:https://blog.csd...

qq619337301的博客 211

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

HDU 4812 D Tree(树分治)

 题意:给出n个点的树,每个结点有权值,求一条路径,使得路径上点的乘积对1e6+3取模的结果为K。 思路:13年南京现场赛的一道树分治,做法就是记录当前点到根的乘积,每次以重心分治的时候,要先计算当前子树里的点能否和其他点构成符合题意的路径,然后再更新结点到根的乘积,两次dfs就可以解决这个问题,这样保证了不会计算错误。 #include #include #include #inclu

GODSPEED 597

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HDU4812-D Tree-树分治

题目描述 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 tree can be treated as a connected graph wit...

T_T233333333的博客 330

HDU 4812 D Tree 树分治

题意: 给出一棵树,每个节点上有个权值。要找到一对字典序最小的点对\((u, v)(u < v)\),使得路径\(u \to v\)上所有节点权值的乘积模\(10^6 + 3\)的值为\(k\)。 分析: 比较经典的树分治。 对于分治过程中的一棵子树,我们统计两种情况: 一端为重心的路径中,到某个顶点乘积为\(k\)的路径。 两端在不同子树且过重心的路径中,乘积为\(k\)。 其他的递归...

weixin_30315723的博客 111

HDU - 4812 D Tree 树分治好题+逆元+HASH

题目链接:https://cn.vjudge.net/problem/HDU-4812 题意:找到两点路径上点乘积%mod=k,要求字典序最小 题解:之前写的都是容斥写的,也就是先处理根,然后减去孩子,但是这个要求明确找到两点,所以就不能这么搞了。因此要一个分支一个分支的处理,mp[i]记录下之前分支,根节点到某一点路径上的点乘积为i时的最小节点编号,因为a * b % mod = k, 已知...

还我笑颜 258

HDU 4812 D Tree (树分治之点分治)

题目大意: 给出一棵树, 顶点数 n 每个点有一个权值 给出K 询问这棵树中两点路径上的点的权值乘积对1e6 + 3取模之后等于K的路径的两个端点形成的点对中字典序最小的 大致思路: 点分治第二题 用f[i]表示从当前的子树根开始到某个点的路径乘积为i的点的最小标号 于是对于每一次分治, 去掉重心x之后, 依次处理每一棵子树来使得f的来源不一样 注意要预处理逆元

Gatevin的专栏 551

HDU 4812 D Tree 树分治+逆元+hash新姿势

题意: 给定n个点的树 K 下面n个数是点权 下面n-1行给出树边。 问: 是否存在一条路径使得路径上点权积 % mod  = K 若存在则输出路径的两端。 若存在多条路径则输出字典序最小的一条。 思路: 按树重心分治。 分成路径是否经过树重心。 然后用力码。。 has[x] = u; 表示乘积为x 对应的点是u 但这样has就不能用计数器来优化清空。

九野的博客 2883

D Tree HDU - 4812 (树分治+逆元线性预处理+map映射)

思路:首先一个最重要是思路:ai*aj%mod=k%mod 即a[i]=k*inv[a[j]]%mod。 所以对于一条路径上的乘积是否为k,我们考虑将其分成2部分,第一部分乘起来放map里,第二部分乘了以后去map里找,如果找到,说明有这样的组合可以乘积为k,既满足题意。 具体实现的思路自然是点分治,一次找重心做为根节点,需要注意的是,每次重新选根节点,都要清空map,因为重新找一颗子树时,相...

untilyouydc 350

HDU 4812 D Tree (2013-南京 树分治 + 逆元 + 离散化)

题意: 告诉你树上的点权, 问你是否存在一条路径,(u,v) 使得这条路上的点权乘积 % mod = K? 存在的话输出字典序最小的(u,v)不存在输出no solution 思路: 这种链上的题 基本就是树剖和分治。 树剖要枚举所有链把= =  不太好弄。 那就是分治了。 找到重心后, 肯定是要处理那些经过重心的链, 然后合并。  是否有解。 很容易想到的是 dfs每个点 到重心的

aozil_yang的博客 378

hdu 4812 D Tree(树的点分治)

D Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others) Total Submission(s): 1687    Accepted Submission(s): 263 Problem Description There is a skyscrapin

记录成长的点点滴滴. . . . . 1677

HDU 4812 D Tree (树上点分治)

题目地址:HDU 4812 这题是13年南京区域赛的现场题。 树分治思想。 树分治的过程中记录下每个子树的所有到达根的路径的积,用best记录下每个积的最小端点,然后再枚举当前子树的每个积,然后用逆元的方法求出当积为k时所需要的另一个端点值,并更新答案。 代码如下:#include <iostream> #include <string.h> #include <math.h> #inclu

scf0920 1412

HDU 4812 D Tree

Description 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 tree can be treated as a connected

Occult 902
上一篇: bzoj2599/洛谷4149 [IOI2011] Race(树分治)
下一篇: HDU 4015 Mario and Mushrooms (raney引理)
Roll_Keyboard
博客等级 码龄9年 10粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值