BZOJ4770 图样(概率期望+动态规划)

news/2024/11/24 19:05:55/

  考虑求出所有MST的权值和再除以方案数,方案数显然是2mn

  按位考虑,显然应该让MST里的边高位尽量为0。那么根据最高位是0还是1将点集划分成两部分,整张图的MST就是由两部分各自的MST之间连一条最小边得到的。两部分的MST权值和可以dp得到,即设f[i][j]表示i个点权值在0~2j-1的MST权值和,枚举最高位是0的点的数量k,由f[k][j-1]和f[i-k][j-1]转移而来。问题只剩下求最小边的权值和。

  这个东西也不是很好求,考虑求最小边不小于某值的方案数。同样根据最高位是0还是1划分点集成四个部分,转移比较显然,主要注意边界,即所有边该位都为1的情况,以及某边没有点的情况。盯着这个边界调了一下午最后发现果然这里根本就没写挂,而是预处理2k时少了一部分。惨绝人寰。

  复杂度O(n4m2m),虽然darkbzoj上只跑了3s,bzoj上还是根本卡不过去。

#include<iostream> 
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
#define ll long long
#define N 51
#define M 8
#define P 258280327
char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<'0'||c>'9')) c=getchar();return c;}
int gcd(int n,int m){return m==0?n:gcd(m,n%m);}
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
int n,m,C[N][N],f[N][M+1],g[N][N][M],h[N][N][M][1<<M],p[N*M];
void inc(int &x,int y){x+=y;if (x>=P) x-=P;}
int inv(int a)
{int s=1;for (int k=P-2;k;k>>=1,a=1ll*a*a%P) if (k&1) s=1ll*s*a%P;return s;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("bzoj4770.in","r",stdin);freopen("bzoj4770.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read(),m=read();C[0][0]=1;for (int i=1;i<=n;i++){C[i][0]=C[i][i]=1;for (int j=1;j<i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%P;}p[0]=1;for (int i=1;i<(n+1)*m;i++) p[i]=(p[i-1]<<1)%P;for (int i=0;i<=n;i++)for (int j=0;j<=n-i&&j<=i;j++)h[i][j][0][0]=1;for (int k=1;k<m;k++)for (int x=0;x<(1<<k);x++){for (int i=0;i<=n;i++) h[i][0][k][x]=p[i*k];for (int i=1;i<=n;i++)for (int j=1;j<=n-i&&j<=i;j++)for (int u=0;u<=i;u++)for (int v=0;v<=j;v++)if (u==0&&j==v||i==u&&v==0) inc(h[i][j][k][x],1ll*h[max(u,j-v)][min(u,j-v)][k-1][max(x-(1<<k-1),0)]*h[max(i-u,v)][min(i-u,v)][k-1][max(x-(1<<k-1),0)]%P);else inc(h[i][j][k][x],1ll*C[i][u]*C[j][v]%P*h[max(u,v)][min(u,v)][k-1][x]%P*h[max(i-u,j-v)][min(i-u,j-v)][k-1][x]%P);}for (int i=1;i<=n;i++)for (int j=1;j<=n-i&&j<=i;j++)for (int k=1;k<m;k++)for (int x=1;x<(1<<k);x++)inc(g[i][j][k],h[i][j][k][x]);for (int k=1;k<=m;k++)for (int i=1;i<=n;i++){inc(f[i][k],f[i][k-1]);inc(f[i][k],f[i][k-1]);for (int j=1;j<i;j++)inc(f[i][k],1ll*C[i][j]*(1ll*f[j][k-1]*p[(i-j)*(k-1)]%P+1ll*f[i-j][k-1]*p[j*(k-1)]%P+p[(k-1)*(i+1)]+g[max(j,i-j)][min(j,i-j)][k-1])%P);}cout<<1ll*f[n][m]*inv(p[m*n])%P;return 0;
}

 

转载于:https://www.cnblogs.com/Gloid/p/9977714.html


http://www.ppmy.cn/news/147403.html

相关文章

P4770-[NOI2018]你的名字【SAM,线段树合并】

正题 题目链接:https://www.luogu.com.cn/problem/P4770 题目大意 给出一个长度为 n n n的字符串 S S S。 q q q次询问给出一个串 T T T和一个区间 [ L , R ] [L,R] [L,R]&#xff0c;求 T T T有多少个本质不同的子串不是 S L ∼ R S_{L\sim R} SL∼R​的子串。 1 ≤ n ≤ 5 …

corei7 64 poky linux,Core i7-4770K Linux之旅:有喜有忧

Core i7-4770K Linux之旅&#xff1a;有喜有忧 出处&#xff1a;快科技 2013-06-09 11:37:15 作者&#xff1a;上方文Q 编辑&#xff1a;上方文Q[爆料] 收藏文章 Haswell的评测多如牛毛&#xff0c;但都是在Windows下进行的&#xff0c;Linux用户肯定看不下去了。Phoronix又…

酷睿i7cpu适合的linux,CPU性能篇 - Core i7-4770K Linux之旅:有喜有忧_Linux新闻_Linux公社-Linux系统门户网站...

CPU性能篇—— Rodinia是学术界经常使用的科学测试工具。OpenMP LavaMD负载中&#xff0c;4770K相比3770K快了12&#xff05;&#xff0c;8350表现也可以。 OpenMP Leukocyte负载里&#xff0c;4770K对比3770K的优势依然有10&#xff05;&#xff0c;但是8350大亮了&#xff0c…

HDU 4770

这道题利用DFS进行枚举就可以了。 由于图中的点很多&#xff0c;但是vulnerable room 很少&#xff0c;所以要把这些点保存起来。此外&#xff0c;由于回溯的时候判断哪些room任然被灯照射有些麻烦&#xff0c;所以用状态压缩的方式表示一个vulnerable room 被照射的状态&#…

BZOJ4770 图样

牛逼的DP&#xff0c;一股TC气息 求期望的话可以先求出所有情况的和再除以情况数 考虑 f[i][j] 表示 i 个点每个点的权值都是j位的二进制数&#xff0c;最小生成树的和 一定是最高位为0的和为1的分别的形成生成树&#xff0c;然后两部分之间连一条边 那么枚举 i 个点里有多…

群晖服务器性能测试,原创首发!群晖J3455 G4560 I7 4770HQ功耗性能测试!

本帖最后由 -我傻也要中二 于 2019-4-28 16:58 编辑 写在最前&#xff1a;本人也是新手入得群晖&#xff0c;一开始直接买的J3455&#xff0c;群晖的强大的功能&#xff0c;嘿嘿舒服。不过因为我本身是有一台windows服务器用来搭建ERP的&#xff0c;考虑到群晖可以运行虚拟机就…

4770: 栈操作

定义一个栈&#xff0c;可以对栈进行“压入堆栈”、“弹出栈顶元素”、“清空堆栈”、“获取栈顶元素”等操作。键盘输入一些命令&#xff0c;可以执行上述操作。本题中&#xff0c;栈元素均为整数。栈的最大元素个数为1000。 输入 输入各个命令&#xff0c;它们对应的格式如…

碧砚适合佳能328 4452 ICD520 4472 4450 硒鼓4700一体机墨盒4770

转载于:https://www.cnblogs.com/zengkefu/p/6036577.html