LOJ #2547 Luogu P4517「JSOI2018」防御网络
好像也没那么难写
题意
在一棵点仙人掌中等概率选择一个点集
求选出点集的斯坦纳树大小的期望
定义点仙人掌为不存在一个点在多个简单环中的连通图
斯坦纳树为在原图中连通给定点集的一棵生成树
点数不超过$ 200$
$ Solution$
直接计算不太方便
我们转而考虑每条边的贡献
如果这条边不在环上则一定是割边
若这条边两边都有点被选择就会被计算贡献
如果这条边在环上比较复杂
对于一个环,我们选择的边的数量一定是环大小-最长没选中点的路径的长度
定义选中某个点为存在至少一个点满足这个点到环的最近点为这个点
用$ f(L,R,k,0/1)$表示将环展开成链之后选中的左右端点为$ L,R$,这之间的最长空路径长度为$ k$且已经/没有取到最长路径的方案数
转移可以用前缀和优化$ O(n^3)$计算出$ DP$值
然后对于一个$ f(L,R,k,1)$最长空路径长度为$ max(k,n+L-R)$然后统计答案
总复杂度为$ O(n^3)$
$ my \ code$
#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define p 1000000007
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x = ; char zf = ; char ch = getchar();
while (ch != '-' && !isdigit(ch)) ch = getchar();
if (ch == '-') zf = -, ch = getchar();
while (isdigit(ch)) x = x * + ch - '', ch = getchar(); return x * zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int k,m,n,x,y,z,cnt,ans;
int e[][];
int f[][],qz0[],qz1[],jc[];
void dp(int n,int *A){
if(n<=)return;
for(rt i=;i<=n;i++)
for(rt k=;k<=n;k++){
memset(qz0,,sizeof(qz0));
memset(qz1,,sizeof(qz1));
qz0[i]=A[i];f[i][]=A[i];
for(rt j=i+;j<=n;j++){
(f[j][]=1ll*A[j]*(qz0[j-]-qz0[max(j-k,i-)])%p)%=p,
(f[j][]=1ll*A[j]*(qz1[j-]-qz1[max(j-k,i-)])%p)%=p; if(j-k>=i)(f[j][]+=(1ll*A[j]*(f[j-k][]+f[j-k][])%p)%p)%=p;
int len=max(k,n-j+i);
(cnt+=1ll*f[j][]*(n-len)%p)%=p; qz1[j]=(qz1[j-]+f[j][])%p;
qz0[j]=(qz0[j-]+f[j][])%p;
}
}
}
int a[],dfn[],low[],sta[],s[],sl,top,tot;
bool vis[];
int js(int x){
int sum=;vis[x]=;
for(rt i=;i<=n;i++)if(!vis[i]&&e[x][i])(sum+=js(i))%=p;
return sum;
}
void calc(int n,int *s){
if(!n)return;
memset(vis,,sizeof(vis));
for(rt i=;i<=n;i++)vis[s[i]]=;
for(rt i=;i<=n;i++)a[i]=jc[js(s[i])]-;
dp(n,a);
}
void dfs(int x,int pre){
dfn[x]=low[x]=++tot;sta[++top]=x;
for(rt i=;i<=n;i++)if(e[x][i]&&x!=i&&pre!=i){
if(!dfn[i]){
dfs(i,x);
low[x]=min(low[x],low[i]);
if(low[i]>dfn[x]){
sl=;while(sta[top+]!=i)s[++sl]=sta[top--];
calc(sl,s);memset(vis,,sizeof(vis));
vis[x]=;int gs=js(i);
(cnt+=1ll*(jc[gs]-)*(jc[n-gs]-)%p)%=p;
}
}
else if(i!=pre)low[x]=min(low[x],dfn[i]);
}
if(x==){
sl=;while(top)s[++sl]=sta[top--];
calc(sl,s);
}
}
int inv(int x){return (x==)?:1ll*inv(p%x)*(p-p/x)%p;}
int main(){
n=read();m=read();
jc[]=;
for(rt i=;i<=n;i++)jc[i]=1ll*jc[i-]*%p;
for(rt i=;i<=m;i++){
x=read();y=read();
e[x][y]=e[y][x]=;
}
dfs(,);
cout<<(1ll*cnt*inv(jc[n])%p+p)%p;
return ;
}
LOJ #2547 Luogu P4517「JSOI2018」防御网络的更多相关文章
- LOJ 2547 「JSOI2018」防御网络——思路+环DP
题目:https://loj.ac/problem/2547 一条树边 cr->v 会被计算 ( n-siz[v] ) * siz[v] 次.一条环边会被计算几次呢?于是去写了斯坦纳树. #in ...
- 【LOJ】 #2547. 「JSOI2018」防御网络
题解 如果只是一棵树的话,那么就枚举每条边,分成两部分大小为\(a\)和\(b\) 那么这条边被统计的方案数是\((2^a - 1)(2^b - 1)\) 如果是一个环的话,我们枚举环上至少有\(N ...
- LOJ #2116 Luogu P3241「HNOI2015」开店
好久没写数据结构了 来补一发 果然写的时候思路极其混乱.... LOJ #2116 Luogu P3241 题意 $ Q$次询问,求树上点的颜色在$ [L,R]$中的所有点到询问点的距离 强制在线 询 ...
- LOJ#2249 Luogu P2305「NOI2014」购票
几乎肝了半个下午和整个晚上 斜率优化的模型好多啊... LOJ #2249 Luogu P2305 题意 给定一棵树,第$ i$个点如果离某个祖先$ x$的距离不超过$ L_i$,可以花费$ P_i· ...
- LOJ #2527 Luogu P4491「HAOI2018」染色
好像网上没人....和我推出....同一个式子啊..... LOJ #2527 Luogu P4491 题意 $ n$个格子中每个格子可以涂$ m$种颜色中的一种 若有$ k$种颜色恰好涂了$ s$格 ...
- 「JSOI2018」战争
「JSOI2018」战争 解题思路 我们需要每次求给一个凸包加上一个向量后是否与另外一个凸包相交,也就是说是否存在 \[ b\in B,(b+w)\in A \] 这里 \(A, B\) 表示凸包内部 ...
- 「JSOI2014」电信网络
「JSOI2014」电信网络 传送门 一个点选了就必须选若干个点,最大化点权之和,显然最大权闭合子图问题. 一个点向它范围内所有点连边,直接跑最大权闭合子图即可. 参考代码: #include < ...
- LOJ 2550 「JSOI2018」机器人——找规律+DP
题目:https://loj.ac/problem/2550 只会写20分的搜索…… #include<cstdio> #include<cstring> #include&l ...
- LOJ 2548 「JSOI2018」绝地反击 ——二分图匹配+网络流手动退流
题目:https://loj.ac/problem/2548 如果知道正多边形的顶点,就是二分答案.二分图匹配.于是写了个暴力枚举多边形顶点的,还很愚蠢地把第一个顶点枚举到 2*pi ,其实只要 \( ...
随机推荐
- 第二篇-ubuntu18.04下怎么制作GIF动画
一.在桌面打开终端 二.接着通过apt安装byzanz.sudo apt-get install byzanz 三.安装完成后在终端执行“xwininfo”.xwininfo 四.然后鼠标会变成“+” ...
- 第二十五篇-Android 应用资源
这里介绍android的一些资源文件. 以一个登录界面为例. layout.xml <?xml version="1.0" encoding="utf-8" ...
- lucene之中文分词及其高亮显示(五)
中文分词:即换个分词器 Analyzer analyzer = new StandardAnalyzer();// 标准分词器 换成 SmartChineseAnalyzer analyze ...
- qml: 自定义按钮-- 仿QML自带控件;
import QtQuick 2.0 Rectangle { id: btn; width:; height:; radius:; border.color: "#A3A3A3"; ...
- Java集合、Iterator迭代器和增强for循环整理
集合 集合,集合是java中提供的一种容器,可以用来存储多个数据. 数组的长度是固定的.集合的长度是可变的.集合中存储的元素必须是引用类型数据 1.1 ArrayList集合存储元素 pac ...
- Java基础方法整理
方法 9.1方法概述 方法就是用来完成解决某件事情或实现某个功能的办法 可以通过在程序代码中引用方法名称和所需的参数,实现在该程序中执行(或称调用)该方法.方法,一般都有一个返回值,用来作为事情的处理 ...
- python中字符编码及unicode和utf-8区别
ascii和unicode是字符集,utf-8是编码集 字符集:为每一个「字符」分配一个唯一的 ID(学名为码位 / 码点 / Code Point) 编码规则:将「码位」转换为字节序列的规则(编码/ ...
- 怎么用ajax下载文件
可能大家都觉得没有必要用ajax来下载东西,用window.open(url)就可以搞定 但是这有一个问题,就是这就限定了只能用GET方式来请求了: 可能你又会说GET很符合REST的要求呀. 但是如 ...
- Python 排序和numpy排序,得到排序后索引序列(及源list的序列)
Python list 排序 & np list 排序 nums = [1.25, 0.98, 6.13, 7.62] li = np.array(nums) print(li) out = ...
- hibernate HQL查询参数设置
Hibernate中对动态查询参数绑定提供了丰富的支持,那么什么是查询参数动态绑定呢?其实如果我们熟悉传统JDBC编程的话,我们就不难理解查询参数动态绑定,如下代码传统JDBC的参数绑定: Prepa ...