首页 > 其他分享 >12 月做题笔记

12 月做题笔记

时间:2022-12-22 23:22:51浏览次数:59  
标签:12 int 笔记 a3 a2 做题 1005 mod define

前言

开博客记录做题笔记的 flag 我立过 \(n\) 遍了,无一例外都倒了。

这次一定要坚持下来,一周至少一题不能咕,养成好习惯。

【LOJ3124】氪金手游

容易发现给定的 \((u_i,v_i)\) 是一棵树,先考虑简化问题:树是以 \(1\) 为根的外向树(每条边都从靠近 \(1\) 的点连向远离 \(1\) 的点),且 \(w_i\) 确定。

令 \(f(i)\) 表示考虑满足以 \(i\) 为根的子树的条件的概率,容易得到转移式:\(f(i)=\dfrac{w_i}{\sum_{v \in sub(i)} w_v} \prod_{x \in son(i)} f(x)\),其中 \(sub(i)\) 表示 \(i\) 的子树内的点集合,\(son(i)\) 表示 \(i\) 的儿子集合。意义也很显然,\(i\) 要在子树内所有点之前被抽到,抽到之后所有子树均独立。

考虑某条边反向的情况,如果有一条边 \(v \rightarrow u\) 满足 \(u\) 是 \(v\) 的父亲,可以做如下转化:观察到某种抽卡顺序,要么是先抽到 \(u\) 再抽到 \(v\),要么是先抽到 \(v\) 再抽到 \(u\),即 \(P(u \rightarrow v)+P(v \rightarrow u)=P((u,v)之间没有边)\),我们也很容易写出 \((u,v)\) 之间没有边时的转移方程:\(f(u)=\dfrac{w_u}{\sum_{x \in \{sub(u)-v\}} w_x} \prod_{y \in son(u)} f(y)\),也就可以得到一条边反向时的情况。

然后考虑加上 \(w_i\) 概率的情况,我们只需要在状态中增加一维:\(f(i,j)\) 表示当 \(\sum_{u \in sub(i)}w_u=j\) 时,满足以 \(i\) 为根的子树中条件的概率。转移的时候类似树上背包的方法合并两棵子树,然后乘上对于 \(w_i\) 的限制即可,时间复杂度可以做到均摊的 \(O(n^2)\)。

Code
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
#define pii pair<long long,long long>
#define mp make_pair
#define pb push_back
const int mod=998244353;
const int inf=0x3f3f3f3f;
const int INF=1e18;
int fpow(int x,int b){
	if(x==0) return 0;
	if(b==0) return 1;
	int res=1;
	while(b>0){
		if(b&1)	res=res*x%mod;
		x=x*x%mod;
		b>>=1;
	}
	return res;
}
int n;
map <pii,bool> dir;
int P[1005][4];
vector <int> g[1005];
int dp[1005][3005],sz[1005],f[1005][3005];
void dfs(int u,int fa)
{
	sz[u]=1;
	vector <int> ss;
	ss.clear();
	ss.pb(-1);
	for(int i=0;i<g[u].size();i++)
	{
		int v=g[u][i];
		if(v==fa) continue;
		dfs(v,u),ss.pb(v),sz[u]+=sz[v];
	}
	f[0][0]=1;
	for(int i=1;i<=ss.size();i++) memset(f[i],0,sizeof(f[i]));
	for(int i=1;i<ss.size();i++)
	{
		int v=ss[i];
		if(dir[mp(u,v)])
		{
			for(int s1=0;s1<=3*n;s1++) if(f[i-1][s1]) for(int s2=0;s2<=3*sz[v];s2++) if(dp[v][s2])
				f[i][s1+s2]=(f[i][s1+s2]+f[i-1][s1]*dp[v][s2])%mod; 
		}
		else
		{
			int t=0;
			for(int s2=0;s2<=3*sz[v];s2++) t=(t+dp[v][s2])%mod;
			for(int s1=0;s1<=3*n;s1++) 
			{
				f[i][s1]=(f[i][s1]+f[i-1][s1]*t)%mod;
				if(f[i-1][s1]) for(int s2=0;s2<=3*sz[v];s2++) if(dp[v][s2])
					f[i][s1+s2]=(f[i][s1+s2]-f[i-1][s1]*dp[v][s2]%mod+mod)%mod; 
			}
		}
	} 
	int t=ss.size()-1;
	for(int i=0;i<=3*n;i++) for(int w=1;w<4;w++)
		dp[u][i+w]=(dp[u][i+w]+f[t][i]*P[u][w]%mod*w%mod*fpow(i+w,mod-2))%mod;
//	cout<<u<<" "<<t<<endl;
//	for(int i=1;i<=3*n;i++) cout<<dp[u][i]<<" ";
//	puts("");
}
void solve()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		int a1,a2,a3;
		cin>>a1>>a2>>a3;
		P[i][1]=a1*fpow(a1+a2+a3,mod-2)%mod;
		P[i][2]=a2*fpow(a1+a2+a3,mod-2)%mod;
		P[i][3]=a3*fpow(a1+a2+a3,mod-2)%mod;
	//	cout<<P[i][1]<<" "<<P[i][2]<<" "<<P[i][3]<<endl; 
	}
	for(int i=1;i<n;i++)
	{
		int u,v;
		cin>>u>>v;
		g[u].pb(v),g[v].pb(u);
		dir[mp(u,v)]=1;
	}
	dfs(1,-1);
	int ans=0;
	for(int i=1;i<=3*n;i++) ans=(ans+dp[1][i])%mod;
	cout<<ans; 
}
signed main()
{
	int _=1;
	//cin>>_;
	while(_--) solve();
	return 0;
}

标签:12,int,笔记,a3,a2,做题,1005,mod,define
From: https://www.cnblogs.com/znstz2018/p/16999800.html

相关文章

  • 寄语自己-2012
    2012年新年即到,谨写此文自勉:睡早点,多休息,不透支体能;少喝点,多喝水,不藐视养生;吃好点,多运动,不远离健康。豁达点,多宽容,不自寻烦恼;坚强点,多微笑,不牵手脆弱;踏实点,多务实,......
  • PyTorch复现ResNet学习笔记
    PyTorch复现ResNet学习笔记一篇简单的学习笔记,实现五类花分类,这里只介绍复现的一些细节如果想了解更多有关网络的细节,请去看论文《DeepResidualLearningforImageRec......
  • Python学习笔记--异常+模块+包
    异常的捕获基本语法:示例:捕获指定异常基本语法:--必写示例:捕获多个异常示例:捕获所有异常示例:异常else--可写可不写示例:异常finally(无论是否出现异常......
  • 不止Oracle 读书笔记
    Oracle由实例和数据库组成,上半部的直角方框为实例instance,下半部的圆角方框为数据库Database。实例是由一个共享内存区SGA(SystemGlobalArea)和一系列后台进程组成的,其中......
  • Kotlin学习快速入门(12)—— 位运算符
    由于不懂pythod,最近拜托朋友研究下解密live2d模型的解密算法,朋友写出了Java的代码之后我进行改版,在转为kotlin的时候,发现kotlin自动转换有些坑,以及kotlin中的位运算......
  • QNX常用指令笔记
    一SOC系统log抓取1-重命名标志文件mv/external_drive/force_marks/external_drive/force_marks1sync2-在U盘中创建SOC_LOG目录mkdir/external_drive/SOC_LOG3-获......
  • 线段树复习笔记——可持久化线段树(主席树)
    可持久化线段树——主席树引入(P3834【模板】可持久化线段树2-洛谷)看看题面:题目描述如题,给定\(n\)个整数构成的序列\(a\),将对于指定的闭区间\([l,r]\)查询其......
  • vue笔记
    Vue笔记前言使用Vue需要node.js环境,所以这里需要利用nvm安装node.js。node和npm相关的名词很多,比较容易混淆。下面对这些名词做个统一梳理node:一个基于ChromeV8......
  • FreeSWITCH学习笔记:Lua脚本
    本文更新于2022-06-03,使用FreeSWITCH1.10.7。目录argvfreeswitch.APIAPI:executefreeswitch.bridgefreeswitch.consoleLogfreeswitch.DbhDBH:affected_rowsDBH:connected......
  • 双面柔光 照亮你我tā vivo S16系列12月22日正式发布
    2022年12月22日,主题为“双面柔光照亮你我tā”的vivoS系列新品发布会于线上举行,vivoS16以及vivoS16Pro等三款新机正式发布。作为vivoS系列的最新一代产品,vivoS16系列......