很像LNOI 2014 LCA那道题。

同样的套路,离线以后直接扫描线。

k=1的话就是原题。

考虑一般情况。

原本的做法是对x到根的这条链做一下区间+1操作,目的是为了是的在深度为i的位置得到的贡献是i。

因此,我们只需要构造出一个任意一个位置都满足前缀和为i^k的序列即可。

然后每次把这个序列加到这条链上,由于每个点的深度固定,因此每个位置每次增加的数字也是固定的,可以区间打标记线段树维护。

考虑怎么构造这个序列,显然直接把1k,2k,3k,4k......差分就可以了。

  1. #include<bits/stdc++.h>
  2. #define N 220000
  3. #define eps 1e-7
  4. #define inf 1e9+7
  5. #define db double
  6. #define ll long long
  7. #define ldb long double
  8. using namespace std;
  9. inline int read()
  10. {
  11. char ch=0;
  12. int x=0,flag=1;
  13. while(!isdigit(ch)){ch=getchar();if(ch=='-')flag=-1;}
  14. while(isdigit(ch)){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
  15. return x*flag;
  16. }
  17. const int mo=998244353;
  18. int ksm(int x,int k)
  19. {
  20. int ans=1;
  21. while(k)
  22. {
  23. if(k&1)ans=1ll*ans*x%mo;
  24. k>>=1;x=1ll*x*x%mo;
  25. }
  26. return ans;
  27. }
  28. struct edge{int to,nxt;}e[N*2];
  29. int num,head[N];
  30. inline void add(int x,int y){e[++num]={y,head[x]};head[x]=num;}
  31. struct question{int x,y,id;}p[N];
  32. bool cmp(question a,question b){return a.x<b.x;}
  33. int n,q,k,times,v[N],id[N],sz[N],fa[N],dep[N],son[N],top[N],ans[N];
  34. void dfs1(int x,int t)
  35. {
  36. sz[x]=1;dep[x]=t;
  37. for(int i=head[x];i!=-1;i=e[i].nxt)
  38. {
  39. int to=e[i].to;
  40. if(to==fa[x])continue;
  41. dfs1(to,t+1);sz[x]+=sz[to];
  42. if(sz[son[x]]<sz[to])son[x]=to;
  43. }
  44. }
  45. void dfs2(int x,int tp)
  46. {
  47. top[x]=tp;v[++times]=x;id[x]=times;
  48. if(son[x])dfs2(son[x],tp);
  49. for(int i=head[x];i!=-1;i=e[i].nxt)
  50. {
  51. int to=e[i].to;
  52. if(top[to])continue;
  53. dfs2(to,to);
  54. }
  55. }
  56. struct Segment_Tree
  57. {
  58. #define lson o<<1
  59. #define rson o<<1|1
  60. #define mid ((l+r)>>1)
  61. int f[N*4],sumv[N*4],addv[N*4];
  62. inline void pushup(int o)
  63. {
  64. sumv[o]=(sumv[lson]+sumv[rson])%mo;
  65. }
  66. inline void pushdown(int o)
  67. {
  68. addv[lson]=(addv[lson]+addv[o])%mo;
  69. addv[rson]=(addv[rson]+addv[o])%mo;
  70. sumv[lson]=(sumv[lson]+(1ll*addv[o]*f[lson]%mo))%mo;
  71. sumv[rson]=(sumv[rson]+(1ll*addv[o]*f[rson]%mo))%mo;
  72. addv[o]=0;
  73. }
  74. void build(int o,int l,int r)
  75. {
  76. if(l==r)
  77. {
  78. int t=dep[v[l]];
  79. f[o]=(ksm(t,k)-ksm(t-1,k))%mo;
  80. return;
  81. }
  82. build(lson,l,mid);build(rson,mid+1,r);
  83. f[o]=(f[lson]+f[rson])%mo;
  84. }
  85. void optadd(int o,int l,int r,int ql,int qr)
  86. {
  87. if(ql<=l&&r<=qr)
  88. {
  89. addv[o]=(addv[o]+1)%mo;
  90. sumv[o]=(sumv[o]+f[o])%mo;
  91. return;
  92. }
  93. pushdown(o);
  94. if(ql<=mid)optadd(lson,l,mid,ql,qr);
  95. if(qr>mid)optadd(rson,mid+1,r,ql,qr);
  96. pushup(o);
  97. }
  98. int query(int o,int l,int r,int ql,int qr)
  99. {
  100. if(ql<=l&&r<=qr)return sumv[o];
  101. pushdown(o);
  102. int ans=0;
  103. if(ql<=mid)ans=(ans+query(lson,l,mid,ql,qr))%mo;
  104. if(qr>mid)ans=(ans+query(rson,mid+1,r,ql,qr))%mo;
  105. return ans;
  106. }
  107. }T;
  108. void update(int x)
  109. {
  110. while(x)T.optadd(1,1,n,id[top[x]],id[x]),x=fa[top[x]];
  111. }
  112. int query(int x)
  113. {
  114. int ans=0;
  115. while(x)ans=(ans+T.query(1,1,n,id[top[x]],id[x]))%mo,x=fa[top[x]];
  116. return ans;
  117. }
  118. int main()
  119. {
  120. n=read();q=read();k=read();
  121. num=-1;memset(head,-1,sizeof(head));
  122. for(int i=2;i<=n;i++)fa[i]=read(),add(fa[i],i);
  123. dfs1(1,1);dfs2(1,1);T.build(1,1,n);
  124. for(int i=1;i<=q;i++)p[i].x=read(),p[i].y=read(),p[i].id=i;
  125. sort(p+1,p+q+1,cmp);
  126. for(int i=1,j=0;i<=n;i++)
  127. {
  128. update(i);
  129. while(j!=q&&p[j+1].x==i)j++,ans[p[j].id]=query(p[j].y);
  130. }
  131. for(int i=1;i<=q;i++)printf("%d\n",(ans[i]%mo+mo)%mo);
  132. return 0;
  133. }

[GXOI/GZOI2019]旧词的更多相关文章

  1. [LOJ3088][GXOI/GZOI2019]旧词——树链剖分+线段树

    题目链接: [GXOI/GZOI2019]旧词 对于$k=1$的情况,可以参见[LNOI2014]LCA,将询问离线然后从$1$号点开始对这个点到根的路径链修改,每次询问就是对询问点到根路径链查询即可 ...

  2. P5305 [GXOI/GZOI2019]旧词

    题目地址:P5305 [GXOI/GZOI2019]旧词 这里是官方题解 \[\sum_{i \leq x}^{}\ depth(lca(i,y))^k\] \(k = 1\) 求的是 \(\sum_ ...

  3. 【BZOJ5507】[GXOI/GZOI2019]旧词(树链剖分,线段树)

    [BZOJ5507][GXOI/GZOI2019]旧词(树链剖分,线段树) 题面 BZOJ 洛谷 题解 如果\(k=1\)就是链并裸题了... 其实\(k>1\)发现还是可以用类似链并的思想,这 ...

  4. BZOJ5507 GXOI/GZOI2019旧词 (树链剖分+线段树)

    https://www.cnblogs.com/Gloid/p/9412357.html差分一下是一样的问题.感觉几年没写过树剖了. #include<iostream> #include ...

  5. [GXOI/GZOI2019]旧词(树上差分+树剖)

    前置芝士:[LNOI2014]LCA 要是这题放HNOI就好了 原题:\(\sum_{l≤i≤r}dep[LCA(i,z)]\) 这题:\(\sum_{i≤r}dep[LCA(i,z)]^k\) 对于 ...

  6. luogu P5305 [GXOI/GZOI2019]旧词

    传送门 先考虑\(k=1\),一个点的深度就是到根节点的路径上的点的个数,所以\(lca(x,y)\)的深度就是\(x\)和\(y\)到根路径的交集路径上的点的个数,那么对于一个询问,我们可以对每个点 ...

  7. [bzoj5507] [洛谷P5305] [gzoi2019]旧词

    Descriptioin 浮生有梦三千场 穷尽千里诗酒荒 徒把理想倾倒 不如早还乡 温一壶风尘的酒 独饮往事迢迢 举杯轻思量 泪如潮青丝留他方 --乌糟兽/愚青<旧词> 你已经解决了五个问 ...

  8. BZOJ 5507: [gzoi2019]旧词 LCT

    和之前那个 [LNOI]LCA 几乎是同一道题,就是用动态树来维护查分就行. code: #include <bits/stdc++.h> using namespace std; #de ...

  9. [GX/GZOI2019]旧词(树上差分+树剖+线段树)

    考虑k=1的做法:这是一道原题,我还写过题解,其实挺水的,但当时我菜还是看题解的:https://www.cnblogs.com/hfctf0210/p/10187947.html.其实就是树上差分后 ...

随机推荐

  1. Centos6.10 安装Python 2.7.16

    部署一个程序, 系统环境:CentOS 6.10 64位 Python版本:2.7 1.升级下系统 yum install eple-release -y yum update -y 2.下载pyth ...

  2. [python 练习] 计算个税

    题目:利用python计算个税 说明:python有序字典的使用 代码: # -*- coding: utf-8 -*- from collections import OrderedDict # 税 ...

  3. Java stream的常见用法

    不讲原理,只说用法. 1,集合遍历 public class StreamTest { public static void main(String[] args) { //1 遍历 List< ...

  4. 网络库压力测试:mongols VS evpp

    evpp是360出品的一个网络库,基于libevent,进行了许多改造,对c++11友好.据称比libevent性能要好. 到底有多好呢?360开发人员有自己的测试,信不信由你. evpp源码下有个h ...

  5. redis 通用函数

    redis 通用函数 construct 命令/方法/函数 Description Creates a Redis client 创建一个Redis客户端 Example $redis = new R ...

  6. qemu创建vm和vcpu进入kvm的流程

    kvm是一个内核模块,它实现了一个/dev/kvm的字符设备来与用户进行交互,通过调用一系列ioctl函数可以实现qemu和kvm之间的切换. 1.qemu发起KVM_CREATE_VM的ioctl创 ...

  7. future then

    import 'dart:async'; main(){ Future(()=>a1()) .then((x)=>a2(x)) .then((x)=>a3(x)) .then((x) ...

  8. 注解配置spring

    1.为什么使用注解配置Spring基于注解配置的方式也已经逐渐代替xml.这个是不可逆的潮流,所以我们必须要掌握使用注解的方式配置Spring 总结:(1)使用注解配置Spring,注解的作用就是用于 ...

  9. Codeforces 1027F Session in BSU - 并查集

    题目传送门 传送门I 传送门II 传送门III 题目大意 有$n​$门科目有考试,第$i​$门科目有两场考试,时间分别在$a_i, b_i\ \ (a_i < b_i)​$,要求每门科目至少参加 ...

  10. FL Studio里的常规设置介绍

    上期我们介绍了FL Studio中的项目设置,今天我们来介绍FL Studio中的常规设置.要打开常规设置,我们需要在主菜单中选择选项>常规选项,当然也可以直接按快捷键F10. “常规设置”页面 ...