四校联考 tree3
我们考虑计算红色点与非红色点的对数。
我们用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的更多相关文章
- [2017/5/28]FJ四校联考
来自FallDream的博客,未经允许,请勿转载,谢谢. 话说这一段时间算是过去了,好久好久之后终于又有联考了 没想到这次到我们学校出题,昨天才想起来,临时花一天赶了一套,我出了一个sbFFT,质量 ...
- [四校联考P3] 区间颜色众数 (主席树)
主席树 Description 给定一个长度为 N 颜色序列A,有M个询问:每次询问一个区间里是否有一种颜色的数量超过了区间的一半,并指出是哪种颜色. Input 输入文件第一行有两个整数:N和C 输 ...
- [3.19FJ四校联考]
来自FallDream的博客.未经允许,请勿转载,谢谢. ---------------------------------------------------- A.积分,不会 以后补 B.给定一 ...
- 【四校联考】【比赛题解】FJ NOIP 四校联考 2017 Round 7
此次比赛为厦门一中出题.都是聚劳,不敢恭维. 莫名爆了个0,究其原因,竟然是快读炸了……很狗,很难受. 话不多说,来看看题: [T1] 题意: 样例: PS:1<=h[i]<=100000 ...
- szoj461【四校联考0430】挑战
传送门:(涉及版权忽略) [题解] 我们发现n的范围很小,提示我们可以折半,然后我们就会了O(T2^(n/2)*n)的做法,然而会T. 考虑如何优化.直接排序会多一个log(2^(n/2))也就是n, ...
- 三校联考 Day3
三校联考 Day3 大水题 题目描述:给出一个圆及圆上的若干个点,问两个点间的最远距离. solution 按极角排序,按顺序枚举,显然距离最远的点是单调的,线性时间可解出答案. 大包子的束缚 题目描 ...
- 【赛时总结】NOIP2018-三校联考1024
◇NOIP三校联考-1024◇ 发现以前的博客写得似乎都很水……基本上都没什么阅读量QwQ 决定改过自新╰( ̄ω ̄o) 就从这篇博客开始吧~ 现场考得无地自容,看到题解才发现一些东西……(我第三题还没 ...
- [2019多校联考(Round 6 T3)]脱单计划 (费用流)
[2019多校联考(Round 6 T3)]脱单计划 (费用流) 题面 你是一家相亲机构的策划总监,在一次相亲活动中,有 n 个小区的若干男士和 n个小区的若干女士报名了这次活动,你需要将这些参与者两 ...
- [多校联考2019(Round 5 T1)] [ATCoder3912]Xor Tree(状压dp)
[多校联考2019(Round 5)] [ATCoder3912]Xor Tree(状压dp) 题面 给出一棵n个点的树,每条边有边权v,每次操作选中两个点,将这两个点之间的路径上的边权全部异或某个值 ...
随机推荐
- C标准头文件<stdio.h>
是很多人学C语言接触的第一个头文件,顾名思义,stdio就是"标准输入输出",其中声明了一组关于输入输出的类型,宏和函数,其中就包括了打印著名的"hello,world! ...
- 从零开始学 Java - Spring 支持 CORS 请求踩的坑
谁没掉进过几个大坑 记得好久之前,总能时不时在某个地方看到一些标语,往往都是上面一个伟人的头像,然后不管是不是他说的话,下面总是有看起来很政治正确且没卵用的屁话,我活到目前为止,最令我笑的肚子痛得是下 ...
- svg.js教程及使用手册详解(一)
做毕设的时候,因为要使用到画图和自定义动画,所以接触到了SVG.网上关于SVG和Canvas的对比很多,具体的辨析这里就不赘言.网上关于SVG的所谓教程基本上都是SVG本身,但是却没有一个针对svg. ...
- 火狐浏览器如何js关闭窗口的几种解决方法
今天在项目上有一个页面要求在几秒后自动关闭,想着还比较简单,用window.close()就可以了,但是用IE/谷歌/火狐浏览器试了一下,发现IE可以,谷歌用网上的兼容方法也可以实现,但是火狐这里卡住 ...
- iOS HTML 字符串中的图片 自适应大小
本文原文地址:http://www.cnblogs.com/qianLL/p/6095988.html 有时候 我们接收数据的时候 后台给的数据室一串HTML 的字符串 但是 我们要显示出来 这 ...
- cocos2dx骨骼动画Armature源码分析(三)
代码目录结构 cocos2dx里骨骼动画代码在cocos -> editor-support -> cocostudio文件夹中,win下通过筛选器,文件结构如下.(mac下没有分,是整个 ...
- RMAN备份失败: ORA-19502 & ORA-27072: File I/O error
早上检查一ORACLE数据库的RMAN备份的邮件时,发现出现了ORA-27072: File I/O error等错误,具体信息如下所示: channel ORA_DISK_1: starting p ...
- Vmware扩展磁盘如何不需重启系统
在虚拟机Vmware中我们有时候需要添加新的虚拟磁盘或给已有虚拟磁盘扩容(expand),在新增磁盘或磁盘扩容后,Linux系统并不能马上识别到.也就是说你看不到磁盘空间变化(使用fdisk -l查看 ...
- Symantec Backup Exec 2012 Agent For Linux安装
Backup Exec 2012 介绍 Backup Exec 2012 是一种为虚拟和物理环境提供保护的集成产品,能够简化备份和灾难恢复,并提供了无可匹敌的恢复功能.借助于强大的 Symantec ...
- SQL Server 复制快照执行错误 错误代码 14068
问题描述: 使用基于快照初始化的事务复制,在上次发布的时候,添加项,执行快照agent,报错,错误信息: Error messages:Message: The subscription status ...