bzoj5315/luoguP4517 [JSOI2018]防御网络(仙人掌,dp)
bzoj5315/luoguP4517 防御网络(仙人掌,dp)
题目描述略(太长了)
题解时间
本题和斯坦纳树无关。
题面保证了是一个仙人掌。。。?
但这个环之间甚至交点都没有。
对于不在环上的边很好弄。
在环上的很难单独考虑。
所以直接考虑一次算出一个环的贡献。
假设我们现在选了一个环上的不止一个点。
那么其中没有被选中的边肯定是连续的一段并且是所有被选中的点分割出的最长的。
这样很容易搞出一个枚举长度 $ 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)的更多相关文章
- 【BZOJ5315】[JSOI2018]防御网络(动态规划,仙人掌)
[BZOJ5315][JSOI2018]防御网络(动态规划,仙人掌) 题面 BZOJ 洛谷 题解 显然图是仙人掌. 题目给了斯坦纳树就肯定不是斯坦纳树了,,,, 总不可能真让你\(2^n\)枚举点集再 ...
- 洛谷P4517 [JSOI2018]防御网络(dp)
题面 传送门 题解 翻译一下题意就是每次选出一些点,要用最少的边把这些点连起来,求期望边数 我也不知道为什么反正总之就是暴力枚举太麻烦了所以我们考虑贡献 如果一条边是割边,那么它会在图里当且仅当两边的 ...
- BZOJ5315 [JSOI2018]防御网络 【仙人掌 + dp】
题目链接 BZOJ5315 题解 题目好吓人= =点仙人掌 + 斯坦纳树 我们只需求出对于所有选点的方案的斯坦纳树边长总和 \(n\)那么大当然不能状压,但是考虑一下如果这是一棵树,一个方案的贡献就是 ...
- bzoj 5315: [Jsoi2018]防御网络
Description Solution 考虑每一条边的贡献 对于树边,如果两边各存在一个点,那么有贡献,总贡献就是 \((2^{size}-1)*(2^{n-size}-1)\) 分别对应两边的 \ ...
- 【BZOJ-1952】城市规划 [坑题] 仙人掌DP + 最大点权独立集(改)
1952: [Sdoi2010]城市规划 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 73 Solved: 23[Submit][Status][ ...
- 【BZOJ-4316】小C的独立集 仙人掌DP + 最大独立集
4316: 小C的独立集 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 57 Solved: 41[Submit][Status][Discuss] ...
- BZOJ1023: [SHOI2008]cactus仙人掌图(仙人掌dp)
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3467 Solved: 1438[Submit][Status][Discuss] Descripti ...
- 【BZOJ1487】[HNOI2009]无归岛(仙人掌 DP)
题目: BZOJ1487 分析: 题目中给定的图一定是一棵仙人掌(每条边最多属于一个环),证明如下: 先考虑单独一个岛的情况.第一,一个岛一定是一张「弦图」,即任意一个大小超过 3 的环都至少有 1 ...
- bzoj4316小C的独立集(dfs树/仙人掌+DP)
本题有两种写法,dfs树上DP和仙人掌DP. 先考虑dfs树DP. 什么是dfs树?其实是对于一棵仙人掌,dfs后形成生成树,找出非树边(即返祖边),然后dfs后每条返祖边+其所覆盖的链构成了一个环( ...
随机推荐
- torch.utils.data.DataLoader与迭代器转换
在做实验时,我们常常会使用用开源的数据集进行测试.而Pytorch中内置了许多数据集,这些数据集我们常常使用DataLoader类进行加载. 如下面这个我们使用DataLoader类加载torch.v ...
- Solution -「CodeChef JUMP」Jump Mission
\(\mathcal{Description}\) Link. 有 \(n\) 个编号 \(1\sim n\) 的格子排成一排,并有三个权值序列 \(\{a_n\},\{h_n\},\{p_n ...
- Spring Boot AOP 扫盲,实现接口访问的统一日志记录
AOP 是 Spring 体系中非常重要的两个概念之一(另外一个是 IoC),今天这篇文章就来带大家通过实战的方式,在编程猫 SpringBoot 项目中使用 AOP 技术为 controller 层 ...
- 一个杂项PDF
不是很难,但是就是比较考虑个人的细心程度,下载压缩包解压得到一个pdf文件,直接打开发现没有什么隐藏的信息,准换成word也是,没有什么东西,使用winhex打开看一下,一开始是没有注意到什么的,这里 ...
- OpenStack学习系列之十二:安装ceph并对接OpenStack
Ceph 是一种为优秀的性能.可靠性和可扩展性而设计的统一的.分布式文件系统.Ceph 的统一体现在可以提供文件系统.块存储和对象存储,分布式体现在可以动态扩展.在国内一些公司的云环境中,通常 ...
- Spring Boot+RabbitMQ 通过fanout模式实现消息接收(支持消费者多实例部署)
本文章适用的场景:同一条消息可以被多个消费者同时消费.注意:当消费者多实例部署时,会轮询消费消息.网上有大量的的案例展示:P生产一条消息,消费者服务C中建立Q1和Q2两个队列共同消费.但极少的材料展示 ...
- 【C# 锁】 SpinLock锁 详细分析(包括内部代码)
OverView 同步基元分为用户模式和内核模式 用户模式:Iterlocked.Exchange(互锁).SpinLocked(自旋锁).易变构造(volatile关键字.volatile类.Thr ...
- Docker-可视化管理工具总结-推荐使用Portainer
对于初学docker的小白,一款好的可视化工具有助于快速掌握docker基本形态和概念,下面针对docker可视化工具做些总结 ui-for-docker UI For Docker是一个使用Dock ...
- django程序在windows服务器上发布
django程序在windows服务器上发布 参考文献:https://www.cnblogs.com/djangocn/p/10227006.html 1.安装 IIS 和 GCI 打开服务器管理器 ...
- 基于Kubernetes/K8S构建Jenkins持续集成平台(上)-2
基于Kubernetes/K8S构建Jenkins持续集成平台(上)-2 Kubernetes实现Master-Slave分布式构建方案 传统Jenkins的Master-Slave方案的缺陷 Mas ...