题意:

给定一棵 n 个点的树,每个点有权值 Vi

问是否存在一条路径使得路径上所有点的权值乘积 mod(10^6 + 3) 为 K

输出路径的首尾标号,若有多解,输出字典序最小的解

对于100%的数据,有1≤n≤10^5,0≤K≤10^6+2,1≤vi ≤10^6+2

思路:RYZ作业

预处理逆元

哈希路径权值乘积的模数,保存编号用来查询

  1. const mo=;
  2. var head,vet,next,len,flag,son:array[..]of longint;
  3. f:array[..]of longint;
  4. dis,a:array[..]of int64;
  5. q:array[..,..]of longint;
  6. exf:array[..mo]of int64;
  7. hash:array[..mo]of longint;
  8. n,m,i,j,tot,x,y,z,ans1,ans2,sum,root,top,k:longint;
  9.  
  10. procedure add(a,b:longint);
  11. begin
  12. inc(tot);
  13. next[tot]:=head[a];
  14. vet[tot]:=b;
  15. head[a]:=tot;
  16. end;
  17.  
  18. function max(x,y:longint):longint;
  19. begin
  20. if x>y then exit(x);
  21. exit(y);
  22. end;
  23.  
  24. procedure swap(var x,y:longint);
  25. var t:longint;
  26. begin
  27. t:=x; x:=y; y:=t;
  28. end;
  29.  
  30. function getroot(u,fa:longint):longint;
  31. var e,v:longint;
  32. begin
  33. son[u]:=; f[u]:=;
  34. e:=head[u];
  35. while e<> do
  36. begin
  37. v:=vet[e];
  38. if (v<>fa)and(flag[v]=) then
  39. begin
  40. getroot(v,u);
  41. son[u]:=son[u]+son[v];
  42. f[u]:=max(f[u],son[v]);
  43. end;
  44. e:=next[e];
  45. end;
  46. f[u]:=max(f[u],sum-f[u]);
  47. if f[u]<f[root] then root:=u;
  48. end;
  49.  
  50. procedure dfs(u,fa:longint);
  51. var e,v:longint;
  52. begin
  53. inc(top); q[top,]:=dis[u]; q[top,]:=u;
  54. e:=head[u];
  55. while e<> do
  56. begin
  57. v:=vet[e];
  58. if (v<>fa)and(flag[v]=) then
  59. begin
  60. dis[v]:=dis[u]*a[v] mod mo;
  61. dfs(v,u);
  62. end;
  63. e:=next[e];
  64. end;
  65. end;
  66.  
  67. procedure cmp(x,id:longint);
  68. var y:longint;
  69. begin
  70. x:=exf[x]*k mod mo;
  71. y:=hash[x];
  72. if y= then exit;
  73. if y>id then swap(y,id);
  74. if (y<ans1)or((y=ans1)and(id<ans2)) then
  75. begin
  76. ans1:=y; ans2:=id;
  77. end;
  78. end;
  79.  
  80. procedure solve(u:longint);
  81. var e,v,i,now:longint;
  82. begin
  83. flag[u]:=; hash[a[u]]:=u;
  84. e:=head[u];
  85. while e<> do
  86. begin
  87. v:=vet[e];
  88. if flag[v]= then
  89. begin
  90. top:=; dis[v]:=a[v];
  91. dfs(v,u);
  92. for i:= to top do cmp(q[i,],q[i,]); //对于每一个子树,因为不能重复计算u这个根结点,分别计算子树内结果,后面再用加上根结点的答案更新
  93. top:=; dis[v]:=a[u]*a[v] mod mo;
  94. dfs(v,u);
  95. for i:= to top do
  96. begin
  97. now:=hash[q[i,]];
  98. if (now=)or(q[i,]<now) then hash[q[i,]]:=q[i,]; //用子树中的路径加上根结点,更新经过根结点的答案
  99. end;
  100. end;
  101. e:=next[e];
  102. end;
  103. hash[a[u]]:=;
  104. e:=head[u];
  105. while e<> do
  106. begin
  107. v:=vet[e];
  108. if flag[v]= then
  109. begin
  110. top:=; dis[v]:=a[u]*a[v] mod mo;
  111. dfs(v,u);
  112. for i:= to top do hash[q[i,]]:=; //清空所有信息
  113. end;
  114. e:=next[e];
  115. end;
  116. e:=head[u];
  117. while e<> do
  118. begin
  119. v:=vet[e];
  120. if flag[v]= then
  121. begin
  122. root:=; sum:=son[v];
  123. getroot(v,);
  124. solve(root);
  125. end;
  126. e:=next[e];
  127. end;
  128. end;
  129.  
  130. begin
  131. assign(input,'hdoj4812.in'); reset(input);
  132. assign(output,'hdoj4812.out'); rewrite(output);
  133. exf[]:=; exf[]:=;
  134. for i:= to do exf[i]:=exf[mo mod i]*(mo-mo div i) mod mo;
  135. while not eof do
  136. begin
  137. // fillchar(head,sizeof(head),);
  138. //fillchar(flag,sizeof(flag),);
  139. for i:= to n do
  140. begin
  141. head[i]:=; flag[i]:=;
  142. end;
  143. tot:=; ans1:=maxlongint; ans2:=maxlongint;
  144. read(n,k);
  145. if n= then break;
  146. for i:= to n do read(a[i]);
  147. for i:= to n- do
  148. begin
  149. read(x,y);
  150. add(x,y);
  151. add(y,x);
  152. end;
  153. root:=; sum:=n; f[]:=n+;
  154. getroot(,);
  155. solve(root);
  156. if ans1=maxlongint then writeln('No solution')
  157. else writeln(ans1,' ',ans2);
  158. end;
  159. close(input);
  160. close(output);
  161. end.

【HDOJ4812】D Tree(点分治)的更多相关文章

  1. hdoj4812 D Tree(点分治)

    题目链接:https://vjudge.net/problem/HDU-4812 题意:给定一颗带点权的树,求是否存在一条路经的上点的权值积取模后等于k,如果存在多组点对,输出字典序最小的. 思路: ...

  2. 【BZOJ-1468】Tree 树分治

    1468: Tree Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1025  Solved: 534[Submit][Status][Discuss] ...

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

    D Tree Problem Description   There is a skyscraping tree standing on the playground of Nanjing Unive ...

  4. POJ 1741 Tree 树分治

    Tree     Description Give a tree with n vertices,each edge has a length(positive integer less than 1 ...

  5. [bzoj 1468][poj 1741]Tree [点分治]

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  6. 【CF434E】Furukawa Nagisa's Tree 点分治

    [CF434E]Furukawa Nagisa's Tree 题意:一棵n个点的树,点有点权.定义$G(a,b)$表示:我们将树上从a走到b经过的点都拿出来,设这些点的点权分别为$z_0,z_1... ...

  7. POJ 1741 Tree(点分治点对<=k)

    Description Give a tree with n vertices,each edge has a length(positive integer less than 1001). Def ...

  8. POJ 1741.Tree 树分治 树形dp 树上点对

    Tree Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 24258   Accepted: 8062 Description ...

  9. poj 1744 tree 树分治

    Tree Time Limit: 1000MS   Memory Limit: 30000K       Description Give a tree with n vertices,each ed ...

  10. CF1039D You Are Given a Tree 根号分治,贪心

    CF1039D You Are Given a Tree LG传送门 根号分治好题. 这题可以整体二分,但我太菜了,不会. 根号分治怎么考虑呢?先想想\(n^2\)暴力吧.对于每一个要求的\(k\), ...

随机推荐

  1. SQL快速备份

    ALTER  PROCEDURE [dbo].[usp_Backup_DataBase]    (      @BackupDataBaseName VARCHAR(128)    )AS    BE ...

  2. pandas之groupby分组与pivot_table透视表

    zhuanzi: https://blog.csdn.net/qq_33689414/article/details/78973267 pandas之groupby分组与pivot_table透视表 ...

  3. [小记]Android缓存问题

    今天晚上,产品经理打电话说我们的Android App除了问题,问题很简单就是一个缓存问题,由于这个程序是前同事写的,我也只能呵呵一笑,有些事你就得扛.还是回到正题吧,这个缓存问题,实在有点奇葩,所以 ...

  4. ASP.Net TextBox只读时不能通过后台赋值取值

    给页面的TextBox设置ReadOnly="True"时,在后台代码中不能赋值取值,下边几种方法可以避免: 1.不设置ReadOnly,设置onfocus=this.blur() ...

  5. bat获取注册表值

    @echo off Setlocal enabledelayedexpansion for /f "skip=2 delims=: tokens=1,*" %%i in ('reg ...

  6. leetcode_486. Predict the Winner

    https://leetcode.com/problems/predict-the-winner/ 题目描述:给定一个非负的积分数组,玩家1可以从数组两端任取一个积分,接着玩家2执行同样的操作,直至积 ...

  7. CLUSTER - 根据一个索引对某个表集簇

    SYNOPSIS CLUSTER indexname ON tablename CLUSTER tablename CLUSTER DESCRIPTION 描述 CLUSTER 指示PostgreSQ ...

  8. 进程的互斥运行:CreateMutex函数实现只运行一个程序实例

    HANDLE hMutex=CreateMutex(NULL,TRUE,"HDZBUkeyDoctorTool"); if(hMutex) { if(ERROR_ALREADY_E ...

  9. 【原】简单shell练习(三)

    1.软链 linux下的软链接类似于windows下的快捷方式 # ln -s /home/gamestat /gamestat  ln -s a b  中的 a 就是源文件(已经存在的文件),b是链 ...

  10. ionic3 ion-slides遇坑

    不想吐槽  ionic-slides  的组件,是个巨坑...切换页面以后再返回当前页面, 不能自动播放,网上的解决方案都是没用的(亲测,后台获取的数据) ...  不信邪的宝宝们可以去试试..建议换 ...