Solution -「USACO 2020.12 P」Spaceship
\(\mathcal{Description}\)
Link.
Bessie 在一张含 \(n\) 个结点的有向图上遍历,站在某个结点上时,她必须按下自己手中 \(m\) 个按钮中处于激活状态的一个才能走向其他结点或终止遍历(不能原地等待)。初始时,所有按钮都处于激活状态,按下 \(i\) 号按钮时,\(i\) 号按钮变为非激活状态,所有编号 \(<i\) 的按钮被激活。
给定 \(q\) 组形如 \((b_s,s,b_t,t)\) 的询问,求 Bessie 从 \(s\) 出发,第一步按 \(b_s\) 按钮,到 \(t\) 终止遍历,且最后一步按 \(b_t\) 按钮的遍历方案数(遍历顺序或按键不同,方案则不同)。
\(n,k,q\le60\)。
\(\mathcal{Solution}\)
大概是图上的高维大力 DP 题叭。
初步理解按键规则:若把 \(m\) 个按键视为一个二进制数,那么在行动过程中这一数的数值是单增的——因为若按键最高非激活位被重新激活,则一定被更高位激活。
进一步,我们尝试以“非激活按键的最高位”为切入点设计 DP 状态。令 \(f(h,i,j)\) 表示从 \(i\) 出发(不钦定第一步)走到 \(j\)(不钦定最后一步),且非激活按键最高位不超过 \(h\) 的方案数。转移:
当前方案根本没有取到过 \(h\),\(f(h,i,j)\longleftarrow f(h-1,i,j)\)。
否则,枚举取到 \(h\) 的唯一一点 \(k\),显然有
\[f(h,i,j)\longleftarrow\sum_{(u,k),(k,v)\in E}f(h-1,i,u)f(h-1,v,j)
\]注意到 \(h\) 和 \(k\) 正在枚举,视为常数,乘法中的两个状态分别只和 \(i\) 与 \(j\) 有关,所以只需要定义辅助状态
\[g(i)=\sum_{(u,k)\in E}f(h-1,i,u)\\
h(j)=\sum_{(k,v)\in E}f(h-1,v,j)
\]则有 \(f(h,i,j)\longleftarrow g(i)h(j)\)。
最后一个问题,求出这个 \(f\) 有什么用呢?
\(f\) 的定义与询问的差别仅有是否限制第一步和最后一步,所以可以直接把 \(q\) 个限制当做虚拟点丢到状态里,让 \(f\) 成为 \(m\times(n+q)\times(n+q)\) 的状态,\(f(h,i,j)\) 的含义变为:
- \(i,j\le n\):含义不变;
- \(i\le n\),\(j>n\):从 \(i\) 出发(不钦定第一步),走到第 \(j-n\) 个询问的 \(t\) 且最后一步为 \(b_t\) 的方案数;
- \(i>n\),\(j\le n\):从第 \(i-1\) 个询问的 \(s\) 出发,且第一步为 \(b_s\),走到 \(j\)(不钦定最后一步)的方案数;
- \(i>n\),\(j>n\):同理。
可见,第 \(i\) 个询问的答案即为 \(f(m,n+i,n+i)\)。转移过程需要变化的地方仅是当枚举的 \((h,k)\) 恰好为某个询问的某个端点时才给 \(g\) 或 \(h\) 添加方案。
综上,复杂度 \(\mathcal O(mn(n+q)^2)\),代码极度舒适。
\(\mathcal{Code}\)
/* Clearink */
#include <cstdio>
#define rep( i, l, r ) for ( int i = l, rpbound##i = r; i <= rpbound##i; ++i )
#define per( i, r, l ) for ( int i = r, rpbound##i = l; i >= rpbound##i; --i )
const int MAXN = 60, MOD = 1e9 + 7;
int n, m, q, f[MAXN + 5][MAXN * 2 + 5][MAXN * 2 + 5];
int lef[MAXN * 2 + 5], rig[MAXN * 2 + 5];
char adj[MAXN + 5][MAXN + 5];
struct Query { int bs, s, bt, t; } qry[MAXN + 5];
inline int mul( const long long a, const int b ) { return a * b % MOD; }
inline int add( int a, const int b ) { return ( a += b ) < MOD ? a : a - MOD; }
inline void addeq( int& a, const int b ) { ( a += b ) >= MOD && ( a -= MOD ); }
int main() {
scanf( "%d %d %d", &n, &m, &q );
rep ( i, 1, n ) {
scanf( "%s", adj[i] + 1 );
rep ( j, 1, n ) adj[i][j] ^= '0';
}
rep ( i, 1, q ) {
scanf( "%d %d %d %d", &qry[i].bs, &qry[i].s, &qry[i].bt, &qry[i].t );
}
rep ( h, 1, m ) {
int ( *fcur )[MAXN * 2 + 5]( f[h] );
int ( *flas )[MAXN * 2 + 5]( f[h - 1] );
rep ( i, 1, n + q ) rep ( j, 1, n + q ) fcur[i][j] = flas[i][j];
rep ( k, 1, n ) {
rep ( i, 1, n ) lef[i] = rig[i] = 0;
lef[k] = rig[k] = 1;
rep ( i, 1, q ) {
lef[n + i] = qry[i].bs == h && qry[i].s == k;
rig[n + i] = qry[i].bt == h && qry[i].t == k;
}
rep ( i, 1, n + q ) rep ( j, 1, n ) if ( adj[j][k] ) {
addeq( lef[i], flas[i][j] );
}
rep ( i, 1, n ) rep ( j, 1, n + q ) if ( adj[k][i] ) {
addeq( rig[j], flas[i][j] );
}
rep ( i, 1, n + q ) rep ( j, 1, n + q ) {
addeq( fcur[i][j], mul( lef[i], rig[j] ) );
}
}
}
rep ( i, 1, q ) printf( "%d\n", f[m][n + i][n + i] );
return 0;
}
Solution -「USACO 2020.12 P」Spaceship的更多相关文章
- Solution -「USACO 2020.12 P」Sleeping Cows
\(\mathcal{Description}\) Link. 有 \(n\) 个牛棚,大小为 \(t_{1..n}\),\(n\) 头奶牛,大小为 \(s_{1..n}\),奶牛只能住进不小 ...
- Solution -「SV 2020 Round I」SA
\(\mathcal{Description}\) 求出处 owo. 给定一个长度为 \(n\),仅包含小写字母的字符串 \(s\),问是否存在长度为 \(n\),仅包含小写字母的字符串 \( ...
- Solution -「SV 2020 Round I」「SRM 551 DIV1」「TC 12141」SweetFruits
\(\mathcal{Description}\) link. 给定 \(n\) 个水果,每个结点可能有甜度 \(v_i\),或不甜(\(v_i=-1\)).现在把这些水果串成一棵无根树.称一 ...
- [LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞
[LOJ#6259]「CodePlus 2017 12 月赛」白金元首与独舞 试题描述 到河北省 见斯大林 / 在月光下 你的背影 / 让我们一起跳舞吧 うそだよ~ 河北省怎么可能有 Stalin. ...
- Solution -「2020.12.26」 模拟赛
0x00 前言 一些吐槽. 考得很变态诶,看每道题平均两秒的时限就知道了... T1 降智了想到后缀懒得打. T2 口胡了假优化,结果和暴力分一样?? T3 黑题还绑点?? \(50 + 80 + 0 ...
- Solution -「ZJOI 2020」「洛谷 P6631」序列
\(\mathcal{Description}\) Link. 给定一个长为 \(n\) 的非负整数序列 \(\lang a_n\rang\),你可以进行如下操作: 取 \([l,r]\),将 ...
- Solution -「JOISC 2020」「UOJ #509」迷路的猫
\(\mathcal{Decription}\) Link. 这是一道通信题. 给定一个 \(n\) 个点 \(m\) 条边的连通无向图与两个限制 \(A,B\). 程序 Anthon ...
- Solution -「NOI 2020」「洛谷 P6776」超现实树
\(\mathcal{Description}\) Link. 对于非空二叉树 \(T\),定义 \(\operatorname{grow}(T)\) 为所有能通过若干次"替换 \( ...
- Solution -「FJWC 2020」人生
\(\mathcal{Description}\) OurOJ. 有 \(n\) 个结点,一些结点有染有黑色或白色,其余待染色.将 \(n\) 个结点染上颜色并连接有向边,求有多少个不同(结点 ...
随机推荐
- 阿里云服务器 配置 tomcat 发布spring boot项目 的具体操作 【使用公网ip】
1.前言 spring boot 转成war包 后用tomcat发布的具体操作在我另一篇随笔有详细记载,不论是window系统还是Linux系统,tomcat的发布配置都是一样的,所以这里不具体讲这个 ...
- react中使用antd按需加载(第一部)
什么是react按需加载?简单来说就是当我们引用antd的时候需要引入全局css样式,这会对性能造成一定的影响,那么使用按需加载以后就不需要引入css全局样式了,直接引入功能模块即可,既然需要设置按需 ...
- CentOS6.5安装Hive-1.2.2
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6627669615377908231/ Hadoop环境已安装完成<CentOS6.5下安装Hadoop-2. ...
- 函数实现将 DataFrame 数据直接划分为测试集训练集
虽然 Scikit-Learn 有可以划分数据集的函数 train_test_split ,但在有些特殊情况我们只希望它将 DataFrame 数据直接划分为 train, test 而不是像 tr ...
- eclipse中配置Webdriver
安装JDK,配置好Java环境 下载Eclipse,并完成安装 下载Webdriver的JAR文件(访问Selenium官网,下载Java版的zip文件,并且解压到本地磁盘,解压后文件夹内容如下图:) ...
- 服务器表单字符串转化Vue表单挂在到对应DOM节点
今天在项目开发中,遇到从后端返回的vue文件(包含template,js,css)的文件,试过用v-html解析文件,渲染到页面,但是无法渲染,后来去查了一堆资料,自己写了一个全局方法来解析这类文件 ...
- Java构造器(构造方法)
类中的构造器也成为构造方法,是在进行创建对象的时候必须调用的,并且构造器有以下两个特点: 1.必须和类名字相同 2.必须没有返回类型也不能写void public class Demo06 { //一 ...
- 【刷题-LeetCode】228. Summary Ranges
Summary Ranges Given a sorted integer array without duplicates, return the summary of its ranges. Ex ...
- virtual stuido同时调试多个控制台
问题 UDP作业需要服务器端和客户端收发信息完成交互,需要同时调试多个窗口. 解决办法 但是缺点依然是无法调试2个,修改另一个测试. 所以多开可能依然是好办法.
- 面试突击17:HashMap除了死循环还有什么问题?
面试合集:https://gitee.com/mydb/interview 本篇的这个问题是一个开放性问题,HashMap 除了死循环之外,还有其他什么问题?总体来说 HashMap 的所有" ...