Skip to content

Commit

Permalink
ccpc 2024 hrb L
Browse files Browse the repository at this point in the history
  • Loading branch information
triccsr committed Oct 28, 2024
1 parent e5783dd commit 2a1cd79
Show file tree
Hide file tree
Showing 3 changed files with 131 additions and 8 deletions.
133 changes: 128 additions & 5 deletions content/post/CCPC2024-Harbin/index.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
---
title : 'CCPC2024 哈尔滨站 战犯寄录'
title : 'CCPC 2024 哈尔滨站 战犯寄录'
date : 2024-10-20T20:04:03+08:00
draft : false
url : 947b0acb
math: true
tags:
- XCPC
---
Expand All @@ -13,17 +14,139 @@ tags:
有返回值的函数必须return一个值,否则可能RE。
{{</admonition>}}

[补题链接](https://contest.ucup.ac/contest/1817?v=1)

3人场,~~队友过了~~7题,~~我只负责贡献罚时~~

大佬们只需要负责A题就行了,而战犯要考虑的可就多了。

## Day -1, Thu
## 题解(待续)

### L. A Game On Tree


给定一棵$n$个节点的树,边权都为1。两个人分别从树上的$\frac{n(n-1)}{2}$条路径中等概率随机选择一条,求两条路径的交的长度平方的期望。


#### 某菜鸡的补题做法

力大砖飞的树形dp。对于树上任意节点$u$,维护$u$子树内的点到$u$的所有长度$\geq 1$的“半路径”的0次项、1次项和2次项。将$u$的儿子$v$合并至$dp_u$时拼接两者内部的“半路径”。特判直上直下的路径。

(虽然强大的fyc认为这种维护多项式+拼接路径的做法没前途,但这做法确实能过)

两人的路径等概率选择,情况数有限。首先将期望转化为方案数。

对于每条从$w$到$u$的“半路径”(其中$u$为$w$的祖先),设其常数为$\sum_{x,y\in \mathrm{subtree}(w)}[\mathrm{LCA}(x,y)=w]$,记半路径$h$的常数为$k(h)$。k可以通过一个简单的dp求出。

对于终点同为点$u$且没有公共边的两条“半路径”$h_1$和$h_2$,路径$h_1+h_2$对总方案数的贡献为$k(h_1)\cdot k(h_2)\cdot (h_1+h_2)^2$。

按照正常的树上dp流程,对于每个节点$u$枚举儿子$v$,用$dp_v$更新全局答案和$dp_u$。则对全局答案的贡献为(下面的$\mathrm{subtree}(u)$为当前已加入的部分子树):

$$
\begin{align*}
\Delta ans &=\sum_{h_1\in \mathrm{subtree}(u)}\sum_{h_2 从\mathrm{subtree}(v)到u}k(h_1)\cdot k(h_2)\cdot(\mathrm{len}(h_1)+\mathrm{len}(h_2))\\\\
&= \sum_{h_1\in \mathrm{subtree}(u)} k(h_1) \sum_{h_2 从\mathrm{subtree}(v)到u}k(h_2)\cdot(\mathrm{len}(h_1)+\mathrm{len}(h_2))\\\\
&= \sum k(h_1)\bigl(\sum k(h_2)\cdot \mathrm{len}^2(h_2)\bigr)+\sum k(h_2)\bigl(\sum k(h_1)\cdot \mathrm{len}^2(h_1)\bigr)+2(\sum k(h_1)\cdot \mathrm{len}(h_1))(\sum k(h_2)\cdot \mathrm{len}(h_2))
\end{align*}
$$

完美拆成了两部分的0次、1次、2次项形式。

代码:

```cpp
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
#define int long long
const int N=1e5+11;
const LL MOD=998244353;
int n;
vector<int> e[N];
LL dp[N][3];//dp[u][i]表示u节点子树内所有到u的边非空“半路径”的i次项的和
LL sz[N],ss[N];
LL ksm(LL a,LL x){//求逆元
LL ret=1;
a=(a%MOD+MOD)%MOD;
while(x){
if(x&1)ret=ret*a%MOD;
a=a*a%MOD;
x>>=1;
}
return ret;
}
void dfs_pre(int now,int fa){//求k
sz[now]=1;
ss[now]=0;
for(int to:e[now]){
if(to==fa)continue;
dfs_pre(to,now);
sz[now]+=sz[to];
ss[now]+=sz[to]*sz[to]%MOD;
}
ss[now]%=MOD;
}
void dfs(int now,int fa,LL &ans){
memset(dp[now],0,sizeof(dp[now]));
for(int to:e[now]){
if(to==fa)continue;
dfs(to,now,ans);
LL t[3];
t[0]=dp[to][0];
t[1]=(dp[to][1]+dp[to][0])%MOD;
t[2]=(dp[to][2]+2ll*dp[to][1]+dp[to][0])%MOD;//t[0...3]所有半路径的长度+1
for(int i=0;i<3;++i){//加入v到u的“半路径”
t[i]=(t[i]+sz[to]*sz[to]%MOD-ss[to])%MOD;
}
LL tmp=t[0]*dp[now][2]%MOD+dp[now][0]*t[2]%MOD+2ll*t[1]*dp[now][1]%MOD;
tmp+=((n-sz[to])*(n-sz[to])%MOD-ss[now]+sz[to]*sz[to]%MOD-(n-sz[now])*(n-sz[now])%MOD)%MOD*t[2];
ans+=tmp%MOD;
for(int i=0;i<3;++i){
dp[now][i]=(dp[now][i]+t[i])%MOD;
}
}
}
void work(){
cin>>n;
for(int i=1;i<=n;++i){
e[i].clear();
}
for(int i=0;i<n-1;++i){
int u,v;
cin>>u>>v;
e[u].push_back(v);
e[v].push_back(u);
}
LL ans=0;
dfs_pre(1,0);
dfs(1,0,ans);
ans=(ans%MOD+MOD)%MOD;
LL ii=ksm(1ll*n*(n-1)/2ll,MOD-2);
cout<<ans*ii%MOD*ii%MOD<<"\n";
}
signed main(){
int T;
cin>>T;
while(T--){
work();
}
return 0;
}
```
#### 强大的fyc的考场做法
考虑到所有边的边权都为1,路径长度的平方可以转化为路径上的点对数量-路径上的边数量。点对数量可以换根dp,边数量普通dp。
## 游记
### Day -1, Thu
12点从和园出发,3点半的飞机,18点到哈尔滨。坐机场大巴快线直达哈尔滨火车站,Dew买成了有经停站的1号线。
打车去我妈单位,在单位附近吃砂锅。
## Day 0, Fri
### Day 0, Fri
中午吃了博物馆松雷上面的老厨家,酸菜不酸,锅包肉也不够酸,地三鲜不咸,评价为假东北菜。(不过往酸菜里加黑胡椒的异端做法还挺好吃的)
Expand Down Expand Up @@ -54,7 +177,7 @@ tags:
~~结论:虽然贵的也没多好吃,但便宜的不一定能吃~~
## Day 1, Sat
### Day 1, Sat
fyc大佬继续被硬控。我和Dew佬中午吃了林大的俭德园,Dew老师带了一大盒牛奶,全洒在包里了。
Expand All @@ -68,7 +191,7 @@ fyc解封,晚上索菲亚+中央大街+防洪纪念塔三连。索菲亚每走
我问我爸为啥用这么抽象的设备,我爸说电脑、键鼠和桌椅都是ccpc组委会送来的,系统也是组委会的人装的,和他没关系。(我爸:群已经被我禁言了,在知乎上骂就骂吧,反正我不上知乎)
## Day2, Sun
### Day2, Sun
正式赛加上了鼠标垫,但椅子没换,场上一直有人坐塌椅子。
Expand Down
4 changes: 2 additions & 2 deletions content/post/nju-flowers-2024/index.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: 南京大学仙林校区花卉图鉴
title: 南京大学 仙林校区 花卉图鉴
tags:
- 日常
url: 62a2ca63
Expand Down Expand Up @@ -332,7 +332,7 @@ markup:
- 非常明显的甜香
- 花期较短

大概9月26日初开,现在几乎谢完了
感觉分两批开,第一批大概9月26日初开,第二批10月10日开

非常香,非常香,非常香。

Expand Down

0 comments on commit 2a1cd79

Please sign in to comment.