CodeForces 1025G Company Acquisitions
题意
描述有点麻烦,就不写了。
\(\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}\) 写错了)
\]
这里有一个 trick:在势能函数中,可以直接钦定 \(f(0)=0\),于是得到
\]
由于这个等式看起来非常对称,同时它需要对于任意 \(u,v\) 都成立,于是我们可以考虑分离 \(u\) 和 \(v\):
\]
所以很明显有
\]
这个东西跟 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的更多相关文章
- Solution -「CF 1025G」Company Acquisitions
\(\mathcal{Description}\) Link. \(n\) 个公司,每个公司可能独立或者附属于另一个公司.初始时,每个公司附属于 \(a_i\)(\(a_i=-1\) 表示该公 ...
- 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 ...
- CodeForces 1062E Company
Description The company \(X\) has \(n\) employees numbered from \(1\) through \(n\). Each employee \ ...
- Codeforces Round #505 (Div 1 + Div 2 Combined) Solution
从这里开始 题目列表 瞎扯 Problem A Doggo Recoloring Problem B Weakened Common Divisor Problem C Plasticine zebr ...
- Codeforces 556D Restructuring Company
传送门 D. Restructuring Company time limit per test 2 seconds memory limit per test 256 megabytes input ...
- 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 ...
- [刷题]Codeforces 794C - Naming Company
http://codeforces.com/contest/794/problem/C Description Oleg the client and Igor the analyst are goo ...
- CodeForces 125E MST Company
E. MST Company time limit per test 8 seconds memory limit per test 256 megabytes input standard inpu ...
- Codeforces 1062 E - Company
E - Company 思路: 首先,求出每个点的dfs序 然后求一些点的公共lca, 就是求lca(u, v), 其中u是dfs序最大的点, v是dfs序最小的大点 证明: 假设o是这些点的公共lc ...
随机推荐
- Spring Boot 项目打成 war 包部署
Spring Boot 一个非常方便的功能就是支持内置的 Servlet 容器,一般我们部署 Spring Boot 应用时都是打成一个可执行的 Jar 包进行部署.其实 Spring Boot 也是 ...
- Pipelines
https://blog.csdn.net/buracag_mc/article/details/100155599 ML Pipelines提供了一组基于DataFrame构建的统一的高级API,可 ...
- Lua table(表)
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组.字典等. Lua table 使用关联型数组,你可以用任意类型的值来作数组的索引,但这个值不能是 nil. Lua ta ...
- ReverseFind的用法 ; 查找字符中最后一个字符
转载:https://blog.csdn.net/frivolousinstant/article/details/52796922 ReverseFind CString::ReverseFind ...
- WJQ与机房
sample input 5 6 7 2 3 1 1 5 0 6 0 0 8 6 6 5 3 4 3 7 8 2 4 0 0 6 9 sample output 20 样例解释: 分别以(2,1)为左 ...
- Tensorflow学习笔记No.0
这里更新一些学习Tensorflow过程中可能用到的实用工具. Jupyter Notebook Jupyter Notebook 是一个非常方便的python编程工具,支持可视化,对于学习pytho ...
- java进阶(26)--ForEach
JDK5.0后新特性 一.普通for循环
- SQL学习 小知识点(一)
这是我在做实验的时候总结的,随着学习可能会做更多的小总结 ssms上面把所有代码写下来后一块执行是行不通的(极大可能会报错),推测可能是因为ssms先对代码的语法进行了检查. --My expe ...
- coder初入职场必备:Eclipse+Tomcat8+MAVEN+SVN 工作环境搭建
1.JDK的安装 首先下载JDK,这个从sun公司官网可以下载,根据自己的系统选择64位还是32位,安装过程就是next一路到底.安装完成之后当然要配置环境变量了. ----------------- ...
- 1、微信小程序开发介绍。
微信小程序如何能达到快速的开发效果,下面首先介绍一下需要的框架,使用这些框架可以减少大部分编写代码时间. 微信小程序使用的框架:weui开源框架 后端数据使用的框架(包含管理和api接口框架):YiS ...