[LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)
先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和。于是f[i][j]表示i的子树的权值和为j时,i子树内所有数的相互顺序都满足条件的概率,转移直接做一个背包卷积即可。
现在考虑反向边,通过容斥变成“至少有i条边不满足条件”的满足题目条件的概率,这样一来那些反向边会有一部分被变为正向边,另一部分被删除。如果枚举哪些边被反向的话可以做到$O(2^nn^2)$。但事实上我们并不关心具体是哪些边被反向了,而只关心有多少边被反向了。于是自然有一个方程f[i][j][k]表示i的子树的权值和为j,有k条边被反向的满足条件的概率。再注意到最后一维也是可以不要的,因为我们可以在DP过程中就计入容斥系数。感性理解,当一条从儿子连过来的边被反向时,它在最终结果中的系数一定与当前点的子树的系数相反,而当一条边被删除时,它的子树与当前点的子树之间独立,且最终系数与当前点的系数相同。复杂度$O(n^2)$,具体转移见代码。
#include<cstdio>
#include<algorithm>
#define rep(i,l,r) for (int i=(l); i<=(r); i++)
#define For(i,x) for (int i=h[x],k; i; i=nxt[i])
typedef long long ll;
using namespace std; const int N=,mod=,inf=1e9;
int n,rt,ans,cnt,u,v,inv[N],a[N],b[N],c[N],s[N],f[N][N],sz[N],g[N],h[N],to[N],val[N],nxt[N]; void add(int u,int v,int w){ to[++cnt]=v; val[cnt]=w; nxt[cnt]=h[u]; h[u]=cnt; }
void inc(int &x,int y){ x=(x+y>=mod) ? x+y-mod : x+y; }
void dec(int &x,int y){ x=(x-y<) ? x-y+mod : x-y; } int ksm(int a,int b){
int res=;
for (; b; a=1ll*a*a%mod,b>>=)
if (b & ) res=1ll*res*a%mod;
return res;
} void dfs(int x,int fa){
sz[x]=;
f[x][]=1ll*a[x]*s[x]%mod;
f[x][]=2ll*b[x]*s[x]%mod;
f[x][]=3ll*c[x]*s[x]%mod;
For(z,x) if ((k=to[z])!=fa){
dfs(k,x);
rep(i,,sz[x]*) rep(j,,sz[k]*){
int t=1ll*f[x][i]*f[k][j]%mod;
if (val[z]) dec(g[i+j],t),inc(g[i],t); else inc(g[i+j],t);
}
sz[x]+=sz[k];
rep(i,,sz[x]*) f[x][i]=g[i],g[i]=;
}
rep(i,,sz[x]*) f[x][i]=1ll*f[x][i]*inv[i]%mod;
} int main(){
freopen("fgo.in","r",stdin);
freopen("fgo.out","w",stdout);
scanf("%d",&n);
rep(i,,*n) inv[i]=ksm(i,mod-);
rep(i,,n) scanf("%d%d%d",&a[i],&b[i],&c[i]),s[i]=ksm(a[i]+b[i]+c[i],mod-);
rep(i,,n) scanf("%d%d",&u,&v),add(u,v,),add(v,u,);
dfs(,);
rep(i,,sz[]*) inc(ans,f[][i]);
printf("%d\n",ans);
return ;
}
[LOJ#3119][Luogu5405][CTS2019]氪金手游(DP+容斥)的更多相关文章
- [CTS2019]氪金手游(容斥+树形背包DP)
降智好题.本蒟蒻VP时没想到怎么做被题面迷惑了,只会20分的“好”成绩.简直自闭了. 首先显然度为0的点是白给的,根据等比数列求和公式即可求得.然后考虑这个树如果是一颗外向树,就是每个点先父亲再自己. ...
- Luogu5405 CTS2019氪金手游(容斥原理+树形dp)
考虑外向树怎么做.显然设f[i][j]为i子树中出现权值和为j的合法方案的概率,转移做树形背包即可. 如果树上只有一条反向边,显然可以先不考虑该边计算概率,再减去将整棵树看做外向树的概率.于是考虑容斥 ...
- [CTS2019]氪金手游
[CTS2019]氪金手游 各种情况加在一起 先考虑弱化版:外向树,wi确定 i合法的概率就是wi/sw sw表示子树的w的和,和子树外情况无关 这些概率乘起来就是最终合法的概率 如果都是外向树, f ...
- LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP
传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...
- 题解-CTS2019氪金手游
Problem \(\mathtt {loj-3124}\) 题意概要:给定 \(n\) 个点,\(w_i\) 分别有 \(p_{i,1},p_{i,2},p_{i,3}\) 的概率取 \(1,2,3 ...
- p5405 [CTS2019]氪金手游
题目大意 题意狗屁不通 看毛子语都比看这个题面强 分析 我们假设这棵树是一个内向树 那么我们可以轻易的得到dp[x][i]表示x点子树和为i的期望 转移只需枚举当前期望大小和子树期望大小即可 但是由于 ...
- 【题解】Luogu P5405 [CTS2019]氪金手游
原题传送门 我们珂以先考虑一条链的情况,设\(sum\)为所有\(w_i\)的总和,\(Sw_i\)表示\(\sum_{j=i}^nw_i\) \[1 \rightarrow 2 \rightarro ...
- Loj #3124. 「CTS2019 | CTSC2019」氪金手游
Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...
- 【CTS2019】氪金手游(动态规划)
[CTS2019]氪金手游(动态规划) 题面 LOJ 洛谷 题解 首先不难发现整个图构成的结构是一棵树,如果这个东西是一个外向树的话,那么我们在意的只有这棵子树内的顺序关系,子树外的关系与这棵子树之间 ...
随机推荐
- 洛谷 P4707 重返现世
洛谷 P4707 重返现世 k-minimax容斥 有这一个式子:\(E(\max_k(S))=\sum_{T\subseteq S}(-1)^{|T|-k}C_{|T|-1}^{k-1}\min(T ...
- 48、Spark SQL之与Spark Core整合之每日top3热点搜索词统计案例实战
一.概述 1.需求分析 数据格式: 日期 用户 搜索词 城市 平台 版本 需求: 1.筛选出符合查询条件(城市.平台.版本)的数据 2.统计出每天搜索uv排名前3的搜索词 3.按照每天的top3搜索词 ...
- 【BIEE】报表导出数据只显示500行,如何解决?
BIEE报表展示的时候每页只显示500行,进而导致导出的时候也只能导出500行,客户抱怨:每次只能导出500行,导出后还得自己合并! 解决思路: 1.找到路径$BIEE_HOME\instances\ ...
- windows 共享网络
windows 共享网络 今天单位的网络突然断了,光猫LOS亮红灯,宽带报修.等了半天还没来,下面科室要上报资料,急着用网, 通过windows的共享网络+无线网卡暂时用我的手机流量. 找了一台电脑插 ...
- 怎么对ORACLE里的CLOB字段进行模糊查询
select b.* from oss_service_log a left join oss_service_log_detail b on a.pk_log = b.pk_log where a. ...
- 剑指offer:扑克牌顺子
题目描述: LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张^_^)...他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他 ...
- 【转】vue中样式被覆盖的问题,vue中的style不生效
转载:http://www.cnblogs.com/shangjun6/p/11416054.html 在我们引入外部的样式时,发现自己无论如何都改不了外部的样式,自己的样式老被覆盖,究其原因还是我们 ...
- vue---封装request做数据请求
参考文章: https://www.cnblogs.com/qiuchuanji/p/10048805.html https://www.cnblogs.com/XHappyness/p/999387 ...
- Linux_CentOS中Mongodb4.x 安装调试、远程管理、配置 mongodb 管理员密码
Mongodb4.x 安装 官方文档:https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 1.配置 yum 源 1 ...
- matlab中可用于进行轮廓提取的函数
本文主要总结一下在matlab中可用于进行轮廓提取的函数. 1 bwperim 根据参考资料[2]的提示,可以使用bwperim()函数进行轮廓提取,具体代码如下: %读取原图im = imread( ...