bzoj5315/luoguP4517 防御网络(仙人掌,dp)

bzoj Luogu

题目描述略(太长了)

题解时间

本题和斯坦纳树无关。

题面保证了是一个仙人掌。。。?

但这个环之间甚至交点都没有。

对于不在环上的边很好弄。

在环上的很难单独考虑。

所以直接考虑一次算出一个环的贡献。

假设我们现在选了一个环上的不止一个点。

那么其中没有被选中的边肯定是连续的一段并且是所有被选中的点分割出的最长的。

这样很容易搞出一个枚举长度 $ l $ 的dp,通过前缀和可以优化到 $ O(n^3) $ 。

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long lint;
template<typename TP>inline void read(TP &tar)
{
TP ret=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')ch=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();}
tar=ret*f;
}
namespace RKK
{
const int N=211,mo=1000000007;
lint fpow(lint a,lint p){lint ret=1;while(p){if(p&1)ret=ret*a%mo;a=a*a%mo,p>>=1;}return ret;}
struct sumireko{int to,ne;}e[N<<2];int he[N],ecnt=1;
void addline(int f,int t){e[++ecnt].to=t;e[ecnt].ne=he[f],he[f]=ecnt;}
lint b2[N],b1[N];
int n,m;lint ans;
bool lonr[N<<1];
int fa[N],fi[N],sz[N],dep[N];
vector<int> rnd[N];int rcnt;
void getrnd(int x,int anc)
{
rcnt++;
for(int px=x;px!=anc;px=fa[px])
rnd[rcnt].push_back(px),lonr[fi[px]]=1;
rnd[rcnt].push_back(anc);
}
void dfs(int x)
{
sz[x]=1;
for(int i=he[x],t=e[i].to;i;i=e[i].ne,t=e[i].to)if(t!=fa[x])
{
if(!sz[t]) fa[t]=x,dep[t]=dep[x]+1,fi[t]=i>>1,dfs(t),sz[x]+=sz[t];
else if(dep[t]<dep[x])
{
lonr[i>>1]=1;
getrnd(x,t);
}
}
}
int s[N];
lint dp[N],dg[N],ds[N];
void work(int ri)
{
vector<int> &ve=rnd[ri];
int len=ve.size();
for(int i=1;i<len;i++) s[i]=sz[ve[i-1]];s[len]=n;
for(int i=len;i>1;i--) s[i]-=s[i-1];
memset(dp+1,0,8*len);
for(int l=1;l<=len;l++)
{
for(int i=1;i<=l;i++)
{
memset(dg+1,0,8*len),memset(ds+1,0,8*len);
dg[i]=ds[i]=b1[s[i]];
for(int j=i+1;j<=len;j++)
{
dg[j]=b1[s[j]]*(ds[j-1]-ds[max(1,j-l)-1]+mo)%mo;
ds[j]=(ds[j-1]+dg[j])%mo;
}
(dp[l]+=ds[len]-ds[max(i+1,len-l+i)-1]+mo)%=mo;
}
}
for(int i=1;i<=len;++i)
(ans+=(dp[i]-dp[i-1]+mo)*(len-i))%=mo;
} int Iris()
{
b2[0]=1;for(int i=1;i<=200;i++) b2[i]=(b2[i-1]<<1)%mo,b1[i]=b2[i]-1;
read(n),read(m);for(int i=1,x,y;i<=m;i++) read(x),read(y),addline(x,y),addline(y,x);
dfs(1);
for(int i=1;i<=m;i++)if(!lonr[i])
(ans+=b1[min(sz[e[i<<1].to],sz[e[i<<1|1].to])]*b1[n-min(sz[e[i<<1].to],sz[e[i<<1|1].to])]%mo)%=mo;
for(int i=1;i<=rcnt;i++) work(i);
(ans*=fpow(b2[n],mo-2))%=mo;
printf("%lld\n",ans);
return 0;
}
}
int main(){return RKK::Iris();}

bzoj5315/luoguP4517 [JSOI2018]防御网络(仙人掌,dp)的更多相关文章

  1. 【BZOJ5315】[JSOI2018]防御网络(动态规划,仙人掌)

    [BZOJ5315][JSOI2018]防御网络(动态规划,仙人掌) 题面 BZOJ 洛谷 题解 显然图是仙人掌. 题目给了斯坦纳树就肯定不是斯坦纳树了,,,, 总不可能真让你\(2^n\)枚举点集再 ...

  2. 洛谷P4517 [JSOI2018]防御网络(dp)

    题面 传送门 题解 翻译一下题意就是每次选出一些点,要用最少的边把这些点连起来,求期望边数 我也不知道为什么反正总之就是暴力枚举太麻烦了所以我们考虑贡献 如果一条边是割边,那么它会在图里当且仅当两边的 ...

  3. BZOJ5315 [JSOI2018]防御网络 【仙人掌 + dp】

    题目链接 BZOJ5315 题解 题目好吓人= =点仙人掌 + 斯坦纳树 我们只需求出对于所有选点的方案的斯坦纳树边长总和 \(n\)那么大当然不能状压,但是考虑一下如果这是一棵树,一个方案的贡献就是 ...

  4. bzoj 5315: [Jsoi2018]防御网络

    Description Solution 考虑每一条边的贡献 对于树边,如果两边各存在一个点,那么有贡献,总贡献就是 \((2^{size}-1)*(2^{n-size}-1)\) 分别对应两边的 \ ...

  5. 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)

    1952: [Sdoi2010]城市规划 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 73  Solved: 23[Submit][Status][ ...

  6. 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集

    4316: 小C的独立集 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 57  Solved: 41[Submit][Status][Discuss] ...

  7. BZOJ1023: [SHOI2008]cactus仙人掌图(仙人掌dp)

    Time Limit: 1 Sec  Memory Limit: 162 MBSubmit: 3467  Solved: 1438[Submit][Status][Discuss] Descripti ...

  8. 【BZOJ1487】[HNOI2009]无归岛(仙人掌 DP)

    题目: BZOJ1487 分析: 题目中给定的图一定是一棵仙人掌(每条边最多属于一个环),证明如下: 先考虑单独一个岛的情况.第一,一个岛一定是一张「弦图」,即任意一个大小超过 3 的环都至少有 1 ...

  9. bzoj4316小C的独立集(dfs树/仙人掌+DP)

    本题有两种写法,dfs树上DP和仙人掌DP. 先考虑dfs树DP. 什么是dfs树?其实是对于一棵仙人掌,dfs后形成生成树,找出非树边(即返祖边),然后dfs后每条返祖边+其所覆盖的链构成了一个环( ...

随机推荐

  1. libc++abi.dylib: terminating with uncaught exception of type NSException

    这是微信sdk注册时候报的错误 解决方法 选择Build Setting,在"Other Linker Flags"中加入"-Objc -all_load"

  2. 微信公众平台网页授权登陆access_token误区

    公众平台里显示 每日获取access_token上线2000次,此access_token并非网页授权登陆的access_token大家不要混淆 1,网页授权登陆的access_token是没有上线的 ...

  3. 攻防世界Web_ics_05

    题目: 题目描述:其他破坏者会利用工控云管理系统设备维护中心的后门入侵系统 题目场景:   1.进入云平台设备中心界面,查看以下源码发现?page= ,(点下云平台设备维护中心url里也能出?page ...

  4. Oracle之查询排序

    SQL排序查询 DESC降序.ASC升序(默认是升序) /* 语法结构: SELECT * | 列名1[,列名2...] | 表达式 FROM 表名 [WHERE 限定条件] ORDER BY 列名1 ...

  5. 基于angularJs坐标转换指令(经纬度中的度分秒转化为小数形式 )

    最近项目中,需要用户输入经纬度信息,因为数据库设计的时候,不可能分三个字段来存储这种信息,只能用double类型来进行存储. 计算公式  double r=度+分/60+秒/3600 <!DOC ...

  6. 「BUAA OO Unit 1 HW1」面向测试小白的简易评测机

    「BUAA OO Unit 1 HW1」面向测试小白的简易评测机 声明:本评测机所使用数据生成来自郭鸿宇同学,这对本评测机非常重要 目录 「BUAA OO Unit 1 HW1」面向测试小白的简易评测 ...

  7. net core or Linux

    某用户执行net core sdk 版本不生效 sudo chmod +x /home/username/netcore3.1sdk/dotnet //某个用户执行新版本net core sdk

  8. LeetCode-094-二叉树的中序遍历

    二叉树的中序遍历 题目描述:给定一个二叉树的根节点 root ,返回它的 中序 遍历. 示例说明请见LeetCode官网. 来源:力扣(LeetCode) 链接:https://leetcode-cn ...

  9. RENIX软件连接机箱测试RTSM基本操作——网络测试仪实操

    本文主要介绍了RENIX软件RTSM功能连接机箱测试的基本操作.文章分为三部分内容,第一部分为RTSM功能简介,第二部分为RTSM原理简介,第三部分为RTSM测试方案的具体介绍. 第一部分.RTSM功 ...

  10. redis存储token

    redis存储token 欢迎关注博主公众号「Java大师」, 专注于分享Java领域干货文章http://www.javaman.cn/sb2/redis-token 在实际开发中,token需要保 ...