博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 P5276 模板题(uoi)
阅读量:4957 次
发布时间:2019-06-12

本文共 2364 字,大约阅读时间需要 7 分钟。

这题挺恶心的。

首先一颗树的时候点分加卷积统计答案,注意合并子树时按深度从小到大合并,否则复杂度就爆了。

我偷懒用size从小到大合并,复杂度应该还是两个log.

然后考虑万恶的环。

先随便删掉环上一条边,按照树统计一下答案。
然后考虑
必须经过环上该条边的答案但又不经过整个环的答案。

考虑再钦定一条边不经过,算答案。

然后递归做就行了。

最后加上经过整个环的答案。

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

// luogu-judger-enable-o2// luogu-judger-enable-o2#include 
using namespace std;typedef vector
poly;typedef long long ll;poly a,b;const int P=1<<17;const int M=998244353;const int G=3; int rev[P],w[P];namespace{ int add(int x,int y){ return (x+=y)>=M?x-M:x; } int sub(int x,int y){ return (x-=y)<0?x+M:x; } int mul(int x,int y){ return (ll)x*y%M; } int fp(int x,int y){ int ret=1; for (; y; y>>=1,x=mul(x,x)) if (y&1) ret=mul(ret,x); return ret; }}int inv2[30];void init(int len){ for (int i=1; i
1) w[i+1]=fp(G,(M-1)/(i<<1)); for (int j=2; j
>31)&M; ++b; (*l)+=y-M; (*l)+=((*l)>>31)&M; ++l; } } }} void INTT(int *a,int len,int bit){ reverse(a+1,a+len); NTT(a,len); int ni=inv2[bit]; for (int i=0; i
>1]>>1|((i&1)?len>>1:0); NTT(a.data(),len); NTT(b.data(),len); for (int i=0; i
e[N]; int sz[N],tmp[N],rt; void Dfs(int x,int fa){ sz[x]=1; for (auto i:e[x]) if (i!=fa){ Dfs(i,x); sz[x]+=sz[i]; } } int calc(int y,int x){ return max(y-sz[x],tmp[x]); } void Getrt(int x,int fa,const int totsize){ //cerr<<"Getrt"<
<<" "<
<
sz[rt]) sz[i]=bbb-sz[rt]; sort(e[rt].begin(),e[rt].end(),[&](int x,int y){ return sz[x]
g[N]; void noloop(int x){ //cerr<<"noloop"<
<
>n>>m>>k>>f; //n=100000; m=n-1; //k=100000; f=1; //cerr<
<<" "<
<<" "<
<<" "<
<
>x>>y; //x=rand()%i+1; y=i+1; //cerr<<"add"<
<<" "<
<
findloop=[&](int x,int f){ vis[x]=2; s.push_back(x); for (auto i:g[x]) if (i!=f){ if (vis[i]!=2) findloop(i,x); else pp=i; if (pp) return; } s.pop_back(); }; findloop(1,0); s.erase(s.begin(),find(s.begin(),s.end(),pp)); //cerr<<"cut"<
<<" "<
<
ddd=[&](int x,int fa,poly &c,int dis){ if (dis>=c.size()) c.resize(dis+1); ++c[dis]; for (auto j:g[x]) if (j!=fa) ddd(j,x,c,dis+1); }; auto Fakeadd=[&](poly &u,const poly &v,int len){ if (u.size()
solve=[&](int l,int r,int nowlen){ //cerr<<"solve"<
<<" "<
<<" "<
<
>1; //cut mid mid+1 //cerr<<"cut"<
<<" "<
<

转载于:https://www.cnblogs.com/Yuhuger/p/10621956.html

你可能感兴趣的文章
18.04ubuntu安装mysql,同时设置root密码
查看>>
ubutun18.04 安装redis
查看>>
远程ubuntu18.04 安装java1.8
查看>>
ubutun 18.04 安装maven
查看>>
ubutun18.04安装 rocketmq
查看>>
git clone
查看>>
处理版本冲突
查看>>
jackson 实体转json 为NULL或者为空不参加序列化
查看>>
bloom过滤器
查看>>
数组内存的释放与申请
查看>>
小白系统篇-windows 系统安装
查看>>
通过Ldap实现人事系统组织人事和AD的同步
查看>>
KVM虚拟机嵌套虚拟化
查看>>
常用多线程方法
查看>>
Spring AOP技术本质认识
查看>>
Docker Compose YML文件配置
查看>>
常用分布式事务解决方案
查看>>
线程三态和JVM线程状态
查看>>
maven 配置参数详解
查看>>
Zookeeper leader选举
查看>>