期望DP要倒着推

Luogu P4321


题意

LOJ #2542

不一定是树,询问点不一定均为1


$Solution$

设计一个巧妙的DP状态

设$ F(S,x)$表示当前在点$ x$已经走遍了$ S$,走完剩下所有点的期望步数

这样推转移$ DP$的时候一定是从$ F(S|y,y)$转移过来

容易发现$ S|y$->$S$是不可能会变大的,即这维不可能成环

因此从大到小枚举$ S$,对当前$ S$,显然比$ S$大的状态已经被计算,暴力$ n^3$高斯消元消出这维就好了

时间复杂度$ O(2·n·n^3)$

为什么不直接$ Min-Max$容斥呢

随机游走

每次枚举$ S$消出当前$ Min(S,x)$中的x这维

复杂度不变

而且很好写啊...


$ my \ code$

#include<ctime>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#define p 998244353
#define rt register int
#define ll long long
using namespace std;
inline ll read(){
ll x=;char zf=;char ch=getchar();
while(ch!='-'&&!isdigit(ch))ch=getchar();
if(ch=='-')zf=-,ch=getchar();
while(isdigit(ch))x=x*+ch-'',ch=getchar();return x*zf;
}
void write(ll y){if(y<)putchar('-'),y=-y;if(y>)write(y/);putchar(y%+);}
void writeln(const ll y){write(y);putchar('\n');}
int k,m,n,x,y,z,cnt,S;
bool link[][];int a[][],d[];
int inv[],ans[][<<];
int ksm(int x,int y=p-){
int ans=;
for(rt i=y;i;i>>=,x=1ll*x*x%p)if(i&)ans=1ll*ans*x%p;
return ans;
}
void gauss(){
for(rt i=;i<=n;i++)if(!(S>>i-&)){
for(rt j=i;j<=n;j++)if(a[j][i]){
if(j!=i)for(rt k=;k<=n+;k++)swap(a[i][k],a[j][k]);
break;
}
if(!a[i][i])continue;
inv[i]=ksm(a[i][i]);
for(rt j=i+;j<=n;j++)if(a[j][i]){
const int x=1ll*a[j][i]*inv[i]%p;
for(rt k=i;k<=n+;k++)if(a[i][k])(a[j][k]-=1ll*a[i][k]*x%p)%=p;
}
}
for(rt i=n;i>=;i--)if(!(S>>i-&)){
ans[i][S]=1ll*a[i][n+]*inv[i]%p;
for(rt j=i-;j>=;j--)if(a[j][i])(a[j][n+]-=1ll*ans[i][S]*a[j][i]%p)%=p;
}
}
int ret[][<<];
int main(){
n=read();m=read();
for(rt i=;i<=m;i++){
x=read();y=read();d[x]++;d[y]++;
link[x][y]=link[y][x]=;
}
//Max(S)走遍集合S的时间
//Min(S)第一次走到S的时间
for(S=;S<(<<n);S++){
memset(a,,sizeof(a));
for(rt i=;i<=n;i++){
if(S>>i-&)a[i][i]=;
else {
for(rt j=;j<=n;j++)if(link[i][j]&&!(S>>j-&))a[i][j]=-;
a[i][i]=d[i];a[i][n+]+=d[i];
}
}
gauss();
}
//Max(S)=sigma Min(T) (-1)|T|+1
for(rt i=;i<=n;i++){
for(rt j=;j<(<<n);j++)if(!(__builtin_popcount(j)&))ans[i][j]*=-;
for(rt j=;j<n;j++)
for(rt k=;k<(<<n);k++)if(k>>j&)(ans[i][k]+=ans[i][k^(<<j)])%=p;
}
for(rt T=read();T;T--){
n=read();S=;
for(rt i=;i<=n;i++)S|=(<<read()-);
x=read();writeln((ans[x][S]+p)%p);
}
return ;
}

Luogu P4321 随机漫游的更多相关文章

  1. luogu P4321 随机漫游 期望dp 二进制 高斯消元

    LINK:随机漫游 非常妙的一道题. 容易想到倒推期望. 设状态 f[i][j]表示到达第i个点 此时已经到达的集合为j能走到全集的期望边数. 只要求出来这个就能O(1)回答询问. \(f[i][j] ...

  2. 洛谷 P4321 【随机漫游】

    题目大意 给出\(n(n\leq 18)\)个点的无向连通图,\(m(m\leq 10^5)\)次询问.每次询问给出一个点集和一个起点\(s\),询问从\(s\)出发,经过这个点集中的每一个点至少一次 ...

  3. BZOJ 1180 [CROATIAN 2009]OTOCI // BZOJ 2843 极地旅行社 // Luogu P4321 [COCI 2009] OTOCI / 极地旅行社 (LCA板题)

    emmm-标题卡着长度上限- LCT板题-(ε=ε=ε=┏(゜ロ゜;)┛) CODE #include <cctype> #include <cmath> #include & ...

  4. 快速构建Windows 8风格应用27-漫游应用数据

    原文:快速构建Windows 8风格应用27-漫游应用数据 本篇博文主要介绍漫游应用数据概览.如何构建漫游应用数据.构建漫游应用数据最佳实践. 一.漫游应用数据概览 1.若应用当中使用了漫游应用数据, ...

  5. UWP开发:应用文件存储

    应用设置由于数据量和数据类型的限制,有很大的局限性,所以还需要应用文件存储,以文件的方式存储数据.在每个应用的应用数据存储中,该应用拥有系统定义的根目录:一个用于本地文件,一个用于漫游文件,还有一个用 ...

  6. Python编程:从入门到实践 - matplotlib篇 - Random Flow

    随机漫游 # random_flow.py 随机漫游 import random class RandomFlow(): """一个生成随机漫游数据的类"&qu ...

  7. UE4蓝图AI角色制作(三)

    接上一节 6. 寻路网格体代理 通过允许配置多个"代理",虚幻引擎使得用户能够轻松为大小各异的AI创建寻路网格体.首先,选中世界大纲视图中的"RecastNavMesh& ...

  8. UE4蓝图AI角色制作(六)之行为树

    13.行为树原理 AI最重要的环节就是行为树.我们将解释什么是行为树.为何它如此重要,以及构建行为树需要哪些元素. 借助行为树,我们可以轻松控制并显示AI的决策制定过程.行为树是一种将AI在场景中的决 ...

  9. UE4蓝图AI角色制作(七)之追逐玩家

    15.追逐玩家 现在我们的AI无法做出任何决策,它总是执行相同的决策.我们先把感知系统中的相关信息提供给AI,让AI知道如何做出决策,然后我们会修改行为树.我们首先需要创建新的黑板键,这样我们就能在行 ...

随机推荐

  1. idea怎么配置spring

    前提基础: 1.idea软件并JDK成功能用 2.有tacate,并会导入. 3.了解jsp和mvc基本结构 详细介绍: https://www.cnblogs.com/wormday/p/84356 ...

  2. jenkins之Job建立-运行 git 脚本

    新建一个自由风格的项目,运行git脚本 1.点击菜单栏中的“新任务” 2.进入该页面后输入一个项目名称,然后选择“构建一个自由风格的软件项目”,滑动到最底端,点击ok(在左下角) 3.进入下图页面后 ...

  3. C#深度学习の接口传参(interface)-----接口的妙用

    一.接口可以干嘛 我们知道,接口的本质是一个约束规范,委托是方法纵向(形式上)的封装,接口是不同方法横向(广度)的封装 接口中不能有变量,但是可以有属性方法.常见的,我们可以用接口: 1.实现需求方的 ...

  4. Mac下的效率工具autojump

    (转) IDE 用起来总是得不到满足,Mac 适合搞开发,我也十分喜欢 Mac 系统,当然可以说喜欢 Unix/Linux 系统.今天在 .zshrc 文件中添加了这么几行快捷命令: alias go ...

  5. 基于SpringMVC拦截器和注解实现controller中访问权限控制

    SpringMVC的拦截器HandlerInterceptorAdapter对应提供了三个preHandle,postHandle,afterCompletion方法. preHandle在业务处理器 ...

  6. 极光推送JAVA代码示例

    一. 准备工作 1. 登录极光推送官网https://www.jpush.cn/,注册账号并登录 2. 创建应用 创建应用过程,详见百度经验:http://jingyan.baidu.com/arti ...

  7. 第三章· Redis消息队列

    一.生产消费模型 二.Redis发布消息的两种模式

  8. Shell命令-文件及目录操作之mkdir、mv

    文件及目录操作 - mkdir.mv 1.mkdir:创建目录 mkdir命令的功能说明 mkdir命令用于创建目录,默认情况下,要创建的目录已存在,会提示文件存在,不会继续创建目录. mkdir命令 ...

  9. 使用lombok自动生成链式调用

    本文转载:使用 Lombok 自动生成 Getter and Setter

  10. LODOP设置打印设计返回JS代码是变量

    前面有一篇博文是介绍JS模版的加载和赋值,赋值有两种,详细可查看本博客的那篇博文:LodopJS代码模版的加载和赋值简单来说,就是打印项的值是变量,在添加打印项前进行赋值:打印项的值是字符串,给打印项 ...