先考虑外向树的做法,显然一个点在其子树内第一个出现的概率等于它的权值除以它子树的权值和。于是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+容斥)的更多相关文章

  1. [CTS2019]氪金手游(容斥+树形背包DP)

    降智好题.本蒟蒻VP时没想到怎么做被题面迷惑了,只会20分的“好”成绩.简直自闭了. 首先显然度为0的点是白给的,根据等比数列求和公式即可求得.然后考虑这个树如果是一颗外向树,就是每个点先父亲再自己. ...

  2. Luogu5405 CTS2019氪金手游(容斥原理+树形dp)

    考虑外向树怎么做.显然设f[i][j]为i子树中出现权值和为j的合法方案的概率,转移做树形背包即可. 如果树上只有一条反向边,显然可以先不考虑该边计算概率,再减去将整棵树看做外向树的概率.于是考虑容斥 ...

  3. [CTS2019]氪金手游

    [CTS2019]氪金手游 各种情况加在一起 先考虑弱化版:外向树,wi确定 i合法的概率就是wi/sw sw表示子树的w的和,和子树外情况无关 这些概率乘起来就是最终合法的概率 如果都是外向树, f ...

  4. LOJ3124 CTS2019 氪金手游 概率、容斥、树形DP

    传送门 D2T3签到题可真是IQ Decrease,概率独立没想到然后就20pts滚粗了 注意题目是先对于所有点rand一个权值\(w\)然后再抽卡. 先考虑给出的关系是一棵外向树的情况.那么我们要求 ...

  5. 题解-CTS2019氪金手游

    Problem \(\mathtt {loj-3124}\) 题意概要:给定 \(n\) 个点,\(w_i\) 分别有 \(p_{i,1},p_{i,2},p_{i,3}\) 的概率取 \(1,2,3 ...

  6. p5405 [CTS2019]氪金手游

    题目大意 题意狗屁不通 看毛子语都比看这个题面强 分析 我们假设这棵树是一个内向树 那么我们可以轻易的得到dp[x][i]表示x点子树和为i的期望 转移只需枚举当前期望大小和子树期望大小即可 但是由于 ...

  7. 【题解】Luogu P5405 [CTS2019]氪金手游

    原题传送门 我们珂以先考虑一条链的情况,设\(sum\)为所有\(w_i\)的总和,\(Sw_i\)表示\(\sum_{j=i}^nw_i\) \[1 \rightarrow 2 \rightarro ...

  8. Loj #3124. 「CTS2019 | CTSC2019」氪金手游

    Loj #3124. 「CTS2019 | CTSC2019」氪金手游 题目描述 小刘同学是一个喜欢氪金手游的男孩子. 他最近迷上了一个新游戏,游戏的内容就是不断地抽卡.现在已知: - 卡池里总共有 ...

  9. 【CTS2019】氪金手游(动态规划)

    [CTS2019]氪金手游(动态规划) 题面 LOJ 洛谷 题解 首先不难发现整个图构成的结构是一棵树,如果这个东西是一个外向树的话,那么我们在意的只有这棵子树内的顺序关系,子树外的关系与这棵子树之间 ...

随机推荐

  1. Idea 编译项目异常 Error:java: Compilation failed: internal java compiler error

  2. Unity初学者必备5款资源插件

    Unity技术经理Sam Dogantimur为Unity初学者精心挑选和推荐了5款入门必备资源插件,涵盖游戏开发原型创作.着色器特效以及角色控制等,帮助Unity新手快速上手游戏开发. 我们将详细介 ...

  3. Java-JUC(十四):SimpleDateFormat是线程不安全的

    SimpleDateFormat是Java提供的一个格式化和解析日期的工具类,日常开发中应该经常会用到,但是由于它是线程不安全的,多线程公用一个SimpleDateFormat实例对日期进行解析.格式 ...

  4. Android 属性property_get/property_set

    每个属性都有一个名称和值,他们都是字符串格式.属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换.属性是在整个系统中全局可见的.每个进程可以get/set属性. 在系统初始化时 ...

  5. gdal 根据条件选择数据

  6. Python集成开发环境(IDE:Integrated Development Environment): PyCharm

    原文地址:https://www.runoob.com/python/python-install.html IDE下载安装 PyCharm 是由 JetBrains 打造的一款 Python IDE ...

  7. ai segmentation

    不只是医学图像啊,自然图像分割用unet也能取得非常好的效果.搞过kaggle语义分割的比赛carvana.感觉最好用的还是unet,其次linknet和提拉米苏也好用.large kernel也不错 ...

  8. Linux_CentOS下搭建Nodejs 生产环境-以及nodejs进程管理器pm2的使用

    nodejs安装:https://www.cnblogs.com/loaderman/p/11596661.html nodejs 进程管理器 pm2 的使用 PM2 是一款非常优秀的 Node 进程 ...

  9. 仿log4j 写 log 代码

    log4j 一直有个问题无法满足我,有可能我还不知道怎么去使用它. 就是他会把项目中所有的日志信息都记到一个文件里面,而业务系统往往需要根据某个业务流程查看日志分析. public class Bus ...

  10. aardio 文档

    aardio 文档 根据官方帮助手册制作了一份文档,添加了一些特性. 支持手机阅读 不用电脑也可以学习 aau 了,不受屏幕大小限制,你的小清新还是你的小清新~ 简单的搜索功能 快捷复制示例代码 基于 ...