期望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. RabbitMQ安装后无法访问https://localhost:15672/ 控制台问题解决

    1.安装完后 我们进入到我们安装到 sbin目录C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.2\sbin执行:rabbitmq-plugi ...

  2. Python距离放弃又近了Day02

    今天,来时大概复习了上一天讲过的一些计算机基础和简单数据类型和if语句,第二天就来了循环,还是个while的死循环,突然想到还是电脑好,不管循环多少次,只要电脑不崩溃,就能一直精准的算下去,这就和人不 ...

  3. CSAPP:第八章 异常控制流2

    CSAPP:第八章 异常控制流2 关键点:进程控制.信号 8.4 进程控制8.5 信号 8.4 进程控制   Unix提供了大量从C程序中操作进程的系统调用.8.4.1 获取进程ID  每个进程都有一 ...

  4. dotnetcore ueditor

    dotnetcore ueditor  https://github.com/durow/ueditornetcore http://www.cnblogs.com/durow/p/6116393.h ...

  5. TNS-12535/12606 and ORA-3136 on Connection to Database (Doc ID 2313573.1)

    今天遇到一问题 telnet 都是通的,但是两台数据库服务器还是无法 sqlplus 连接 ,最后发现 两台服务器的 mtu 值不同,其中一台为 1500 一台为9000, 以前只是认为 telnet ...

  6. leetcode 169. Majority Element 、229. Majority Element II

    169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...

  7. 云端安装MQTT服务器

    如果自己下载的3.1版本的MQTT, 安装步骤参考 https://developer.emqx.io/docs/emq/v3/cn/install.html 配置用户名和密码第一种是用http ht ...

  8. centos搭建ftp服务器

    申请个京东云服务用着.上传文件想搭建个ftp服务.遇到个坑记录一下: 这里就简单的使用yum安装 ftp服务: vsftpd  全称 very secure ftp deamon  (非常安全的ftp ...

  9. iOS开发基础-图片切换(2)之懒加载

    延续:iOS开发基础-图片切换(1),对(1)里面的代码进行改善. 在 ViewController 类中添加新的数组属性:  @property (nonatomic, strong) NSArra ...

  10. 记一次生产数据库"意外"重启的经历

    前言 在一个阳光明媚的下午,电脑右下角传来一片片邮件提醒,同时伴随着微信钉钉的震动,打开一看,应用各种出错,天兔告警,数据库服务器内存爆红,Mysql数据库实例挂掉了. 排查 先交代一下数据库版本: ...