题意

描述有点麻烦,就不写了。

\(\texttt{Data Range:}1\leq n\leq 500\)

题解

势能函数这个东西好神啊……

这个题目用常规的 DP 好像做不出来,所以我们可以考虑设计一个函数将一个局面到最终局面的期望进行评估,如果这个函数能够满足任意一次操作会使得函数值的期望增加 \(1\),那么就可以用最终局面的函数值减去初始局面的函数值就得到期望操作次数了。

同时,必须满足最终局面无法转移,因为有环的转移图比较难去算转移,这个时候势能函数就出来了。

这个题目中我们考虑设 \(F(S)=\sum f(a_i)\),其中 \(a_i\) 表示有多少个点依赖这个点(当 \(i\) 依赖别的点的时候 \(a_i\) 没有定义)。现在我们想来求出这个 \(f\)。

考虑每一次随机选择两个点 \(p,q\) 来合并,\(p,q\) 原本有 \(u,v\) 个依赖它的点,那么根据之前的定义有如下方程:(这里应该是 \(\texttt{s}\)\(\texttt{kydogli}\) 写错了)

\[f(u)+f(v)+1=\frac{1}{2}[f(u+1)+vf(0)]+\frac{1}{2}[f(v+1)+uf(0)]
\]

这里有一个 trick:在势能函数中,可以直接钦定 \(f(0)=0\),于是得到

\[f(u)+f(v)+1=\frac{1}{2}\left(f(u+1)+f(v+1)\right)
\]

由于这个等式看起来非常对称,同时它需要对于任意 \(u,v\) 都成立,于是我们可以考虑分离 \(u\) 和 \(v\):

\[\left(f(u)+\frac{1}{2}\right)+\left(f(v)+\frac{1}{2}\right)=\frac{1}{2}f(u+1)+\frac{1}{2}f(v+1)
\]

所以很明显有

\[2f(u)+1=f(u+1)
\]

这个东西跟 Hanoi 塔的递推式是一样的,所以我们可以直接写出 \(f(u)=2^u-1\)。

然后用末状态的势能函数值减去初始状态的就得到了期望操作次数。

代码

#include<bits/stdc++.h>
using namespace std;
typedef int ll;
typedef long long int li;
const ll MAXN=2e5+51,MOD=1e9+7;
ll n,x,res;
ll sz[MAXN];
inline ll read()
{
register ll num=0,neg=1;
register char ch=getchar();
while(!isdigit(ch)&&ch!='-')
{
ch=getchar();
}
if(ch=='-')
{
neg=-1;
ch=getchar();
}
while(isdigit(ch))
{
num=(num<<3)+(num<<1)+(ch-'0');
ch=getchar();
}
return num*neg;
}
inline ll qpow(ll base,ll exponent)
{
ll res=1;
while(exponent)
{
if(exponent&1)
{
res=(li)res*base%MOD;
}
base=(li)base*base%MOD,exponent>>=1;
}
return res;
}
int main()
{
n=read();
for(register int i=1;i<=n;i++)
{
x=read(),x!=-1?sz[x]++:1;
}
for(register int i=1;i<=n;i++)
{
sz[i]?res=(res+qpow(2,sz[i])-1)%MOD:1;
}
printf("%d\n",(qpow(2,n-1)-1-res+MOD)%MOD);
}

CodeForces 1025G Company Acquisitions的更多相关文章

  1. Solution -「CF 1025G」Company Acquisitions

    \(\mathcal{Description}\)   Link.   \(n\) 个公司,每个公司可能独立或者附属于另一个公司.初始时,每个公司附属于 \(a_i\)(\(a_i=-1\) 表示该公 ...

  2. Codeforces 1090A - Company Merging - [签到水题][2018-2019 Russia Open High School Programming Contest Problem A]

    题目链接:https://codeforces.com/contest/1090/problem/A A conglomerate consists of n companies. To make m ...

  3. CodeForces 1062E Company

    Description The company \(X\) has \(n\) employees numbered from \(1\) through \(n\). Each employee \ ...

  4. Codeforces Round #505 (Div 1 + Div 2 Combined) Solution

    从这里开始 题目列表 瞎扯 Problem A Doggo Recoloring Problem B Weakened Common Divisor Problem C Plasticine zebr ...

  5. Codeforces 556D Restructuring Company

    传送门 D. Restructuring Company time limit per test 2 seconds memory limit per test 256 megabytes input ...

  6. Codeforces Round #321 (Div. 2) B. Kefa and Company 二分

    B. Kefa and Company Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/580/pr ...

  7. [刷题]Codeforces 794C - Naming Company

    http://codeforces.com/contest/794/problem/C Description Oleg the client and Igor the analyst are goo ...

  8. CodeForces 125E MST Company

    E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...

  9. Codeforces 1062 E - Company

    E - Company 思路: 首先,求出每个点的dfs序 然后求一些点的公共lca, 就是求lca(u, v), 其中u是dfs序最大的点, v是dfs序最小的大点 证明: 假设o是这些点的公共lc ...

随机推荐

  1. SCI-HUB打不开了?附SCIHUB最新下载方式

    写在前面: 今天给大家推荐一个文献下载工具包:飞鸟科研助手 www.flybird.cc输入flybird.cc同样可以访问,存书签不失联!强调下:flybird.cc 读研之前,在一家NGS生殖应用 ...

  2. gateway(二、过滤器)

    过滤器其实是路由转发+过滤器 自定义过滤器 首先创建一个类继承下边两个类,实现过滤器 然后在启动项中通过创建bean的方式创建路由器 @Componentpublic class TimeFilter ...

  3. GAN的理论 Theory behind GAN

    任务:想要找到一个高维空间中的分布 P_data(x),要在目标类别的区域,采样的概率是高的:在那个区域之外,probability是低的.但这个P_data(x)分布的具体形式(pdf)是不知道的, ...

  4. Python练习题 009:水仙花数

    [Python练习题 009] 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数& ...

  5. IDEA配置jQuery,$符号不再显示黄色波浪线

    在使用IDEA搭建Maven的Web环境时,编写的JQuery入口函数时,遇到了未知符号的提示,并且在前端页面js的console里报错. 以下是错误信息:  解决方案:  继续看图: 配置成功生效: ...

  6. vue+elementUI实现 分页表格的单选或者多选、及禁止部分选择

    一.vue+elementUI实现 分页表格前的多选 多选效果图: 代码如下: <el-table ref="multipleTable" :data="listD ...

  7. 【转载】可能是世界上最牛逼的网站统计程序——Matomo

    大家做网站的时候一般都会使用网站统计程序.通常,国内网站会使用百度统计.CNZZ等,而国外网站则会使用Google Analytics等统计.国内的统计程序普遍功能不太丰富,且响应速度一般.Googl ...

  8. docker-创建容器常见选项

    1. docker run创建容器常见选项 1.1 创建容器 选项 描述 -i,-interactive 交互式 -t,-tty 分配一个伪终端 -d,-detach 运行容器到后台 -e,-env ...

  9. 热力图 vue 项目中使用热力图插件 “heatmap.js”(保姆式教程)

    我现在写的这项目是用CDN引入 heatmap.js, 可根据自己项目情况使用哪种方式引入插件. 官网地址 "https://www.patrick-wied.at/static/heatm ...

  10. 如何轻松使用 C 语言实现一个栈?​

    什么是数据结构? 数据结构是什么?要了解数据结构,我们要先明白数据和结构,数据就是一些int char 这样的变量,这些就是数据,如果你是一个篮球爱好者,那么你的球鞋就是你的数据,结构就是怎么把这些数 ...