HDU 4812 (点分治)】的更多相关文章

题目:https://vjudge.net/contest/307753#problem/E 题意:给你一颗树,树上每个点都有个权值,现在问你是否存在 一条路径的乘积 mod 1e6+3  等于 k的路径,如果有找到字典序最小的方案 思路,树上路径~点分治    我们能知道每条路径的值,现在我们可以转化的问题是,怎么找一条路径等于K,和两条路径的乘积等于K,   首先第一种很明显就是判断相不相等即可,第二种的话,我们知道所有路径,我们怎么找到O(n)找到两个呢,我们用个数组存下所有是否出现过,然…
这道题非常巧妙!!! 我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是 当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点,所有绿色的子树节点的到当绿色的点权乘积 有如下的情况: 1*5*7  3*6*7 2*5*7 4*6*7 然后我们要想办法查询其他链上到红色节点的乘积,比如蓝色的所有子树到红色节点的乘积,以及这些乘积对应的链的尾部节点. 因此我们需要用逆元求,因为我们并不容易直接求出一条链上所有节点的点权乘积为K的链,但是我们可以…
D Tree Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 102400/102400 K (Java/Others)Total Submission(s): 3876    Accepted Submission(s): 743 Problem Description There is a skyscraping tree standing on the playground of Nanjing University of…
HDU 4812 思路: 点分治 先预处理好1e6 + 3以内到逆元 然后用map 映射以分治点为起点的链的值a 成他的下标 u 然后暴力跑出以分治点儿子为起点的链的值b,然后在map里查找inv[b]*k 代码: #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define pi acos(-1.0) #define LL long long //#define mp make_…
Mart Master II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 675    Accepted Submission(s): 237 Problem Description Trader Dogy lives in city S, which consists of n districts. There are n - 1…
http://acm.hdu.edu.cn/showproblem.php?pid=4812 题意:有一棵树,每个点有一个权值要求找最小的一对点,路径上的乘积mod1e6+3为k 题解:点分治,挨个把子树更新,每次把子树和现有的map里找满足条件的点对,然后更新子树到map里,map维护的是每个到根的乘积值最小的点. //#pragma comment(linker, "/stack:200000000") //#pragma GCC optimize("Ofast,no-s…
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 treated as a connected graph with N vertices, while each br…
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 skyscraping tree standing on the playground of Nanjing University of…
题意: 给出一棵树,每个节点上有个权值.要找到一对字典序最小的点对\((u, v)(u < v)\),使得路径\(u \to v\)上所有节点权值的乘积模\(10^6 + 3\)的值为\(k\). 分析: 比较经典的树分治. 对于分治过程中的一棵子树,我们统计两种情况: 一端为重心的路径中,到某个顶点乘积为\(k\)的路径. 两端在不同子树且过重心的路径中,乘积为\(k\). 其他的递归到子树中去. 这里要预处理乘法逆元. 子树合并的时候,需要用到一个小技巧性的hash,参考九野的博客. #in…
题目链接 题意 给一棵树,每个点上有一个权值,问是否存在一条路径(不能是单个点)上的所有点相乘并对1e6+3取模等于k,输出路径的两个端点.如果存在多组答案,输出字典序小的点对. 思路 首先,(a * b) % MOD = k,知道a和k,求b,可以使用逆元来求,于是可以想到用一个类似于map的东西(我这里的Hash数组,记录值为i的时候它的最小下标是多少)存路径长度为b的时候,那个端点是哪个点. 但是我一开始是想着先全部处理好,然后再O(MOD)判一遍,但是发现这种做法的话在有删除的情况下难以…