题目

是个傻题

显然枚举每一条路径经过了多少次,如果\(u,v\)在树上不是祖先关系的话经过\((u,v)\)这条路径的路径条数就是\(sum_u\times sum_v\)

于是我们子树大小映射到\(\rm Trie\)上去,树形\(\rm dp\)一下就可以求出所有点对产生的贡献了

但是这样祖先关系的节点就算错了,我们发现这也非常好算,\(\rm dfs\)的时候拿\(\rm LCT\)维护一下就好了

代码

  1. #include<bits/stdc++.h>
  2. #define re register
  3. inline int read() {
  4. char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();
  5. while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
  6. }
  7. const int maxn=3e5+5;
  8. const int mod=998244353;
  9. struct E{int v,nxt;}e[maxn];
  10. inline int qm(int x) {return x>=mod?x-mod:x;}
  11. inline int dqm(int x) {return x<0?x+mod:x;}
  12. int n,m,num,rt,ans,sm[maxn],head[maxn],d[maxn];
  13. char S[maxn];
  14. struct Trie {
  15. E e[maxn<<1];
  16. int head[maxn],num,v[maxn],deep[maxn];
  17. inline void add(int x,int y) {
  18. e[++num].v=y;e[num].nxt=head[x];head[x]=num;
  19. }
  20. void pdfs(int x) {
  21. for(re int i=head[x];i;i=e[i].nxt) deep[e[i].v]=deep[x]+1,pdfs(e[i].v);
  22. }
  23. void dfs(int x,int dep) {
  24. for(re int i=head[x];i;i=e[i].nxt) {
  25. dfs(e[i].v,dep+1);
  26. ans=qm(ans+1ll*dep*v[x]%mod*v[e[i].v]%mod);
  27. v[x]=qm(v[x]+v[e[i].v]);
  28. }
  29. }
  30. }T;
  31. struct LinkCutTree {
  32. int fa[maxn],ch[maxn][2],rev[maxn],tag[maxn],st[maxn],top,sum[maxn],a[maxn],sz[maxn];
  33. inline int nrt(int x) {return ch[fa[x]][1]==x||ch[fa[x]][0]==x;}
  34. inline void pushup(int x) {
  35. sz[x]=1+sz[ch[x][0]]+sz[ch[x][1]];sum[x]=a[x];
  36. if(ch[x][0]) sum[x]=qm(sum[x]+sum[ch[x][0]]);
  37. if(ch[x][1]) sum[x]=qm(sum[x]+sum[ch[x][1]]);
  38. }
  39. inline void work(int x,int v) {
  40. a[x]=qm(a[x]+v);tag[x]=qm(tag[x]+v);
  41. sum[x]=qm(sum[x]+1ll*sz[x]*v%mod);
  42. }
  43. inline void pushdown(int x) {
  44. if(tag[x]) {
  45. if(ch[x][0]) work(ch[x][0],tag[x]);
  46. if(ch[x][1]) work(ch[x][1],tag[x]);
  47. tag[x]=0;
  48. }
  49. if(rev[x]) {
  50. rev[x]=0;rev[ch[x][0]]^=1;rev[ch[x][1]]^=1;
  51. std::swap(ch[ch[x][0]][0],ch[ch[x][0]][1]);
  52. std::swap(ch[ch[x][1]][0],ch[ch[x][1]][1]);
  53. }
  54. }
  55. inline void rotate(int x) {
  56. int y=fa[x],z=fa[y],w=ch[y][1]==x,k=ch[x][w^1];
  57. if(nrt(y)) ch[z][ch[z][1]==y]=x;
  58. ch[x][w^1]=y,ch[y][w]=k;
  59. pushup(y),pushup(x);fa[k]=y,fa[y]=x,fa[x]=z;
  60. }
  61. inline void splay(int x) {
  62. int y=x;top=0;st[++top]=x;
  63. while(nrt(y)) y=fa[y],st[++top]=y;
  64. while(top) pushdown(st[top--]);
  65. while(nrt(x)) {
  66. int y=fa[x];
  67. if(nrt(y)) rotate((ch[fa[y]][1]==y)^(ch[y][1]==x)?x:y);
  68. rotate(x);
  69. }
  70. }
  71. inline void access(int x) {
  72. for(re int y=0;x;y=x,x=fa[x])
  73. splay(x),ch[x][1]=y,pushup(x);
  74. }
  75. inline void mrt(int x) {
  76. access(x);splay(x);rev[x]^=1;std::swap(ch[x][0],ch[x][1]);
  77. }
  78. inline void link(int x,int y) {
  79. mrt(x);fa[x]=y;T.add(x,y);
  80. }
  81. inline void split(int x,int y) {
  82. mrt(x);access(y);splay(y);
  83. }
  84. inline void ins(int x,int y,int v) {
  85. split(x,y);v=dqm(v);work(y,v);
  86. }
  87. inline int query(int x,int y) {
  88. split(x,y);
  89. return dqm(sum[y]-a[y]);
  90. }
  91. }lct;
  92. inline void add(int x,int y) {
  93. e[++num].v=y;e[num].nxt=head[x];head[x]=num;
  94. }
  95. void dfs1(int x) {
  96. sm[x]=1;
  97. for(re int i=head[x];i;i=e[i].nxt) dfs1(e[i].v),sm[x]+=sm[e[i].v];
  98. }
  99. void dfs2(int x) {
  100. ans=qm(ans+1ll*sm[x]*lct.query(d[x],1)%mod);
  101. for(re int i=head[x];i;i=e[i].nxt) {
  102. lct.ins(1,d[x],n-sm[e[i].v]-sm[x]);
  103. dfs2(e[i].v);
  104. lct.ins(1,d[x],sm[x]+sm[e[i].v]-n);
  105. }
  106. }
  107. int main() {
  108. n=read(),m=read();
  109. for(re int x,i=1;i<=n;i++) {
  110. x=read();if(x) add(x,i);else rt=i;
  111. }
  112. for(re int x,i=1;i<=m;i++) {
  113. x=read();if(x) lct.link(x,i);
  114. }
  115. dfs1(rt);scanf("%s",S+1);T.pdfs(1);
  116. for(re int i=1;i<=n;i++) {
  117. d[i]=read();
  118. ans=qm(ans+1ll*sm[i]*T.deep[d[i]]%mod*T.v[d[i]]%mod);
  119. T.v[d[i]]=qm(T.v[d[i]]+sm[i]);
  120. }
  121. T.dfs(1,0);dfs2(rt);printf("%d\n",ans);
  122. return 0;
  123. }

【LGP5439】【XR-2】永恒的更多相关文章

  1. XD, XR, DR 股票

    股权登记日与除权除息日 所以,如果投资者想得到一家上市公司的分红.配股权,就必须弄清这家公司的股权登记日在哪一天,否则就会失去分红.配股的机会. 股权登记日后的第一天就是除权日或除息日,这一天或以后购 ...

  2. hihocoder #1179 : 永恒游戏 暴力

    #1179 : 永恒游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://hihocoder.com/problemset/problem/11 ...

  3. Android内存、性能是程序永恒的话题

    内存.性能是程序永恒的话题,实际开发中关于卡顿.OOM也经常是打不完的两只老虎,关于卡顿.OOM的定位方法和工具比较多,这篇文章也不打算赘述了,本章主要是来整理一下JVM的内存模型以及Java对象的生 ...

  4. 文件:因为懂你,所以永恒 - 零基础入门学习Python028

    文件:因为懂你,所以永恒 让编程改变世界 Change the world by program 因为懂你,所以永恒 大多数的程序都遵循着:输入->处理->输出的模型,首先接受输入数据,然 ...

  5. NSA永恒之蓝病毒,如何通过360工具修复?

    简介: NSA武器库的公开被称为是网络世界"核弹危机",其中有十款影响Windows个人用户的黑客工具,包括永恒之蓝.永恒王者.永恒浪漫.永恒协作.翡翠纤维.古怪地鼠.爱斯基摩卷. ...

  6. “永恒之蓝"漏洞的紧急应对--毕业生必看

    早上6点多起床了,第一次起这么早,昨天晚上12点多,看到了一则紧急通知,勒索软件通过微软"永恒之蓝"漏洞针对教育网进行了大规模的攻击,而且有很多同学中招.中招后的结果如下图所示. ...

  7. 由"永恒之蓝"病毒而来的电脑科普知识

    永恒之蓝病毒事件: 继英国医院被攻击,随后在刚刚过去的5月12日晚上20点左右肆虐中国高校的WannaCry勒索事件,全国各地的高校学生纷纷反映,自己的电脑遭到病毒的攻击,文档被加密,壁纸遭到篡改,并 ...

  8. iOS屏幕适配 支持新手机 iPhone XR iPhone XS 超简单

    随着苹果爸爸发布了 超牛叉的iPhone iPhone X .iPhone XR.iPhone XS .iPhone XS Max.开发者的适配工作要开始了. 停,

  9. js判断iPhone XS、iPhone XS Max、iPhone XR

    // iPhone X.iPhone XS && window.screen.width === && window.screen.height === ; // iP ...

随机推荐

  1. zip mysql安装启动方式

    首先在官网(https://dev.mysql.com/downloads/mysql/)下载相应的zip包 然后进行解压找到配置文件 my-default.ini 文件打开进行配置 主要配置以下几项 ...

  2. TCP/IP报文格式

    1.TCP首部格式 1.1 格式各字段含义 源端口号( 16 位):它(连同源主机 IP 地址)标识源主机的一个应用进程. 目的端口号( 16 位):它(连同目的主机 IP 地址)标识目的主机的一个应 ...

  3. python 实现异常退出

    https://blog.csdn.net/u013385362/article/details/81206822 有时当一个条件成立的情况下,需要终止程序,可以使用sys.exit()退出程序.sy ...

  4. 【Java多线程系列随笔一】浅析 Java Thread.join()

    一.在研究join的用法之前,先明确两件事情. 1.join方法定义在Thread类中,则调用者必须是一个线程, 例如: Thread t = new CustomThread(); //这里一般是自 ...

  5. docker镜像私有仓库

    两台centos7的机器 192.168.100.151 docker镜像 192.168.100.157 docker私有仓库 步骤一 192.168.100.157主机开启私有仓库功能 docke ...

  6. Unity中对注册表进行修改

    问题背景: PC端软件开发,当我在Unity中的PlayerSetting中设置好分辨率,每次打包运行后会记忆上次退出时窗口的分辨率(记忆窗口状态),导致下次打开时不是PlayerSetting中的初 ...

  7. 008-Java的StringBuilder和StringBuffer

    StringBuffer 和 StringBuilder 与String的不同 String Java中十分重要的类;被声明为final class.除了hash这个属性, 其他属性也均声明为fina ...

  8. D3.js 动画 过渡效果 (V3版本)

    一 . 过渡的启动   启动过渡效果,与以下四个方法相关:   d3.transition([selection],[name]) //创建一个过渡对象.但是由于每个选择集中都有transition( ...

  9. myEclipse环境下配置springMvc项目,进行简单的请求

    1."File-->New-->WebProject"新建一个web项目,命名为springMvc 2.将所需要用到的jar包复制到WEB-INF/lib路径下,然后右 ...

  10. mysql 两张表取总合 和差集

    SELECT id AS kid, NAME, IF (t1.kpi, t1.kpi, 0) AS kpi, t1.sort, STATUS, t1.kpi_idFROMform_kpi_nameLE ...