首页 > 其他分享 >CF1770E Koxia and Tree

CF1770E Koxia and Tree

时间:2024-06-23 18:11:47浏览次数:16  
标签:10 fa int siz ll Tree 蝴蝶 Koxia CF1770E

题目描述

给定一棵\(n\)个点的树,在\(k\)个位置上存在蝴蝶,我们需要给\(n-1\)条边定向,如果一条边的起点有蝴蝶且终点没有蝴蝶,那么蝴蝶将被移动到终点,我们会按照给定边的顺序移动,问最终所有蝴蝶的树上距离的和的期望,答案除于\(\frac{k(k-1)}{2}\),对\(998244353\)取模

\[k\le n\le 300000 \]

题解

首先考虑第一个问题,我们怎么求\(k\)个点的距离和,可以随便钦定一个点为根,求出\(siz_u\)表示子树\(u\)中的指定结点个数,答案显然就是\(\sum siz_u(k-siz_u)\)
意识到每条边只会经历一遍,所以\(siz_u\)只会变化\(1\),可以通过\(u\)到父亲的边的移动情况讨论得出
由于\(u\)到其父亲上的边未走过之前,\(u\)和其父亲有蝴蝶的概率是互不影响的,所以我们只需要知道\(u\)和其父亲上有蝴蝶的概率就可以算出\(\Delta ans\),新的概率也可以动态维护\(p_u=p_{fa_u}=\frac{p_u+p_{fa_u}}{2}\)

\(\text{code}\)

#include<cstdio>
#include<algorithm>
#include<vector>
#define ll long long
using namespace std;
const ll mod=998244353,inv2=499122177;
ll ksm(ll a,ll b)
{
	if(b==0) return 1;
	ll tmp=ksm(a,b>>1);
	if(b&1) return tmp*tmp%mod*a%mod;
	else return tmp*tmp%mod; 
}
void read(int &res)
{
	res=0;char ch=getchar();
	while(ch<'0'||ch>'9') ch=getchar();
	while('0'<=ch&&ch<='9') res=(res<<1)+(res<<3)+(ch^48),ch=getchar();
}
const int N=3e5+100;
int n,k,a[N+10],A[N+10],B[N+10];
vector<int> e[N+10];
bool vis[N+10];
int fa[N+10],siz[N+10];
ll ans,p[N+10];
void dfs(int u)
{
	siz[u]=vis[u];
	for(int v:e[u])
	{
		if(v==fa[u]) continue;
		fa[v]=u,dfs(v),siz[u]+=siz[v];
	}
	ans+=1ll*siz[u]*(k-siz[u]);
}
int main()
{
	read(n),read(k);
	for(int i=1;i<=k;i++) read(a[i]),vis[a[i]]=true,p[a[i]]=1;
	for(int i=1;i<n;i++) read(A[i]),read(B[i]),e[A[i]].push_back(B[i]),e[B[i]].push_back(A[i]);
	dfs(1);
	for(int i=1;i<n;i++)
	{
		if(fa[A[i]]==B[i]) swap(A[i],B[i]);
		ans+=p[A[i]]*(mod+1-p[B[i]])%mod*(1ll*(siz[B[i]]+1)*(k-siz[B[i]]-1)%mod+mod-1ll*siz[B[i]]*(k-siz[B[i]])%mod)%mod*inv2%mod,ans%=mod;
		ans+=p[B[i]]*(mod+1-p[A[i]])%mod*(1ll*(siz[B[i]]-1)*(k-siz[B[i]]+1)%mod+mod-1ll*siz[B[i]]*(k-siz[B[i]])%mod)%mod*inv2%mod,ans%=mod;
		p[A[i]]=p[B[i]]=(p[A[i]]+p[B[i]])*inv2%mod;
	}
	printf("%lld\n",ans*ksm(1ll*k*(k-1)%mod*inv2%mod,mod-2)%mod);
	return 0;
}

标签:10,fa,int,siz,ll,Tree,蝴蝶,Koxia,CF1770E
From: https://www.cnblogs.com/the-blog-of-doctorZ/p/18263737

相关文章

  • ABC359 G - Sum of Tree Distance
    题目链接题目大意给出一棵树,树上每个节点都有一种颜色,求所有颜色相同的节点两两之间距离的总和。 题解想来写题解主要是看了一下官方解法都写的需要“重心分解”,应该是对应中文语境下的树的点分治。实际上点分治写起来很费事,可以用启发式合并替代。具体来说,dfs时每个节点......
  • abc359_G Sum of Tree Distance 题解
    题目链接:Atcoder或者洛谷先考虑暴力,显然是枚举整棵树的路径,这个枚举复杂度显示是\(O(n^2)\),还不考虑计算\(f(i,j)\),考虑使用点分治优化枚举复杂度:\(O(n\log{n})\)。接下来考虑如何计算每条路径的\(f(i,j)\),注意到\(f(i,j)\):当且仅当\(a[i]=a[j]\)时,答案加上\(dis(i,j......
  • Qt QTreeView 常见节点操作
    QTreeView作为项目最经常使用的空间,常用接口和操作必须熟悉熟悉在熟悉!!!1、节点遍历1voidParamSettingDlg::GetNode()2{3for(inti=0;i<model->rowCount();i++)4{5QStandardItem*item=model->item(i);67qDebug()<<"item......
  • sourceTree 重置当前分支到此次提交
    撤回合并的分支(分支dev合并到分支0415,并且已经推送到远程分支了) 高风险操作:选择强行合并,此时本地仓库的改动已经删掉了!!!所以本地仓库和远端推送之前的版本应该是一样的。只需要强制推送当前本地仓库到远程即可选择强行合并之后看到下图所示 不需要拉取,直接点击推送 注意......
  • 自动化之python读取目录结构转换为element-plus tree结构
    defget_project_tree(start_path:str,original_path:str,tree_data:list):child_files=os.listdir(start_path)forchild_fileinchild_files:ifchild_filein['.gitignore','.idea','venv','__pycache__......
  • 【漏洞情报】泛微 E-Cology KtreeUploadAction 文件上传漏洞
    声明:请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。如有侵权烦请告知,我们会立即删除并致歉。谢谢!01漏洞描述泛微OAE-CologyKtreeUploadAction存在文件上传漏洞......
  • 双列集合 HashMap以及TreeMap底层原理
    双列集合 特点:    双列集合一次需要存一对数据,分别为键和值    键不能重复,值可以重复    键和值是一一对应的,每个键只能找到自己对应的值        键和值这个整体在Java中叫做“Entry对象”Map的常见API    Map是双列集合的顶......
  • ABC 321 E Complete Binary Tree
    题意有T次询问,每次询问给出三个参数N,X,K,分别表示,有N个节点的二叉树,询问从X号节点出发走K条边能走到多少个不同的点。思路对于一颗二叉树上的点,我们可以分两种情况,一种是向上走,一种是向下走。对于向下走,我们只需要不停的、分别的遍历当前节点的右儿子(对于二叉树就是序号乘2),直到......
  • java+vue3+el-tree实现树形结构操作
    基于springboot+vue3elementPlus实现树形结构数据的添加、删除和页面展示效果如下代码如下,业务部分可以自行修改java后台代码importcom.baomidou.mybatisplus.core.conditions.query.QueryWrapper;importcom.daztk.mes.common.annotation.LogOperation;import......
  • el-tree设置每个节点的连接线 修改展开图标为加减号(附效果图)
    ::v-deep.treeCont{.el-tree>.el-tree-node:nth-of-type(1){border-top:none!important;color:red;}.el-tree>.el-tree-node:after{border-top:none;}.el-tree:first-child{border-top:none!important;}......