我们考虑计算红色点与非红色点的对数。

我们用f[i][j]表示i的子树中有j个红色点的概率,将i所有子树合并。

接着我们对于每一个状态,枚举i是红色还是非红色算概率。

同时我们可以求出i和i子树内一个是红色一个是非红色的期望对数。

同理我们计算出黑与非黑,白与非白。

由于红与非红=红黑+红白,黑与非黑=红黑+黑白,白与非白=红白+黑白,因此我们可以把红黑、红白和黑白算出来。

下面这份代码大部分都是模板,自行忽略...

#include <iostream>
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <time.h>
#include <stdlib.h>
#include <string>
#include <bitset>
#include <vector>
#include <set>
#include <map>
#include <queue>
#include <algorithm>
#include <sstream>
#include <stack>
#include <iomanip>
using namespace std;
#define pb push_back
#define mp make_pair
typedef pair<int,int> pii;
typedef long long ll;
typedef double ld;
typedef vector<int> vi;
#define fi first
#define se second
#define fe first
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
#define es(x,e) (int e=fst[x];e;e=nxt[e])
#define VIZ {printf("digraph G{\n"); for(int i=1;i<=n;i++) for es(i,e) printf("%d->%d;\n",i,vb[e]); puts("}");}
#define SZ 66666
int n,m,fst[SZ],vb[SZ],nxt[SZ],M=0;
ll MOD=998244353;
void ad_de(int a,int b)
{
++M; nxt[M]=fst[a]; fst[a]=M; vb[M]=b;
}
void adde(int a,int b)
{
ad_de(a,b); ad_de(b,a);
}
#define S 20
int dep[SZ],fa[SZ],p[SZ][S],sz[SZ];
void dfs(int x,int f=0)
{
sz[x]=1;
for es(x,e)
{
int b=vb[e]; if(b==f) continue;
fa[b]=p[b][0]=x; dep[b]=dep[x]+1;
dfs(b,x); sz[x]+=sz[b];
}
}
void pre()
{
dfs(1);
for(int i=1;i<S;i++)
{
for(int j=1;j<=n;j++) p[j][i]=p[p[j][i-1]][i-1];
}
}
int jump(int x,int d)
{
for(int s=S-1;s>=0;s--)
{
if(p[x][s]&&dep[p[x][s]]>=d) x=p[x][s];
}
if(dep[x]!=d) exit(-1);
return x;
}
int lca(int a,int b)
{
if(dep[a]>dep[b]) swap(a,b);
b=jump(b,dep[a]);
if(a==b) return a;
for(int s=S-1;s>=0;s--)
{
if(p[a][s]!=p[b][s]) a=p[a][s], b=p[b][s];
}
return p[a][0];
}
int dis(int a,int b)
{
return dep[a]+dep[b]-dep[lca(a,b)]*2;
}
#define gc getchar()
int gint()
{
int s=0,t=0;
while(s=gc,s<'0'||s>'9');t=s-48;
while(s=gc,s>='0'&&s<='9') t=t*10+s-48;
return t;
}
#define gi gint()
ll qp(ll a,ll b)
{
a%=MOD; ll ans=1;
while(b)
{
if(b&1) ans=ans*a%MOD;
a=a*a%MOD; b>>=1;
}
return ans;
}
ll gx[23],rp[SZ][3];
ll gl[1003][1003][3];
ll tmp[1003];
bool lv[1003];
ll tot[3];
void dfs2(int x,int f=0)
{
if(lv[x])
{
for(int j=0;j<3;j++)
gl[x][0][j]=(1-rp[x][j])%MOD,
gl[x][1][j]=rp[x][j];
return;
}
int cs=0; gl[x][0][0]=gl[x][0][1]=gl[x][0][2]=1;
for es(x,e)
{
int b=vb[e];
if(b==f) continue;
dfs2(b,x);
int cc=cs+sz[b];
for(int k=0;k<3;k++)
{
for(int i=0;i<=cc;i++) tmp[i]=0;
for(int i=0;i<=cs;i++)
{
for(int j=0;j<=sz[b];j++)
{
tmp[i+j]=(tmp[i+j]+gl[x][i][k]*gl[b][j][k]%MOD)%MOD;
}
}
for(int i=0;i<=cc;i++) gl[x][i][k]=tmp[i];
}
cs=cc;
}
for(int k=0;k<3;k++)
{
for(int i=0;i<=cs+1;i++) tmp[i]=0;
for(int i=0;i<=cs;i++)
{
ll y=i*qp(cs,MOD-2)%MOD;
ll g1=y*gl[x][i][k]%MOD;
tot[k]=(tot[k]+g1*(cs-i)%MOD)%MOD;
ll g2=(1-y)*gl[x][i][k]%MOD;
tot[k]=(tot[k]+g2*i%MOD)%MOD;
tmp[i+1]=(tmp[i+1]+g1)%MOD;
tmp[i]=(tmp[i]+g2)%MOD;
}
for(int i=0;i<=cs+1;i++) gl[x][i][k]=tmp[i];
}
}
int main()
{
FO(tree3)
n=gi, gx[01]=gi, gx[02]=gi, gx[12]=gi;
for(int i=1;i<n;i++)
{
int x=gi, y=gi;
adde(x,y);
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<3;j++) rp[i][j]=gi;
}
pre();
for(int x=1;x<=n;x++)
{
bool leaf=1;
for es(x,e) leaf&=(vb[e]==fa[x]);
lv[x]=leaf;
}
dfs2(1);
ll aa=(tot[0]+tot[1]+tot[2])%MOD*qp(2,MOD-2)%MOD,ans=0;
ans=ans+gx[01]*(aa-tot[2])%MOD;
ans=ans+gx[02]*(aa-tot[1])%MOD;
ans=ans+gx[12]*(aa-tot[0])%MOD;
ans=(ans%MOD+MOD)%MOD;
cout<<ans<<"\n";
}

四校联考 tree3的更多相关文章

  1. [2017/5/28]FJ四校联考

    来自FallDream的博客,未经允许,请勿转载,谢谢. 话说这一段时间算是过去了,好久好久之后终于又有联考了  没想到这次到我们学校出题,昨天才想起来,临时花一天赶了一套,我出了一个sbFFT,质量 ...

  2. [四校联考P3] 区间颜色众数 (主席树)

    主席树 Description 给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色. Input 输入文件第一行有两个整数:N和C 输 ...

  3. [3.19FJ四校联考]

    来自FallDream的博客.未经允许,请勿转载,谢谢. ---------------------------------------------------- A.积分,不会  以后补 B.给定一 ...

  4. 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7

    此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...

  5. szoj461【四校联考0430】挑战

    传送门:(涉及版权忽略) [题解] 我们发现n的范围很小,提示我们可以折半,然后我们就会了O(T2^(n/2)*n)的做法,然而会T. 考虑如何优化.直接排序会多一个log(2^(n/2))也就是n, ...

  6. 三校联考 Day3

    三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...

  7. 【赛时总结】NOIP2018-三校联考1024

    ◇NOIP三校联考-1024◇ 发现以前的博客写得似乎都很水……基本上都没什么阅读量QwQ 决定改过自新╰( ̄ω ̄o) 就从这篇博客开始吧~ 现场考得无地自容,看到题解才发现一些东西……(我第三题还没 ...

  8. [2019多校联考(Round 6 T3)]脱单计划 (费用流)

    [2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...

  9. [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)

    [多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...

随机推荐

  1. linux 安装nginx

    linux系统为Centos6.5 64位 nginx为1.4.7 从http://nginx.org/download/上下载相应的版本 解压 tar -zxvf nginx-1.4.7.tar.g ...

  2. 从零开始学Python第一周:Python基础(上)

    Python语法基础(上) 一,Python的变量 (1)创建变量 变量的含义:存储信息的地方 创建变量并赋值 x = 1 print x x = 123 #再次赋值 print x (2)使用变量 ...

  3. Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍

    回到目录 Lind.DDD项目主要面向敏捷,快速开发,领域驱动等,对于它的分层也是能合并的合并,比之前大叔的框架分层更粗糙一些,或者说更大胆一些,在开发人员使用上,可能会感觉更方便了,更益使用了,这就 ...

  4. Netty(二)入门

    在上篇<Netty(一)引题>中,分别对AIO,BIO,PIO,NIO进行了简单的阐述,并写了简单的demo.但是这里说的简单,我也只能呵呵了,特别是NIO.AIO(我全手打的,好麻烦). ...

  5. jgGrid中的editrules使用函数来进行验证

    jgGrid中的editrules 用于设置一些用于可编辑列的colModel的额外属性,大多数的时候是用来在提交到服务器之前验证用户的输入合法性的.比如editrules:{edithidden:t ...

  6. 一个强大的jquery分页插件

    点击这里查看效果 这个分页插件使用方便,引用keleyidivpager.js和keleyidivpager.css文件,然后在htm(或者php,aspx,jsp等)页面中对分页总数,参数名,前缀后 ...

  7. hibernate(3) —— 关系映射

    hibernate中关系映射指的是实体类与实体类间的关系.和数据库中表与表之间的关系类似,有一对一,多对一,一对多,多对多四种映射关系. 一:一对一映射 两个对象之间是一对一的关系,如人和身份证之间是 ...

  8. 纯HTML5+CSS3制作生日蛋糕

    以一个前端开发的身份绘制一个简单的蛋糕庆祝一下今天这个好日子吧,程序员庆生的乐趣与哀愁啊.写的比较简陋,感兴趣的看一下吧. 先发个效果图吧 蛋糕分为三个部分,底部蛋糕,顶层蛋糕和蜡烛部分.HTML的布 ...

  9. Linux安全基础:网络配置命令

    1.ifconfig查看和配置网络接口信息(1)设ip地址ifconfig eth0 192.168.0.1(2)暂时关闭或启用网卡ifconfig eth0 downifconfig eth0 up ...

  10. SQL Queries from Transactional Plugin Pipeline

    Sometimes the LINQ, Query Expressions or Fetch just doesn't give you the ability to quickly query yo ...