P5305-[GXOI/GZOI2019]旧词【树链剖分,线段树】

正题

题目链接:https://www.luogu.com.cn/problem/P5305


题目大意

给一棵有根树和kkkQQQ次询问给出x,yx,yx,y
∑i=1xdepLCA(i,y)k\sum_{i=1}^{x}dep_{LCA(i,y)}^ki=1xdepLCA(i,y)k

1≤n,Q≤5×105,1≤k≤1091\leq n,Q\leq 5\times 10^5,1\leq k\leq 10^91n,Q5×105,1k109


解题思路

和之前LCALCALCA那题一样的思路,如果kkk等于111的话。加入一个点iii就把iii到根节点的路径上加一,然后询问节点xxx就查询xxx到根节点路径的和。

这题的话多了个kkk,其实是一样的,只是每个点的权值要调成depxk−(depx−1)kdep_{x}^k-(dep_{x}-1)^kdepxk(depx1)k,然后询问路径上权值*点权的和就好了。

因为kkk是固定的,所以直接开个线段树就很好搞了。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll N=5e5+10,P=998244353;
struct node{ll to,next;
}a[N];
struct qnode{ll l,x,id;
}q[N];
ll n,Q,k,tot,pw[N],ls[N],fa[N],ans[N];
ll cnt,siz[N],dep[N],son[N],top[N],dfn[N],rfn[N];
ll w[N<<2],v[N<<2],lazy[N<<2];
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void addl(ll x,ll y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
bool cmp(qnode x,qnode y)
{return x.l<y.l;}
void dfs1(ll x){siz[x]=1;dep[x]=dep[fa[x]]+1;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;dfs1(y);siz[x]+=siz[y];if(siz[y]>siz[son[x]])son[x]=y;}return;
}
void dfs2(ll x){dfn[++cnt]=x;rfn[x]=cnt;if(son[x]){top[son[x]]=top[x];dfs2(son[x]);}for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(y==son[x])continue;top[y]=y;dfs2(y);}return;
}
void Build(ll x,ll l,ll r){if(l==r){w[x]=(pw[dep[dfn[l]]]-pw[dep[dfn[l]]-1]+P)%P;return;}ll mid=(l+r)>>1;Build(x*2,l,mid);Build(x*2+1,mid+1,r);w[x]=(w[x*2]+w[x*2+1])%P;return;
}
void Downdata(ll x){if(!lazy[x])return;lazy[x*2]+=lazy[x];lazy[x*2+1]+=lazy[x];(v[x*2]+=w[x*2]*lazy[x]%P)%=P;(v[x*2+1]+=w[x*2+1]*lazy[x]%P)%=P;lazy[x]=0;return;
}
void Change(ll x,ll L,ll R,ll l,ll r){if(L==l&&R==r){lazy[x]++;(v[x]+=w[x])%=P;return;}ll mid=(L+R)>>1;Downdata(x);if(r<=mid)Change(x*2,L,mid,l,r);else if(l>mid)Change(x*2+1,mid+1,R,l,r);else Change(x*2,L,mid,l,mid),Change(x*2+1,mid+1,R,mid+1,r);v[x]=(v[x*2]+v[x*2+1])%P;return;
}
ll Ask(ll x,ll L,ll R,ll l,ll r){if(L==l&&R==r)return v[x];ll mid=(L+R)>>1;Downdata(x);if(r<=mid)return Ask(x*2,L,mid,l,r);if(l>mid)return Ask(x*2+1,mid+1,R,l,r);return (Ask(x*2,L,mid,l,mid)+Ask(x*2+1,mid+1,R,mid+1,r))%P;
}
void Add(ll x){while(x)Change(1,1,n,rfn[top[x]],rfn[x]),x=fa[top[x]];return;
}
ll Ask(ll x){ll ans=0;while(x)(ans+=Ask(1,1,n,rfn[top[x]],rfn[x]))%=P,x=fa[top[x]];return ans;
}
signed main()
{scanf("%lld%lld%lld",&n,&Q,&k);for(ll i=1;i<=n;i++)pw[i]=power(i,k);for(ll i=2;i<=n;i++){scanf("%lld",&fa[i]);addl(fa[i],i);}for(ll i=1;i<=Q;i++){scanf("%lld%lld",&q[i].l,&q[i].x);q[i].id=i;}sort(q+1,q+1+Q,cmp);top[1]=1;dfs1(1);dfs2(1);Build(1,1,n);ll z=1;for(ll i=1;i<=n;i++){Add(i);while(z<=Q&&q[z].l<=i)ans[q[z].id]=Ask(q[z].x),z++;}for(ll i=1;i<=Q;i++)printf("%lld\n",ans[i]);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客题霸 [二叉树的镜像]C++题解/答案

牛客题霸 [二叉树的镜像]C题解/答案 题目描述 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 题解&#xff1a; 根据题也不难看出&#xff0c;二叉树的镜像定义其实就是左右树翻转 所以我们一直递归左子树&#xff0c;到头后递归右子树&#xff0c;开始翻转&…

2021牛客暑期多校训练营1 G-Game of Swapping Numbers(最优解转化+贪心)

G-Game of Swapping Numbers 讲题人做法 最优解转化&#xff1a; 考虑任意一个最优解&#xff0c;我们把交换后的数字重新放回原来的位置&#xff0c;相当于为每一个元素分配了它在答案中的符号。比如 A{0, 3}, B {1, 2}&#xff0c;最优解符号分配是 A{-0,3}, B{-1,2}。 …

不止代码:导弹拦截

题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到敌国的导弹来袭。由于该系统…

对.NET Core未来发展趋势的浅层判断

经常听到园里.NET开发人员在抱怨生态不如JAVA&#xff0c;想要转JAVA&#xff0c;所谓打不过你&#xff0c;我就加入你&#xff01;杜兰特的思维方式固然是获取总冠军的一种方式&#xff0c;但是我们要关起门来问自己有没有杜兰特的实力。用开发生态来类比NBA不是特别恰当&…

AT2567-[ARC074C]RGB Sequence【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2567 题目大意 长度为nnn的包含三种颜色RGBRGBRGB的序列&#xff0c;mmm个限制[l,r,k][l,r,k][l,r,k]表示区间l∼rl\sim rl∼r恰好有kkk种颜色。 求方案数 1≤n≤3001\leq n\leq 3001≤n≤300 解题思路 很水的题是吧&…

牛客题霸 [字符串变形]C++题解/答案

牛客题霸 [字符串变形]C题解/答案 题目&#xff1a; 对于一个给定的字符串&#xff0c;我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格&#xff0c;就像"Hello World"一样&#xff0c;然后我们要做的是把着个字符串中由空格隔…

2021牛客暑期多校训练营1 H-Hash Function(数学+FFT)

H-Hash Function Shining_xzl大佬题解 本题答案符合题意的充分必要条件是&#xff1a;不能是任意两个数的差以及他们的因数&#xff0c;因此只需用用FFT求出这些数的差&#xff0c;记为差的集合。 从小到大考虑一个答案&#xff0c;以及答案的倍数是不是上述差的集合&#x…

priority_queue+贪心:运输(题解)

解析 不难发现每次都应合并最大的一对&#xff0c;从而使局部最优带动整体最优 sort就会很自然的想到 但是问题是合并完之后的新值可能已经不是当前最大了&#xff08;WA。。qwq&#xff09; 于是想到每次循环sort一遍&#xff0c;结果n^2logn又超时了。。。 在一位高人的指引…

【话题揭秘】某大型国有银行的敏捷落地实践

“某大型国有银行的敏捷落地实践”话题介绍银行行业是强烈依赖IT的非IT行业&#xff0c;传统金融要想打破现有局面&#xff0c;除了要解决外因&#xff0c;还要突破内部因素&#xff0c;其中一点就是技术重塑和战略手段&#xff0c;也就是常说的数字化转型&#xff0c;这也是经…

P3293-[SCOI2016]美味【主席树】

正题 题目链接:https://www.luogu.com.cn/problem/P3293 题目大意 给出一个长度为nnn的序列&#xff0c;mmm次询问给出b,x,l,rb,x,l,rb,x,l,r表示询问在[l,r][l,r][l,r]中找到一个数字aaa使得bxor(ax)b\ xor\ (ax)b xor (ax)的值最大。 1≤n,m≤2105,0≤a,b,x<1051\leq n,…

牛客题霸 [三个数的最大乘积]C++题解/答案

牛客题霸 [三个数的最大乘积]C题解/答案 题目描述 给定一个无序数组&#xff0c;包含正数、负数和0&#xff0c;要求从中找出3个数的乘积&#xff0c;使得乘积最大&#xff0c;要求时间复杂度&#xff1a;O(n)&#xff0c;空间复杂度&#xff1a;O(1)。 题解&#xff1a; 有…

震惊!温州一程序员编完八皇后吐血而亡,他的代码是什么样子?!!

解析 经典大法师&#xff08;dfs哈哈哈&#xff09; 比较关键的是每条对角线上点的坐标之和或差是相同的&#xff0c;故可以用一维数组存储其状态 这题一开始用了双层循环&#xff0c;卡掉了4个点qwq 后来发现其实因为每行只有一个皇后&#xff0c;每次单层循环枚举j就可以实…

codeforces1498 D. Bananas in a Microwave(背包+优化)

D. Bananas in a Microwave issue是fw题解 设计dp&#xff1a; 状态表示&#xff1a;fi,jf_{i,j}fi,j​表示&#xff1a;前iii个操作是否能够凑成jjj。 状态转移&#xff1a;第iii次操作枚举操作次数考虑是否凑成val\text{val}val&#xff0c;如果第i−1i-1i−1次操作也可以凑…

直播视频发布:Windows上的Linux容器和Azure混合云中的Kubernetes(k8s)

如果你还没有开始关注容器&#xff0c;那么你已经out了&#xff1b;如果你还在单机上运行容器&#xff0c;那么你out了。经过2013到2018年5年的演化&#xff0c;分化和进化&#xff1b;容器&#xff0c;Docker和Kubernetes已经是任何一家企业的IT解决方案都不能忽视的重要趋势。…

ARC122C-Calculator【乱搞,构造】

正题 题目链接:https://atcoder.jp/contests/arc122/tasks/arc122_c 题目大意 一个数对开始是(0,0)(0,0)(0,0)&#xff0c;每次可以选择一个数加一或者让一个数加上另一个数&#xff0c;求使得第一个数变成nnn的方案。步数不超过130130130。 1≤n≤10181\leq n\leq 10^{18}1≤…

牛客题霸 [将升序数组转化为平衡二叉搜索树]C++题解/答案

牛客题霸 [将升序数组转化为平衡二叉搜索树]C题解/答案 题目描述 给出一个升序排序的数组&#xff0c;将其转化为平衡二叉搜索树&#xff08;BST&#xff09;. 题解&#xff1a; 二叉搜索树的定义&#xff1a; 二叉搜索树或者是一棵空树&#xff0c;或者是具有下列性质的二…

日志:贪心

排队接水 时间限制: 1 Sec 内存限制: 128 MB 题目描述 有n 个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为ti &#xff0c;请编程找出这n 个人 排队的一种顺序&#xff0c;使得n 个人的平均等待时间最小。 输入 第一行为n(1<n<5000)。第二行分别表示第1…

2021“MINIEYE杯”中国大学生算法设计超级联赛(1)zoto(二维数颜色)

zoto Code1 树状数组套动态开点权值线段树 效仿HH的项链&#xff0c;维护右端点&#xff0c;询问需要排序 #include<bits/stdc.h> using namespace std; template <class Tint> T rd() {T res0;char chgetchar();while(!isdigit(ch)) chgetchar();while( isdigi…

通过Microsoft Learn进行学习以提升技能

通过 Microsoft Learn&#xff0c;可以免费而且轻松有趣地学习 Microsoft 技术。Microsoft Learn的与众不同借助 Microsoft Learn&#xff0c;任何人都能按自己的学习计划和速度掌握重要的知识和概念。 使用者将能够访问培训资料、代码示例&#xff0c;以及免费试用产品。无论是…

牛客练习赛84F-牛客推荐系统开发之下班【莫比乌斯反演,杜教筛】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11174/F 题目大意 给出n,kn,kn,k求 ∑i11n∑i21n...∑ik1ngcd(fi1,fi2,...,fik)\sum_{i_11}^n\sum_{i_21}^n...\sum_{i_k1}^ngcd(f_{i_1},f_{i_2},...,f_{i_{k}})i1​1∑n​i2​1∑n​...ik​1∑n​gcd(fi1​​,fi2​​,.…