首页 > 其他分享 >[ABC212E] Safety Journey 题解

[ABC212E] Safety Journey 题解

时间:2024-04-17 20:23:30浏览次数:23  
标签:int 题解 sum Journey Safety ABC212E

[ABC212E] Safety Journey 题解

思路解析

首先根据题目的条件我们可以想到 dp,用 \(f_{i,j}\) 表示走了 \(i\) 步,现在在 \(j\) 的方案数,可见转移即是 \(f_{i,u} \gets \sum{f_{i-1,v}}\),这里的 \(v\) 表示每个与 \(u\) 相连的点。可见如此做时间复杂度为 \(O(kn(\frac{n(n-1)}{2}-m))=O(k(\frac{n^3-n^2}{2}-nm)) \approx O(kn^3-knm)\),考虑优化。

可以发现如果我们像上文一样建边总边数可以达到 \(\frac{n(n-1)}{2}-m \approx n^2-m\),这个大小是很难被接受的,于是我们想到可以建反边,也就是只建被删除的那 \(m\) 条边,这样总边数就只有 \(m\) 条,可以接受,然后对于统计答案就只需要将转移式改成 \(f_{i,u} \gets \sum^{n}_{j=1}{f_{i-1,j}}-\sum{f_{i-1,v}}\) 即可,其中 \(\sum^{n}_{j=1}{f_{i-1,j}}\) 对于每个 \(u\) 都不会变,可以提前处理好。

注意计算 \(f_{i,u}\) 时要先减去 \(f_{i-1,u}\),同时勤取模。

时间复杂度:虽有三层循环,但第二层内遍历的是每一条边,而总共只有 \(m\) 条边,因此为 \(O(km)\),可以通过。

code

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5010, q = 998244353;
int n, m, k, f[N][N];
vector<int> g[N];
void mod(int &x) {
	x = (x % q + q) % q;
}
signed main() {
	cin >> n >> m >> k;
	for(int i = 1, u, v; i <= m; i++) {
		cin >> u >> v;
		g[u].push_back(v); g[v].push_back(u);
	}
	f[0][1] = 1;
	for(int i = 1; i <= k; i++) {
		int sum = 0;
		for(int j = 1; j <= n; j++) sum += f[i - 1][j], mod(sum);
		for(int j = 1; j <= n; j++) {
			f[i][j] = sum - f[i - 1][j]; mod(f[i][j]);
			for(auto it : g[j]) {
				f[i][j] -= f[i - 1][it]; mod(f[i][j]);
			}
		}
	}
	cout << f[k][1];
	return 0;
}

标签:int,题解,sum,Journey,Safety,ABC212E
From: https://www.cnblogs.com/2020luke/p/18141670

相关文章

  • ICPC2023南京站题解(A C D F G I L M)
    本场金牌线为7题前一半。做出8题可稳金牌,这里是难度前8题的题解。ICPC2023南京站I:签到题。#include<bits/stdc++.h>#definelllonglong#defineQWQcout<<"QwQ"<<endl;#defineFOR()llle=e[u].size();for(lli=0;i<le;i++)usingnamespacestd;constllN=501010;......
  • [ABC208D] Shortest Path Queries 2 题解
    [ABC208D]ShortestPathQueries2题解思路解析此题的本质其实就是Floyd。我们在进行Floyd时会有一个\(k\)充当中间点,可见这里的\(k\)就等于题目当中的\(k\),因为小于等于\(k\)的所有点都被当作过中间点转移过,而大于\(k\)的所有点都没有被当作过中间点转移过,于是直......
  • P3978 [TJOI2015] 概率论 题解
    题意:求一棵\(n\)个节点的有根二叉树的叶子节点的期望个数。设\(f_n\)表示\(n\)个点的二叉树个数,\(g_n\)表示\(n\)个点的所有二叉树的叶子节点数之和。显然\(f_n\)为\(\text{Catalan}\)数,考虑如何求\(g_n\)。一个结论是:\(g_n=f_{n-1}\timesn\)。证明:对于每一......
  • [题解][2021-2022年度国际大学生程序设计竞赛第10届陕西省程序设计竞赛] Cute Rabbit
    题目描述有n只兔子,每个兔子上有一个数ai。要将所有兔子分为白色和绿色两堆,使所有白色兔子的数对绿色兔子取余结果相等。求绿色兔子的最大数量。题解考虑一种情况:把所有除了最小值的数都涂为绿色,此时显然满足条件。对于一般情况:可以枚举白绿兔子的分割线x。对于小于x,试将其全......
  • 前端项目安装node-sass依赖问题解决
    前端项目安装依赖node-sass问题解决记录:(项目中node版本14.16.0node-sass版本4.14.1)问题1:pnpnrunall:install后报错MSBUILD:errorMSB3428:解决方法:需要安装npminstall--globalwindows-build-tools1.1、npm全局安装windows-build-tools1.1安装过程中可能会出现......
  • [题解] [CCPC陕西省赛2022 H题] Cute Rabbit
    [CCPC陕西省赛2022H题]CuteRabbit题目描述有\(n\)只白色的兔子,把其中\(m\)只染成绿色。每只兔子上有一个数\(a_i\),如果所有白色兔子上的数对所有绿色兔子上的数两两取余的值均相同,则该种染色方式合法,求能够使染色合法的最大的\(m\)。输入格式第一行有一个整数\(n(......
  • uoj32 跳蚤公路题解
    题目链接点击打开链接题目解法首先问题等价于有一个负环可以到\(v\)假设环边的\(w\)之和为\(b\),\(c\)之和为\(k\),则这个环的长度就为\(kx+b\)如果是负环,需要满足\(kx+b<0\)钦定负环上的一个点\(st\),令\(f_{i,j}\)表示从\(st\)到\(i\)的路径中,\(\sumc=j\)的......
  • 【问题解决】Fatal error "unsafe repository ('git目录名' is owned by someone else
    问题复现近期升级了Gitv2.37.0,发现在gitbash进入git目录执行git命令时出现错误:Fatalerror"unsaferepository('git目录名'isownedbysomeoneelse)",无法使用git做一些操作。问题解决两个方法:降级到v2.35.2之前,或者,gitconfig--global--addsafe.directory仓库目录......
  • 再次进入虚拟机找不到共享文件夹的内容了---问题解决
    问题描述在重新开启虚拟机之后,发现原来的路径上没有上次共享文件夹的内容了,查看虚拟机设置,发现共享文件夹还在启用,也不是这里的问题;问题解决因为我们是用链接的方式实现的本地和虚拟机文件共享,所以,每次重新进入虚拟机时,就需要重新链接一下,用下面这行代码就能够再次看到共享文件......
  • 2024/4/15考试题解
    目录成绩报告A.排座位题目内容思路代码B.梦中的学校题目内容思路代码C.激突冲击题目内容思路代码D.奖学金题目内容思路代码成绩报告T1说是快排,其实跟快排没有任何关系,就是单纯考了个语法。T2不会推式子,但是输出1有20分。T3不会差分约束(打拓扑排序导致的),同理输出-1得18分。T4fre......