ZJOI2017
时间:2020-04-20
本文章向大家介绍ZJOI2017,主要包括ZJOI2017使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
仙人掌
实际上我们只需要解决树的部分分即可。因为如果我们在加上边时,肯定无法加在原来的环上。
所以可以把所有环删除后再进行dp。实际上可以对每个连通块分别dp,答案是所有连通块dp结果的乘积。
用分治fft可以把时间复杂度优化到$O(nlog_2n)$,jzoj上有一道题是这道题的变体,那道题不需要转化模型,但是需要使用分治fft。
但是这道题用分治fft肯定是会超时的。
转化模型后,这道题的模型是“使用任意多条链(可以只包含一条边)覆盖整个图的方案数”。原题要求没有重边,但是可以“不用覆盖每条边”,所以可以把未被覆盖的边都加上一个自环,转变成前面所述的问题。
设g[i]表示有i个点,互相连边的方案,可以得到
g[n]=g[n-1]+g[n-2]*(n-1)。处理g时间复杂度O(n)
如果当前节点是根的话,则不能向外连边,那么再乘上g[儿子个数]即可(就是把儿子的方案组合在一起)u
否则当前点可以向外连边。把现在的节点算进来,就是要乘以g[儿子个数+1]
时间复杂度O(n)
#include<bits/stdc++.h> using namespace std; #define mo 998244353ll #define int long long #define N 1000010 int t,n,m,ec,h[N],v[N],fa[N],dfn[N],ct,nxt[N],x,y,f[N],ok,vi[N],d[N]; void add(int x,int y){v[++ec]=y;nxt[ec]=h[x];h[x]=ec;} void dfs(int x){ dfn[x]=++ct; for(int i=h[x];i;i=nxt[i]){ if(!dfn[v[i]]){ fa[v[i]]=x; dfs(v[i]); } else if(v[i]!=fa[x]&&dfn[v[i]]>dfn[x]){ d[x]-=2; for(int y=v[i];y!=x;y=fa[y]){ if(vi[y]){ ok=1; return; } vi[y]=1; d[y]-=2; } } if(ok)return; } } signed main(){ freopen("cactus.in","r",stdin); freopen("cactus.out","w",stdout); cin>>t; while(t--){ scanf("%lld%lld",&n,&m); ec=ok=0; for(int i=1;i<=n;i++) h[i]=dfn[i]=vi[i]=d[i]=0; while(m--){ int x,y; scanf("%lld%lld",&x,&y); add(x,y); add(y,x); d[x]++; d[y]++; } f[0]=f[1]=1; for(int i=2;i<=n;i++) f[i]=(f[i-1]+f[i-2]*(i-1)%mo)%mo; for(int i=1;i<=n;i++) if(!dfn[i])dfs(i); int ans=1; for(int i=1;i<=n;i++) ans=ans*f[d[i]]%mo; if(ok)ans=0; cout<<ans<<'\n'; } }
gg
原文地址:https://www.cnblogs.com/cszmc2004/p/12738416.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浙大版《C语言程序设计(第3版)》题目集 习题9-4 查找书籍
- 浙大版《C语言程序设计(第3版)》题目集 习题9-5 通讯录排序
- 浙大版《C语言程序设计(第3版)》题目集 习题7-5 找鞍点
- 浙大版《C语言程序设计(第3版)》题目集 练习5-1 求m到n之和
- 手把手教你用Python爬取快递100查询你的物流信息
- 浙大版《C语言程序设计(第3版)》题目集 练习5-2 找两个数中最大者
- 浙大版《C语言程序设计(第3版)》题目集 练习5-3 数字金字塔
- 浙大版《C语言程序设计(第3版)》题目集 习题5-1 符号函数
- 浙大版《C语言程序设计(第3版)》题目集 习题5-2 使用函数求奇数和
- 浙大版《C语言程序设计(第3版)》题目集 习题5-3 使用函数计算两点间的距离
- 浙大版《C语言程序设计(第3版)》题目集 习题5-4 使用函数求素数和
- Linux进程之如何查看进程详情?
- 浙大版《C语言程序设计(第3版)》题目集 习题5-5 使用函数统计指定数字的个数
- 浙大版《C语言程序设计(第3版)》题目集 习题5-6 使用函数输出水仙花数
- 浙大版《C语言程序设计(第3版)》题目集 习题5-7 使用函数求余弦函数的近似值