分析

如果打爆搜的话可以拿60分。

首先知道期望是可以累加的,即i通过j去到k的期望,等于i去到j的期望加j去到k的期望。

所以令d[i]表示i的出度,F[i]表示从i到i的父亲的期望,G[i]表示i的父亲到i的期望,j表示i其中任意一个儿子,k表示i的父亲,l表示k其中任意一个儿子,e表示k的父亲。

很容易推出:

\[F[i]=\dfrac{1}{d[i]}+\dfrac{1}{d[i]}\sum(1+F[j]+F[i])
\]

\[G[i]=\dfrac{1}{d[k]}+\dfrac{1}{d[k]}(1+G[k]+G[i])+\dfrac{1}{d[k]}\sum(1+F[l]+G[i])
\]

简化后得

\[F[i]=\sum{F[j]}+d[i]
\]

\[G[i]=G[k]+\sum{F[l]}+d[k]
\]

然后分q次走,用倍增lca很容易算出vi到vi+1的期望,把期望累加就可以了。

#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int d[600000],g[600000],f[600000],last[600000],next[600000],a[600000],dad[60000][50],deep[600000],fsum[600000],gsum[600000],m2[100];
int n,m,test,q,p,tot;
int bj(int x,int y)
{
next[++tot]=last[x];
last[x]=tot;
a[tot]=y;
d[x]++;
}
int dg(int x,int fa)
{
deep[x]=deep[fa]+1;
f[x]+=d[x];
for(int i=last[x];i;i=next[i])
{
if(a[i]!=fa)
{
dg(a[i],x);
f[x]+=f[a[i]];
}
}
}
int dg1(int x,int fa)
{
int allj=0;
for(int i=last[x];i;i=next[i])
{
if(a[i]!=fa)
{
allj+=f[a[i]];
}
}
for(int i=last[x];i;i=next[i])
{
if(a[i]!=fa)
{
g[a[i]]=d[x]+g[x]+allj-f[a[i]];
}
}
for(int i=last[x];i;i=next[i])
{
if(a[i]!=fa)
{
dg1(a[i],x);
}
}
}
int dg2(int x,int fa)
{
dad[x][0]=fa;
fsum[x]=fsum[fa]+f[x];
gsum[x]=gsum[fa]+g[x];
for(int i=last[x];i;i=next[i])
{
if(a[i]!=fa)
dg2(a[i],x);
}
}
int work(int x,int y,int z)
{
return fsum[x]-fsum[z]+gsum[y]-gsum[z];
}
int lca(int x,int y)
{
if(x==y) return 0;
int l=0;
if(deep[x]<deep[y])
{
l=x;
x=y;
y=l;
l=10000000;
}
int i,xx=x,yy=y,j;
if(deep[xx]>deep[yy])
{
j=int(log2(deep[xx]));
for(i=j;i>=0;i--)
{
if(deep[dad[xx][i]]>deep[yy])
{
xx=dad[xx][i];
}
}
xx=dad[xx][0];
}
if(xx==yy)
{
if(l==0) return work(x,y,xx);
else return work(y,x,xx);
}
j=int(log2(deep[xx]));
for(i=j;i>=0;i--)
{
if (dad[xx][i]!=dad[yy][i])
{
xx=dad[xx][i];
yy=dad[yy][i];
}
}
xx=dad[xx][0];
if(l==0) return work(x,y,xx);
else return work(y,x,xx);
}
int main()
{
int i,j,k,l,x,y;
m2[0]=1;
for(i=1;i<=20;i++)
m2[i]=m2[i-1]*2;
scanf("%d",&test);
while(test--)
{
scanf("%d",&n);
tot=0;
memset(d,0,sizeof(d));
memset(g,0,sizeof(g));
memset(f,0,sizeof(f));
memset(a,0,sizeof(a));
memset(last,0,sizeof(last));
memset(next,0,sizeof(next));
memset(dad,0,sizeof(dad));
memset(deep,0,sizeof(deep));
memset(fsum,0,sizeof(fsum));
memset(gsum,0,sizeof(gsum));
for(i=1;i<=n-1;i++)
{
scanf("%d%d",&x,&y);
bj(x,y);
bj(y,x);
}
deep[0]=0;
dg(0,0);
dg1(0,0);
dg2(0,0);
for(j=1;j<=int(log2(n));j++)
{
for(i=1;i<=n;i++)
{
dad[i][j]=dad[dad[i][j-1]][j-1];
}
}
scanf("%d",&q);
for(i=1;i<=q;i++)
{
int ans=0;
scanf("%d%d",&p,&x);
for(j=1;j<=p;j++)
{
scanf("%d",&y);
ans+=lca(x,y);
x=y;
}
printf("%d.0000\n",ans);
}
cout<<endl;
}
}

【宝藏】题解(五校联考3day1)的更多相关文章

  1. 【五校联考1day2】JZOJ2020年8月12日提高组T2 我想大声告诉你

    [五校联考1day2]JZOJ2020年8月12日提高组T2 我想大声告诉你 题目 Description 因为小Y 是知名的白富美,所以自然也有很多的追求者,这一天这些追求者打算进行一次游戏来踢出一 ...

  2. 【五校联考1day2】JZOJ2020年8月12日提高组T1 对你的爱深不见底

    [五校联考1day2]JZOJ2020年8月12日提高组T1 对你的爱深不见底 题目 Description 出乎意料的是,幸运E 的小R 居然赢了那个游戏.现在欣喜万分的小R 想要写一张明信片给小Y ...

  3. 【C】题解 (五校联考3day2)

    分析 这道题看上去很恶心,实际上只用记录四坨东西就能打DP了:y坐标最小的向上射的点.y坐标最大的向下射的点.y坐标最大和最小的向右射的点,转移显然.注意,如果该状态的值为零就可以略过,否则会超时. ...

  4. NOIP2016提高A组五校联考3总结

    第一题,本来一开始就想到了数位dp,结果脑残地打了十几个转移方程,总是调试不出来,一气之下放弃了. 调第一题几乎调了整节比赛,第二第三都没它. 第二题连边找联通块. 第三题题解都打了三页,看都不想看. ...

  5. 【五校联考5day1】登山

    题目 描述 题目大意 给你一个n∗nn*nn∗n的网格图.从(0,0)(0,0)(0,0)开始,每次只可以向右或向上移动一格,并且不能越过对角线(即不能为x<yx<yx<y). 网格 ...

  6. 【2020五校联考NOIP #2】矩阵

    咕咕咕到现在~ 题面传送门 题意: 给出一个 \(n\times n\) 的矩阵 \(A\).要你求有多少个 \(n\times n\) 的矩阵 \(B\) 满足: 每一行都是 \(1\) 到 \(n ...

  7. 五校联考 running (欧拉函数)

    题面 \(solution:\) 讲真吧,这道题真的出得,嗯,太恐怖了.考场上这道题真的把我看懵了,这道题以前是见过的,但欧拉函数?我学过吗?一道容斥都要超时的题目,我都要为我自己点根香了,拿着gcd ...

  8. 【五校联考3day2】C

    題意: 現有一平面直角坐標系,有n個點,每一個點必須向某一個方向發射射線,且任意一條射線必須與某一條坐標軸平行.定義一種發射射線的方案是合法的,則方案必須滿足: 1.沒有一條射線交叉 2.沒有一條射線 ...

  9. 五校联考R1 Day1T3 平面图planar(递推 矩阵快速幂)

    题目链接 我们可以把棱柱拆成有\(n\)条高的矩形,尝试递推. 在计算的过程中,第\(i\)列(\(i\neq n\))只与\(i-1\)列有关,称\(i-1\)列的上面/下面为左上/左下,第\(i\ ...

随机推荐

  1. C#异常操作

    C#异常处理子系统包括: Try:需要异常机制的函数在其中运行 Catch:捕获异常 Throw:抛出异常 Finally:在try结束实现 C#异常主要在Exception类中,而在CLR机制中的异 ...

  2. windows 的cmd设置代理的问题

    今天给公司一同事用cmd来安装gulp(npm install -g gulp), 死活安装不上,一直报一大堆的错误:经仔细查阅是代理的问题,故总结如下: 若公司的电脑是通过设置代理来访问外网,则需要 ...

  3. HTML5 列表、表格、媒体元素

    无序列表 <ul> <li>范冰冰演藏族女孩</li> <li>拍集体合影后自拍</li> <li>诗隆甜蜜出游</li& ...

  4. mysql中关于 like ,not like 的用法时不能显示空值的数据(空值不参与判断,直接过滤空值)

    一般在项目中用法是(这种没办法显示空值的数据): select * from 表 where 字段 like %aaa%; 解决空值不显示(除了显示的数据外,空值数据也可以显示): select * ...

  5. 应用安全 - Web安全 - 远程控制管理工具 - 汇总

    菜刀 蚁剑 冰蝎 DarkCommet ADT windows/upexec/reverse_tcp set PEXEC xxx

  6. [Web 前端] 034 计算属性,侦听属性

    目录 0. 方便起见,定个轮廓 1. 过滤器 2. 计算属性 2.1 2.2 3. 监听属性 0. 方便起见,定个轮廓 不妨记下方的程序为 code1 <!DOCTYPE html> &l ...

  7. [Web 前端] 031 bootstrap 的使用和全局 css 样式

    目录 0. 前言 1. 基本模板 2. 布局容器 2.1 container 2.2 container-fluid 3. 栅格系统 3.1 简介 3.2 栅格参数 3.3 实例:从堆叠到水平排列 2 ...

  8. Windows netcat 的工具的简单使用

    1. 下载 https://eternallybored.org/misc/netcat/ 2. 将目录添加到环境变量 C:\Work\netcat 3. 简单实验 4. 查看说明 UPDATE // ...

  9. dp基础√

    1.重叠子问题 2.能从小问题推到大问题 Dp: 设计状态+状态转移 状态: 1.状态表示: 是对当前子问题的解的局面集合的一种(充分的)描述.(尽量简洁qwq) ◦          对于状态的表示 ...

  10. uboot初识

    一. 什么是uboot 1.1. uboot的由来 1.1.1. uboot是SourceForge上的开源项目 1.1.2. uboot就是由一个人发起,然后由整个网络上所有感兴趣的人共同维护发展而 ...