【THUSC2018】史莱姆之友【长链剖分】【链分治NTT】

不知道这题能不能发出来,如果不能请联系我,我什么都会做的

题意:给一棵 nnn 个结点的树,每个结点有个 ax+bax+bax+b,求所有根到叶子的乘积之和。系数模 998244353998244353998244353

链的情况就是分治 NTT,所以树上没有弱于这个的做法。

考虑链分治,先对树做长链剖分,然后对根所在的链分治,维护两个多项式,一个链上所有结点的乘积,一个从区间起点往下走,从区间中某个位置拐出去,走到所有叶子的路径乘积之和。递归到分治树的叶子的时候就递归算原树上的轻儿子。

为了保证复杂度,NTT 的长度应该开当前区间所有虚儿子的最大深度和区间长度的较大值,而非区间起点的深度。这样每条链只会在链头的父亲所在的链 分治的时候贡献 O(log⁡n)\Omicron(\log n)O(logn) 次 NTT 的长度,总复杂度是 O(nlog⁡2n)\Omicron(n\log^2n)O(nlog2n),并且上界很松。

第一次写封装多项式,挺舒服的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cctype>
#include <vector>
#define MAXN ((1<<18)+5)
using namespace std;
inline int read()
{int ans=0;char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
const int MOD=998244353;
typedef long long ll;
inline int add(const int& x,const int& y){return x+y>=MOD? x+y-MOD:x+y;}
inline int dec(const int& x,const int& y){return x<y? x-y+MOD:x-y;}
inline int qpow(int a,int p)
{int ans=1;while (p){if (p&1) ans=(ll)ans*a%MOD;a=(ll)a*a%MOD,p>>=1;}return ans;
}
#define inv(x) qpow(x,MOD-2)
int rt[2][24];
int r[MAXN],l,lim;
inline void init(){lim=1<<l;for (int i=0;i<lim;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));}
void ntt(int* a,int type)
{for (int i=0;i<lim;i++) if (i<r[i]) swap(a[i],a[r[i]]);for (int L=0;L<l;L++){int mid=1<<L,len=mid<<1;int Wn=rt[type][L+1];for (int s=0;s<lim;s+=len){ll w=1;for (int k=0;k<mid;k++,w=w*Wn%MOD){int x=a[s+k],y=w*a[s+mid+k]%MOD;a[s+k]=add(x,y),a[s+mid+k]=dec(x,y);}}}if (type){int t=inv(lim);for (int i=0;i<lim;i++) a[i]=(ll)a[i]*t%MOD;}
}
struct poly
{int *a,n;inline poly():n(0){}inline poly(int x):n(x){a=new int[x];memset(a,0,sizeof(int)*n);}inline poly(int x,int y):n(2){a=new int[2];a[0]=x,a[1]=y;}inline int& operator [](const int& i){return a[i];}inline const int& operator [](const int& i)const{return a[i];}
};
inline poly operator *(const poly& a,const poly& b)
{static int ta[MAXN],tb[MAXN];poly c(a.n+b.n-1);for (l=0;(1<<l)<c.n;++l);init();for (int i=0;i<lim;i++) ta[i]=tb[i]=0;for (int i=0;i<a.n;i++) ta[i]=a[i];for (int i=0;i<b.n;i++) tb[i]=b[i];ntt(ta,0),ntt(tb,0);for (int i=0;i<lim;i++) ta[i]=(ll)ta[i]*tb[i]%MOD;ntt(ta,1);for (int i=0;i<c.n;i++) c[i]=ta[i];return c;
}
inline poly operator +(const poly& a,const poly& b)
{poly c(max(a.n,b.n));for (int i=0;i<c.n;i++) c[i]=add(i<a.n? a[i]:0,i<b.n? b[i]:0);return c;
}
vector<int> e[MAXN];
int buf[MAXN],*tp=buf;
int fa[MAXN],son[MAXN],mx[MAXN];
int *lis[MAXN];
inline int* newbuf(int x){int* p=tp;tp+=x;return p;}
void dfs(int u,int f)
{fa[u]=f;for (int i=0;i<(int)e[u].size();i++)if (e[u][i]!=f){dfs(e[u][i],u);if (mx[e[u][i]]>mx[son[u]]) son[u]=e[u][i];}mx[u]=mx[son[u]]+1;
}
void dfs(int u,int* cur)
{*(lis[u]=cur)=u;if (son[u]) dfs(son[u],cur+1);for (int i=0;i<(int)e[u].size();i++)if (e[u][i]!=fa[u]&&e[u][i]!=son[u])dfs(e[u][i],newbuf(mx[e[u][i]]));
}
int rval[MAXN],gval[MAXN];
pair<poly,poly> solve(int* L,int* R)
{if (L==R){int u=*L;poly tmp;for (int i=0;i<(int)e[u].size();i++)if (e[u][i]!=fa[u]&&e[u][i]!=son[u])tmp=tmp+solve(lis[e[u][i]],lis[e[u][i]]+mx[e[u][i]]-1).second;if ((int)e[u].size()==(fa[u]>0)) tmp=poly(1),tmp[0]=1;return make_pair(poly(rval[u],gval[u]),poly(rval[u],gval[u])*tmp);}int* mid=L+((R-L)>>1);pair<poly,poly> lans=solve(L,mid),rans=solve(mid+1,R);return make_pair(lans.first*rans.first,lans.first*rans.second+lans.second);
}
poly ans;
int main()
{freopen("slime.in","r",stdin);freopen("slime.out","w",stdout);rt[0][23]=qpow(3,119),rt[1][23]=inv(rt[0][23]);for (int i=22;i>=0;i--){rt[0][i]=(ll)rt[0][i+1]*rt[0][i+1]%MOD;rt[1][i]=(ll)rt[1][i+1]*rt[1][i+1]%MOD;}int n=read();read();for (int i=1;i<=n;i++) rval[i]=read();for (int i=1;i<=n;i++) gval[i]=read();for (int i=1;i<n;i++){int u,v;u=read(),v=read();e[u].push_back(v),e[v].push_back(u);}dfs(1,0);dfs(1,newbuf(mx[1]));ans=solve(lis[1],lis[1]+mx[1]-1).second;for (int i=0;i<=n;i++) printf("%d\n",(i<ans.n? ans[i]:0));return 0;
}

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

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

相关文章

HDU - 6964 I love counting 树状数组套01tire

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的数组&#xff0c;每次询问l,r,a,bl,r,a,bl,r,a,b代表询问[l,r][l,r][l,r]区间内有多少个不同的数x⊕a≤bx\oplus a\le bx⊕a≤b。 n≤1e5,a,b,x≤n1n\le1e5,a,b,x\le n1n≤1e5,a,b,x≤n1…

.NET开发框架(九)-NLB网络负载平衡配置实战(视频)

&#xff08;NLB配置实战教程-有声视频-第二节&#xff09;请持续关注公众号&#xff0c;第三节&#xff08;NLBARR)正在录制中~第六章IIS负载均衡教程&#xff0c;至今共有37人参与学习尚未学习第六章-IIS负载均衡-视频教程的童靴&#xff0c;赶紧跟上进度&#xff0c;别掉队了…

WC 赛前总结

不要试图得到不属于自己的东西&#xff0c;这样反而容易丢掉本该拿到的分。完全放弃某一道题时一定要慎重&#xff0c;也不要把希望寄托于肝出某一道题。题多读几遍&#xff0c;手算样例&#xff0c;并充分理解了样例解释之后再开始想。读错题浪费时间都是小事&#xff0c;如果…

HDU - 6959 zoto 莫队 + 值域分块

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你nnn个数&#xff0c;每个数有个值&#xff0c;有mmm次询问&#xff0c;每次给定l,r,y1,y2l,r,y1,y2l,r,y1,y2代表查询[l,r][l,r][l,r]区间内在[y1,y2][y1,y2][y1,y2]值域内有多少数出现了。 n≤1e5,m≤1…

C#各版本新增加功能

本系列文章主要整理并介绍 C# 各版本的新增功能。C#8.0 于 2019年4月 随 .NET Framework 4.8 与 Visual Studio 2019 一同发布&#xff0c;但是当前处于预览状态。预计在2019年9月正式发布。目前提供以下功能可供试用&#xff1a;Readonly 成员默认接口成员【*重要&#xff0c;…

很抱歉,博主 AFO 了

遭受了非常严重的考场 debuff&#xff0c;彻底滚粗。 明明全打暴力都还有希望&#xff0c;非要花一半时间去做看起来很简单的 T3&#xff1b;明明接着全打暴力也有希望&#xff0c;非要去写 T2 明显写不出来的线段树合并&#xff1b;明明 T1 还可以骗点分&#xff0c;非要连个…

宣告推出.NET Core 3.0 Preview 7

译&#xff1a;艾心0626今天&#xff0c;我们宣布推出.NET Core 3.0 Preview 7。我们已经从创建新特性阶段过渡到了完善版本阶段。对于接下来的预览版&#xff0c;我们将把重点放在质量(改进)上。在Windows&#xff0c;macOS和Linux上下载.NET Core 3.0 Preview 7。.NET Core 3…

hdu 1028 Ignatius and the Princess III 母函数入门

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个数nnn&#xff0c;问你有多少种方案用1−n1-n1−n的数能组成nnn&#xff0c;数的使用次数无限制。 n≤120n\le120n≤120 思路&#xff1a; 考虑构造母函数。 对于111构造出来的母函数为1xx2x3....…

基于Masstransit实现Eventbus的功能

Masstransit 是一个非常优秀的基于消息进行通信的分布式应用程序框架&#xff0c;详情参考官网。在介绍AA.ServiceBus之前&#xff0c;先介绍下几个概念.分布式分布式系统如何定义&#xff1f;这里引用一下Distributed Systems Concepts and Design(Third Edition)中的一句话&a…

HDU - 6975 Forgiving Matching FFT匹配字符串

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个串a,ba,ba,b长度分别为n,mn,mn,m&#xff0c;你需要输出m1m1m1个数&#xff0c;第iii个数表示当允许有i−1i-1i−1个数可以不匹配时aaa中长度为mmm的子串与bbb匹配的数量&#xff0c;匹配的意思就是…

微软解释为什么Rust是系统编程的最佳选择

上周&#xff0c;MSRC&#xff08;微软安全响应中心&#xff09;透露出拥抱 Rust 的打算&#xff0c;随后他们将这个话题扩展为一个系列&#xff0c;进一步阐述了使用安全的系统编程语言的的必要性&#xff0c;以及选择 Rust 的原因。在该系列最新一篇文章中&#xff0c;MSRC 团…

HDU - 6982 J - Road Discount wqs二分 + 模型转换 + 优化

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个nnn个点mmm条边的图&#xff0c;每个边有一个代价以及折扣价&#xff0c;你需要输出nnn行&#xff0c;第iii行代表你可以选i−1i-1i−1条边使其变成优惠价&#xff0c;问每次的最小生成树的代价是多…

你可能不知道的Docker资源限制

本篇内容涉及Docker的内存与CPU限制&#xff0c;可以用于在实际开发中为指定容器设置限制最大使用的资源量&#xff0c;预计阅读时间为5分钟。01—What is 资源限制&#xff1f;默认情况下&#xff0c;容器是没有资源限制的&#xff0c;它会尽可能地使用宿主机能够分配给它的资…

2021牛客暑期多校训练营4 E - Tree Xor 线段树 + 拆分区间

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一棵树&#xff0c;每个点原本都有一个权值wiw_iwi​&#xff0c;但是你只知道相邻两个点之间的wu⊕wvw_u\oplus w_vwu​⊕wv​&#xff0c;问你有多少种w1,2,...,nw_{1,2,...,n}w1,2,...,n​ n≤1e5,wi…

东南亚的IT公司,我劝你善良!

来源公众号&#xff1a;半佛仙人&#xff08;ID&#xff1a;banfoSB&#xff09;“真的救我一条‘狗命’&#xff0c;可以吗&#xff0c;谢谢您了&#xff0c;我真的撑不住了。”5月3日&#xff0c;小巴在朋友圈看到这条信息&#xff0c;附着一张长图&#xff0c;定位&#xff…

2021牛客暑期多校训练营4 B - Sample Game 期望dp\生成函数

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个生成器&#xff0c;每次生成1−n1-n1−n其中的某个数的概率为pip_ipi​&#xff0c;生成的规则如下&#xff1a; (1)(1)(1)随机生成一个数加入集合。 (2)(2)(2)判断生成的数是否是集合中的最大值&am…

小白开学Asp.Net Core 《九》

小白开学Asp.Net Core 《九》 — — 前端篇&#xff08;不务正业&#xff09;在《小白开学Asp.Net Core 三》中使用了X-admin 2.x 和 Layui将管理后端的界面重新布局了&#xff0c;里面简单的介绍了layui table 的使用以及页面table所需的数据做了简单的封装。今天扩展学习下。…

P4173 残缺的字符串 FFT匹配含有通配符的字符串

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你两个长度为m,nm,nm,n的串a,ba,ba,b&#xff0c;问你bbb串中每个长度为mmm的连续字串能否与aaa完全匹配&#xff0c;其中含有通配符∗*∗&#xff0c;输出每个位置的开头。 n,m≤3e5n,m\le3e5n,m≤3e5 思…

.net持续集成sonarqube篇之sonarqube安装与基本配置

Sonarqube下载与安装Sonarqube下载地址是:https://www.sonarqube.org/downloads/下载版本有两个,一个是长期支持版,另一个是最新版,此处安装的是最新版,目前版本是7.3,下载的时候点击醒目的蓝色按钮即可(此时下载的是社区版),下面有三个无底色按钮下载链接,分别对应的是开发者版…

Codeforces Round #296 (Div. 1) D. Fuzzy Search FFT匹配字符串

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; n,m,k≤2e5n,m,k\le2e5n,m,k≤2e5 思路&#xff1a; 直接考虑fftfftfft来匹配字符串。 由于kkk是给定的&#xff0c;所以难度低了很多&#xff0c;普通的字符串匹配不能处理这种可以范围相等的情况&#xf…