题目描述

数据范围

对于70%的数据保证 n <= 1000

对于100%的数据保证 n,q <= 10^5,c_i,v_i <= 10^{18}

保证每次修改后的边权小于等于原来的边权且不会小于1

解法

由于c最大只有264,所以整除大于1的权值最多除64次,所以使用利用并查集将权值为1的边合并,然后每次询问只需寻找64条权值大于1的边即可。


树链剖分也是可以的。

代码

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<algorithm>
  6. #define ll long long
  7. #define ln(x,y) ((ll)(log(x)/log(y)))
  8. using namespace std;
  9. const char* fin="walk.in";
  10. const char* fout="walk.out";
  11. const ll inf=0x7fffffff;
  12. const ll maxn=100007,maxm=maxn*2,maxk=20;
  13. ll n,m,i,j,k,l,o,tot;
  14. ll fi[maxn],la[maxm],ne[maxm],va[maxm],limit;
  15. ll fa[maxn][maxk],w[maxn],dad[maxn],de[maxn];
  16. ll a[maxn],b[maxn];
  17. ll getdad(ll v){
  18. if (dad[v]==0) return v;
  19. dad[v]=getdad(dad[v]);
  20. return dad[v];
  21. }
  22. void add_line(ll a,ll b,ll c){
  23. tot++;
  24. ne[tot]=fi[a];
  25. la[tot]=b;
  26. va[tot]=c;
  27. fi[a]=tot;
  28. }
  29. void dfs(ll v,ll from){
  30. ll i,j,k;
  31. de[v]=de[from]+1;
  32. for (i=1,j=ln(de[v],2);i<=j;i++){
  33. k=fa[v][i-1];
  34. fa[v][i]=fa[k][i-1];
  35. }
  36. for (k=fi[v];k;k=ne[k])
  37. if (la[k]!=from){
  38. if (va[k]==1) dad[la[k]]=getdad(v);
  39. w[la[k]]=va[k];
  40. fa[la[k]][0]=v;
  41. dfs(la[k],v);
  42. }
  43. }
  44. ll lca(ll u,ll v){
  45. ll i,j,k;
  46. if (de[u]<de[v]) swap(u,v);
  47. for (i=ln(de[u]-de[v],2);i>=0;i--) if (de[fa[u][i]]>de[v]) u=fa[u][i];
  48. if (de[u]!=de[v]) u=fa[u][0];
  49. for (i=ln(de[u],2);i>=0;i--) if (fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
  50. if (u!=v) return fa[u][0];
  51. return u;
  52. }
  53. int main(){
  54. freopen(fin,"r",stdin);
  55. freopen(fout,"w",stdout);
  56. scanf("%lld%lld",&n,&m);
  57. for (i=1;i<n;i++){
  58. scanf("%lld%lld%lld",&j,&k,&l);
  59. add_line(j,k,l);
  60. add_line(k,j,l);
  61. }
  62. dfs(1,0);
  63. for (i=1;i<=m;i++){
  64. scanf("%lld",&j);
  65. if (j==1){
  66. scanf("%lld%lld%lld",&j,&k,&l);
  67. ll LCA=lca(j,k);
  68. limit=ln(l,2)+3;
  69. a[0]=b[0]=0;
  70. while (a[0]+b[0]<=limit && de[j]>de[LCA]){
  71. if (w[j]==1) j=getdad(j);
  72. else{
  73. a[++a[0]]=w[j];
  74. j=fa[j][0];
  75. }
  76. }
  77. while (a[0]+b[0]<=limit && de[k]>de[LCA]){
  78. if (w[k]==1) k=getdad(k);
  79. else{
  80. b[++b[0]]=w[k];
  81. k=fa[k][0];
  82. }
  83. }
  84. if (a[0]+b[0]>limit) printf("0\n");
  85. else{
  86. for (j=1;j<=a[0];j++) l/=a[j];
  87. for (k=b[0];k;k--) l/=b[k];
  88. printf("%lld\n",l);
  89. }
  90. }else{
  91. scanf("%lld%lld",&j,&k);
  92. l=la[j*2];
  93. o=la[j*2-1];
  94. if (l==fa[o][0]){
  95. if (w[o]!=1 && k==1) dad[o]=l;
  96. w[o]=k;
  97. }else{
  98. if (w[l]!=1 && k==1) dad[l]=o;
  99. w[l]=k;
  100. }
  101. }
  102. }
  103. return 0;
  104. }

启发

a/b/c变成a/(b∗c)是可以的,所以可以使用树链剖分。


发掘题目性质,例如一个数连续整除以若干个大于1的数,不超过log次后,这个数会变为0。

【JZOJ4846】【NOIP2016提高A组集训第5场11.2】行走的更多相关文章

  1. JZOJ 【NOIP2016提高A组集训第16场11.15】兔子

    JZOJ [NOIP2016提高A组集训第16场11.15]兔子 题目 Description 在一片草原上有N个兔子窝,每个窝里住着一只兔子,有M条路径连接这些窝.更特殊地是,至多只有一个兔子窝有3 ...

  2. JZOJ 【NOIP2016提高A组集训第16场11.15】SJR的直线

    JZOJ [NOIP2016提高A组集训第16场11.15]SJR的直线 题目 Description Input Output Sample Input 6 0 1 0 -5 3 0 -5 -2 2 ...

  3. 【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 分析 如果暴力枚举每个人被分到哪 ...

  4. 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...

  5. 【NOIP2016提高A组集训第14场11.12】随机游走

    题目 YJC最近在学习图的有关知识.今天,他遇到了这么一个概念:随机游走.随机游走指每次从相邻的点中随机选一个走过去,重复这样的过程若干次.YJC很聪明,他很快就学会了怎么跑随机游走.为了检验自己是不 ...

  6. 【NOIP2016提高A组集训第13场11.11】最大匹配

    题目 mhy12345学习了二分图匹配,二分图是一种特殊的图,其中的点可以分到两个集合中,使得相同的集合中的点两两没有连边. 图的"匹配"是指这个图的一个边集,里面的边两两不存在公 ...

  7. 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP

    好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ...

  8. 【JZOJ4901】【NOIP2016提高A组集训第18场11.17】矩阵

    题目描述 他是一名普通的农电工,他以一颗无私奉献的爱岗敬业之心,刻苦钻研业务,以娴熟的技术.热情周到的服务赢得了广大客户的尊敬和赞美.他就是老百姓称为"李电"的李春来. 众所周知, ...

  9. 【JZOJ4898】【NOIP2016提高A组集训第17场11.16】人生的价值

    题目描述 NiroBC终于找到了人生的意义,可是她已经老了,在新世界,没有人认识她,她孤独地在病榻上回顾着自己平凡的一生,老泪纵横.NiroBC多么渴望再多活一会儿啊! 突然一个戴着黑色方框眼镜,方脸 ...

随机推荐

  1. Django--Cookie和Session组件

    什么是Cookie: cookie的工作原理是:由服务端产生内容,浏览器收到请求之后保存在本地:当浏览器再次访问的时候,浏览器会自动带上这个cookie,这样服务端就能去通过这个cookie来判断你是 ...

  2. 利用Python覆盖图像的某一部分,即改变图形一块区域(Region)的RGBA值

    原图如下: 改变过后的图如下: 查阅API写法如下: from PIL import Image from PIL import ImageDraw pilim = Image.open('1.jpg ...

  3. 创建 SSH Keys

    SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定.利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题.简单说,SSH是 ...

  4. vue 图片上传功能

    这次做了vue页面的图片上传功能,不带裁剪功能的! 首先是html代码,在input框上添加change事件,如下:   <ul class="clearfix">   ...

  5. 阿里云应用高可用服务 AHAS 流控降级实现 SQL 自动防护功能

    在影响系统稳定性的各种因素中,慢 SQL 是相对比较致命的,可能会导致 CPU.LOAD 异常.系统资源耗尽.线上生产环境出现慢 SQL 往往有很多原因: 硬件问题.如网络速度慢,内存不足,I/O 吞 ...

  6. BZOJ 4554: [Tjoi2016&Heoi2016]游戏

    Time Limit: 20 Sec Memory Limit: 128 MB Submit: 951 Solved: 572 [Submit][Status][Discuss] Descriptio ...

  7. Faster RCNN 的细节补充

    一.faster rcnn的结构 通过上面的结构,我们知道该faster rcnn前面以VGG16为框架,加入RPN层,最后做分类层. 采用VGG16相对ZF来说慢一点,但是精度也高一点. 二.RPN ...

  8. 基于bootstrap框架在ie8以下,兼容媒体查询[css样式]

    <style type="text/css"> /*基于bootstrap框架在ie8以下,兼容媒体查询*/ .row [class^="col-" ...

  9. Python的Django REST框架中的序列化及请求和返回

    Python的Django REST框架中的序列化及请求和返回 序列化Serialization 1. 设置一个新的环境 在我们开始之前, 我们首先使用virtualenv要创建一个新的虚拟环境,以使 ...

  10. shell linux基本命令实例、笔记

    1. 在当前文件夹下.查找20分钟内,被訪问过的文件, 并将文件的详情显示出来: find ./ -name '*.log' -mmin -20 -exec ls -l {} \;   当然,须要指出 ...