首页 > 其他分享 >Luogu 3412 仓鼠找sugar II

Luogu 3412 仓鼠找sugar II

时间:2023-07-20 18:34:32浏览次数:41  
标签:ch limits int Luogu sum II fa 3412 define

你也许说得对,但我是真看不懂第一篇题解那个答案式子……

预处理是差不多的。

设 \(f_u\) 表示从 \(u\to fa(u)\) 的期望步数,\(g_u\) 为 \(fa(u)\to u\) 的期望步数,\(d_u\) 为 \(u\) 的度数。

那么显然有:

\[f_u=\frac{1}{d_u}\left(1+\sum\limits_{v\in son(u)}(1+f_v+f_u)\right) \]

移项后得到 \(f_u=d_u+\sum\limits_{v\in son(u)}{f_v}\)。

求 \(g_u\) 的话要分两类:

  • \(fa(u)\neq \text{root}\):

\[g_u=\frac{1}{d_{fa(u)}}\left(1+(1+g_{fa(u)}+g_u)+\sum\limits_{v\in son(fa(u))\setminus \{u\}}(1+f_v+g_u)\right) \]

  • \(fa(u)=\text{root}\):

\[g_u=\frac{1}{d_{fa(u)}}\left(1+\sum\limits_{v\in son(fa(u))\setminus\{u\}}(1+f_v+g_u)\right) \]

由于 \(g_{\text{root}}=0\),移项后均能得到 \(g_{u}=f_{fa(u)}+g_{fa(u)}-f_u\)。

然后就可以预处理出 \(f,g\) 了。

考虑所有路径 \(u\to v\),统计从 \(u\) 走到 \(v\) 的期望步数,再除去 \(n^2\)。一条 \(u\to v\) 的路径,将其贡献与 \(v\to u\) 的路径合并。记一条边 \(e:(u, fa(u))\) 的权值为 \(w_e=f_u+g_u\),\(\text{lca}(u,v)\) 为 \(k\),就变成了经典问题。注意到:

\[\begin{aligned}&\sum\limits_{(u,v)}\left(\sum\limits_{p\in [u\to k]\setminus \{k\}}f_p+\sum\limits_{p\in [k\to v]\setminus \{k\}}g_p\right)\\=&\sum\limits_{u,v(\text{无序})}\left(\sum\limits_{p\in [u\to v]}(f_p+g_p)-f_k-g_k\right)\\=&\sum\limits_{e:(u, fa(u))}w_esz_u\left(n-sz_u\right)\end{aligned} \]

第 \(2\) 步为考虑每条边对答案的贡献,即为穿过这条边的路径条数。

然后就很好做了。复杂度 \(O(n)\)。

#include <bits/stdc++.h>
#define int long long
using namespace std;

namespace vbzIO {
	char ibuf[(1 << 20) + 1], *iS, *iT;
	#if ONLINE_JUDGE
	#define gh() (iS == iT ? iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20) + 1, stdin), (iS == iT ? EOF : *iS++) : *iS++)
	#else
	#define gh() getchar()
	#endif
	#define rd read
	#define wr write
	#define pc putchar
	#define pi pair<int, int>
	#define mp make_pair
	#define fi first
	#define se second
	#define pb push_back
	#define ins insert
	#define era erase
	inline int read () {
		char ch = gh();
		int x = 0;
		bool t = 0;
		while (ch < '0' || ch > '9') t |= ch == '-', ch = gh();
		while (ch >= '0' && ch <= '9') x = (x << 1) + (x << 3) + (ch ^ 48), ch = gh();
		return t ? ~(x - 1) : x;
	}
	inline void write(int x) {
		if (x < 0) {
			x = ~(x - 1);
			putchar('-');
		}
		if (x > 9)
			write(x / 10);
		putchar(x % 10 + '0');
	}
}
using vbzIO::read;
using vbzIO::write;

const int N = 1e5 + 100;
const int mod = 998244353;
int n, ans, sz[N], f[N], g[N], d[N];
vector<int> t[N];

int qpow(int p, int q) {
    int res = 1;
    while (q) {
        if (q & 1) res = 1ll * res * p % mod;
        p = p * p % mod, q >>= 1;
    }
    return res;
}

void dfs1(int u, int fa) {
    sz[u] = 1, f[u] = d[u];
    for (int v : t[u]) {
        if (v == fa) continue;
        dfs1(v, u), f[u] += f[v], sz[u] += sz[v];
    }
}

void dfs2(int u, int fa) {
    if (u != 1) g[u] = f[fa] - f[u] + g[fa];
    for (int v : t[u]) {
        if (v == fa) continue;
        dfs2(v, u);
    }
    if (u != 1) (ans += 1ll * (f[u] + g[u]) * sz[u] % mod * (n - sz[u]) % mod) %= mod;
}

signed main() {
    n = rd();
    for (int i = 1, u, v; i <= n - 1; i++) {
        u = rd(), v = rd(), d[u]++, d[v]++;
        t[u].pb(v), t[v].pb(u);
    }
    dfs1(1, 0);
    dfs2(1, 0);
    wr(1ll * ans * qpow(1ll * n * n % mod, mod - 2) % mod);
	return 0;
}

标签:ch,limits,int,Luogu,sum,II,fa,3412,define
From: https://www.cnblogs.com/Ender32k/p/17569334.html

相关文章

  • 题解 P4955 【[USACO14JAN]Cross Country Skiing S】
    postedon2021-02-2710:04:32|under题解|source这道题其实没有绿这么难,只需要二分+搜索就行了。读入。注意尽量不要用scanf读入bool,这好像是UB,可以用一个变量\(x\)存输入的数,然后直接类型转换。二分。套模版就行了,等一下我们再写\(\operatorname{check}()\)函......
  • 【题解】Luogu[P3360] 偷天换日
    solution开题显然是个树形dp,只不过在树形dp上又增加了背包问题。我们不妨将每个走廊看成一个点,把交叉口看成边(当然也可以把交叉口看成点,不过写起来麻烦一些),于是就转化为了一棵二叉树。我们设\(f_{i,j}\)表示以\(i\)为根的子树内,花费了不超过\(j\)时间,能拿到的最大价值......
  • 【题解】Luogu[P2607] [ZJOI2008] 骑士
    题目说给定\(n\)个点\(n\)个关系,也就是\(n\)条边,显然是基环树,又因为没有规定一定连通,于是我们可以将题目简化为给定一个基环树森林,点有点权,相邻的两个点不能同时选,问最大点权和。part1我们先考虑如果没有环,只是树,该怎么做。这一部分很简单,令\(f_{i,0/1}\)表示以\(i\)......
  • LeetCode 1201. Ugly Number III 数学+二分答案
    Anuglynumberisapositiveintegerthatisdivisibleby\(a\),\(b\),or\(c\).Givenfourintegers\(n\),\(a\),\(b\),and\(c\),returnthe\(n\)thuglynumber.Solution考虑如何二分答案,假设一个函数\(f(num,a,b,c)\)会得到\([1,num]\)中uglynumb......
  • Win11 将网站发布到IIS 遇到 HTTP Error 500.19 code 0x8007000d, web.config 文件
    当我们在IIS发布网站时,遇到 HTTPError500.19  code0x8007000d,web.config文件有错误。有可能是web.config文件指定了module: AspNetCoreModuleV2,但我们的机器没有安装。可尝试按照如下方式安装对应版本的IIS支持。 ......
  • 代码随想录算法训练营第三十三天| 1049. 最后一块石头的重量 II 494. 目标和 474.一
    1049.最后一块石头的重量II思路:因为含有两个石头的相撞,所以需要把dp的目标值改成sum/2,然后取得这个目标值的最大值,然后对sum-2*target代码:1//要求:有多个石头,两两撞击,取得剩下的石头的最小值2//——》一定要碰到最后一个3//注意:4//1,x==y:两个粉碎,x<y:y=......
  • 【嵌入式面经专题】4-IIC协议
    1.概述I2C(Inter-IntegratedCircuitBUS)集成电路总线,该总线由NXP(原PHILIPS)公司设计,多用于主控制器和从器件间的主从通信,在小数据量场合使用,传输距离短,任意时刻只能有一个主机等特性。2.物理层只要求两条总线线路,一条是串行数据线SDA,一条是串行时钟线SCL。(IIC是半双工,而不是......
  • 代码随想录算法训练营第59天 | ● 503.下一个更大元素II ● 42. 接雨水 - 第10章
     第十章 单调栈part02 ●  503.下一个更大元素II ●  42. 接雨水    详细布置   503.下一个更大元素II  这道题和 739. 每日温度 几乎如出一辙,可以自己尝试做一做 https://programmercarl.com/0503.%E4%B8%8B%E4%B8%80%E4%B8%AA%E6%9B%B4%E5%......
  • [刷题笔记] Luogu P1168 中位数
    ProblemDescription题目描述非常简洁,不作解释。Solution题目要求对前奇数项求中位数?朴素的做法是暴力,但是范围1e5显然T。这里主要介绍一种堆顶堆的做法。堆顶堆是什么呢?我们不妨开两个堆,一个大根堆一个小根堆。动态维护中位数,初始令前1位的中位数为\(a_i\),遍历数组,若遇到比中......
  • 剑指 Offer 58 - II. 左旋转字符串
    classSolution{public:stringreverseLeftWords(strings,intn){reverse(s.begin(),s.begin()+n);#反转用reverse而不是s.reversereverse(s.begin()+n,s.end());#这里用s.begin()+n而不是s.begin()+n+1,因为s.begin()是指向集......