热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

EDTreeHDU4812点分治+逆元

这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点,

这道题非常巧妙!!!

我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是

当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点,所有绿色的子树节点的到当绿色的点权乘积

技术分享图片

 

有如下的情况:

1*5*7  3*6*7

2*5*7 4*6*7

然后我们要想办法查询其他链上到红色节点的乘积,比如蓝色的所有子树到红色节点的乘积,以及这些乘积对应的链的尾部节点。

技术分享图片

因此我们需要用逆元求,因为我们并不容易直接求出一条链上所有节点的点权乘积为K的链,但是我们可以通过搜索出所有当前节点的乘积,然后查询逆元长度的链条是否存在,更加方便的求出答案。

比较抽象。。。多打几遍就懂了。。。

#pragma comment(linker,"/STACK:102400000,102400000")
#include
#include
#include
#include
#define LL long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxx = 2e5+6;
const int MOD = 1000003;
int ver[maxx],head[maxx],Next[maxx],q[maxx];
int sz[maxx],mp[MOD+10],vis[maxx],a[maxx],id[maxx];
int inv[MOD+10];
int tot,mx,size,root,l,r,ansx,ansy,k;
inline int read()
{
int x=0;char ch=getchar();
while(ch<‘0‘||ch>‘9‘)ch=getchar();
while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();}
return x;
}
void add(int u,int v){
ver[++tot]=v;Next[tot]=head[u];head[u]=tot;
ver[++tot]=u;Next[tot]=head[v];head[v]=tot;
}
///求重心
void getroot(int u,int fa){
sz[u]=1;
int num=0;
for (int i=head[u];i;i=Next[i]){
int v=ver[i];
if (v==fa||vis[v])continue;
getroot(v,u);
sz[u]+=sz[v];
num=max(num,sz[v]);
}
num=max(num,size-sz[u]);
if (num}
///求子树的链的点权积
void getdis(int u,int fa,int val){
q[++r]=val;
id[r]=u;
for (int i=head[u];i;i=Next[i]){
int v=ver[i];
if (v==fa || vis[v])continue;
getdis(v,u,(LL)val*a[v]%MOD);
}
}
///检查逆元所对应的长度是否存在
void check(int x,int val){
int w=(LL)inv[val]*k%MOD;
int y=mp[w];
if (y==0||x==y)return;
if (x>y)swap(x,y);
if (x ansx=x;
ansy=y;
}
return;
}
void solve(int u){
vis[u]=1;
mp[a[u]]=u;
///求出当前节点的子树对应的点权积
for (int i=head[u];i;i=Next[i]){
int v=ver[i];
if (vis[v])continue;
r=0;
getdis(v,u,a[v]);
for (int j=1;j<=r;j++){
check(id[j],q[j]);
}
///把所有子树链的乘积再乘上当前节点的权值,
///这样保存使得另外一颗子树的一条链能够轻松找到另外一条不和自己在同一个子树内且点权乘积为K的长度
for (int j=1;j<=r;j++){
q[j]=(LL)q[j]*a[u]%MOD;
int now=mp[q[j]];
if (now==0 || now>id[j]){
mp[q[j]]=id[j];
}
}
}
mp[a[u]]=0;
///要继续点分治,父亲节点的信息以及没有用了
for (int i=head[u];i;i=Next[i]){
int v=ver[i];
if(vis[v])continue;
r=0;
l=1;
getdis(v,u,(LL)a[u]*a[v]%MOD);
for(int j=1;j<=r;j++){
mp[q[j]]=0;
}
}
for (int i=head[u];i;i=Next[i]){
int v=ver[i];
if (vis[v])continue;
size=sz[v];
mx=INF;
getroot(v,0);
solve(root);
}
}
int main(){
inv[1]=1;
for (int i=2;i inv[i]=(LL)(MOD-(MOD/i))*inv[MOD%i]%MOD;
}
int n;
while(~scanf("%d%d",&n,&k)){
for(int i=1;i<=n;i++){
a[i]=read();
}
tot=0;
memset(mp,0,sizeof(mp));
int u,v;
for (int i=1;i<=n;i++){
vis[i]=0;
head[i]=0;
}
tot=0;
for (int i=1;i u=read();
v=read();
add(u,v);
}
ansx=INF;
ansy=INF;
mx=INF;
size=n;
getroot(1,0);
solve(root);
if (ansx==INF){
printf("No solution\n");
}else {
printf("%d %d\n",ansx,ansy);
}
}
return 0;
}

  

 


推荐阅读
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 本题探讨了一种字符串变换方法,旨在判断两个给定的字符串是否可以通过特定的字母替换和位置交换操作相互转换。核心在于找到这些变换中的不变量,从而确定转换的可能性。 ... [详细]
  • 技术分享:从动态网站提取站点密钥的解决方案
    本文探讨了如何从动态网站中提取站点密钥,特别是针对验证码(reCAPTCHA)的处理方法。通过结合Selenium和requests库,提供了详细的代码示例和优化建议。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • C++: 实现基于类的四面体体积计算
    本文介绍如何使用C++编程语言,通过定义类和方法来计算由四个三维坐标点构成的四面体体积。文中详细解释了四面体体积的数学公式,并提供了两种不同的实现方式。 ... [详细]
  • 扫描线三巨头 hdu1928hdu 1255  hdu 1542 [POJ 1151]
    学习链接:http:blog.csdn.netlwt36articledetails48908031学习扫描线主要学习的是一种扫描的思想,后期可以求解很 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 前言--页数多了以后需要指定到某一页(只做了功能,样式没有细调)html ... [详细]
  • 本文详细解析了Python中的os和sys模块,介绍了它们的功能、常用方法及其在实际编程中的应用。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
author-avatar
小爬虫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有