• 【BZOJ5293】[BJOI2018]求和(前缀和,LCA)


    【BZOJ5293】[BJOI2018]求和(前缀和,LCA)

    题面

    BZOJ
    洛谷

    题解

    送分题???
    预处理一下(k)次方的前缀和。
    然后求个(LCA)就做完了?、、、

    #include<iostream>
    #include<cstdio>
    using namespace std;
    #define MOD 998244353
    #define MAX 300300
    inline int read()
    {
    	int x=0;bool t=false;char ch=getchar();
    	while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
    	if(ch=='-')t=true,ch=getchar();
    	while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
    	return t?-x:x;
    }
    int s[51][MAX];
    int n,Q;
    struct Line{int v,next;}e[MAX<<1];
    int h[MAX],cnt=1;
    inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
    int dep[MAX],top[MAX],fa[MAX],size[MAX],hson[MAX];
    void dfs1(int u,int ff)
    {
    	fa[u]=ff;dep[u]=dep[ff]+1;size[u]=1;
    	for(int i=h[u];i;i=e[i].next)
    	{
    		int v=e[i].v;if(v==ff)continue;
    		dfs1(v,u);size[u]+=size[v];
    		if(size[v]>size[hson[u]])hson[u]=v;
    	}
    }
    void dfs2(int u,int tp)
    {
    	top[u]=tp;if(hson[u])dfs2(hson[u],tp);
    	for(int i=h[u];i;i=e[i].next)
    		if(e[i].v!=fa[u]&&e[i].v!=hson[u])
    			dfs2(e[i].v,e[i].v);
    }
    int LCA(int u,int v)
    {
    	while(top[u]^top[v])dep[top[u]]<dep[top[v]]?v=fa[top[v]]:u=fa[top[u]];
    	return dep[u]<dep[v]?u:v;
    }
    int main()
    {
    	n=read();
    	for(int i=1;i<n;++i)
    	{
    		int u=read(),v=read();
    		Add(u,v);Add(v,u);
    	}
    	dep[0]=-1;dfs1(1,0);dfs2(1,1);dep[0]=0;
    	for(int i=1;i<=n;++i)
    		for(int j=1,pw=1;j<=50;++j)
    			s[j][i]=pw=1ll*pw*i%MOD;
    	for(int j=1;j<=50;++j)
    		for(int i=1;i<=n;++i)
    			s[j][i]=(s[j][i]+s[j][i-1])%MOD;
    	Q=read();
    	while(Q--)
    	{
    		int u=read(),v=read(),k=read(),lca=LCA(u,v),ans=0;
    		ans=(s[k][dep[u]]+s[k][dep[v]])%MOD;
    		ans=(ans+MOD-s[k][dep[lca]])%MOD;
    		ans=(ans+MOD-s[k][dep[fa[lca]]])%MOD;
    		printf("%d
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    如何用Warkdowm来写一篇博客
    关于toString()的一些事情
    python的 range() 函数
    python中的split()函数
    innerHTML和value打架了?
    JS如何实现实时获取网络时间
    javascript内嵌样式与外联样式怎么做?
    c语言实现乘法口诀表
    c语言实现数字的倒序输出
    c语言解一元二次方程
  • 原文地址:https://www.cnblogs.com/cjyyb/p/10368967.html
Copyright © 2020-2023  润新知