P7740-[NOI2021]机器人游戏【dp,bitset】

正题

题目链接:https://www.luogu.com.cn/problem/P7740


题目描述

题目大意摸了

小 R 有 mmm1≤m≤10001 \le m \le 10001m1000)个机器人和 mmm 张纸带,第 iii1≤i≤m1 \le i \le m1im)个机器人负责对第 iii 张纸带进行操作。对于每张纸带,它们都被从左到右分成了 nnn1≤n≤321 \le n \le 321n32)个格子,依次编号为 0,1,…,n−10, 1, \ldots , n - 10,1,,n1。每个格子有 333 种状态:1. 格子上写有数字 000;2. 格子上写有数字 111;3. 格子是一个空格子。

在任意时刻,机器人必须站在纸带上的一个格子中。在设定好机器人在纸带上的初始位置后,第 iii 个机器人会依次执行预先设定的操作序列 SiS_iSi,操作由 R01* 四种字符组成,其中:

  1. R 表示机器人向右走一格,如果右边没有格子,则机器人会原地爆炸;
  2. 0 表示如果机器人所在格子非空,则将该格子上的数字改为 000,否则不修改;
  3. 1 表示如果机器人所在格子非空,则将该格子上的数字改为 111,否则不修改;
  4. * 表示如果机器人所在格子非空,则将格子上的数字 xxx 改为 1−x1 - x1x,否则不修改。

iii 张纸带的状态可以用一个长度为 nnn 的序列表示,每个元素为 01-(空格子),依次表示其每个格子的状态。第 iii 张纸带的初始状态称为机器人 iii 的输入 XiX_iXi,操作执行完成后纸带的状态称为机器人 iii 的输出 YiY_iYi。注意,如果机器人爆炸了,那么这个机器人就没有输出。

可以发现,如果一个格子为空,那么机器人永远不会修改它。所以每个机器人都有如下特性:如果第 iii 个机器人所在的纸带上的所有格子都为空,那么它就不会执行任何操作,它的输出即为所有格子都为空。

现在小 R 给定了每一个机器人的输入 XiX_iXi(即每张纸带的初始状态)以及目标输出 YiY_iYi。小 R 希望小 D 找到一个位置 ppp0≤p<n0 \le p < n0p<n),使得所有机器人都能以其所在纸带的第 ppp 个格子为初始位置,在不爆炸的情况下执行完所有操作,并且满足第 iii 个机器人的输出为 YiY_iYi

小 D 花了几毫秒解决了问题,现在他想知道,有多少个输入和输出的组合方式使得上述问题有解,即有多少种为每个机器人设定输入 X0,X1,…,Xm−1X_0, X_1, \ldots , X_{m - 1}X0,X1,,Xm1 和目标输出 Y0,Y1,…,Ym−1Y_0, Y_1, \ldots , Y_{m - 1}Y0,Y1,,Ym1 的方式,使得至少存在一个位置 ppp0≤p<n0 \le p < n0p<n),使得所有机器人都能以其所在纸带的第 ppp 个格子为起点,在不爆炸的情况下执行完所有操作,且满足第 iii 个机器人的输出为 YiY_iYi。请你帮助小 D 解决这个问题,由于最终的答案可能很大,请你输出答案对 109+7{10}^9 + 7109+7 取模后的余数。

两个组合方式不同当且仅当,存在至少一个机器人,它的输入或是目标输出在两个方式中不同。

对于所有测试点:1≤n≤321 \le n \le 321n321≤m≤10001 \le m \le 10001m10001≤∣Si∣≤1001 \le \lvert S_i \rvert \le 1001Si100

测试点编号n≤n \lenm≤m \lem特殊限制
1∼21 \sim 212111111
333888111
444161616111
5∼65 \sim 656323232111
777161616555
8∼108 \sim 10810323232555
11∼1211 \sim 121112161616100010001000
13∼1513 \sim 151315323232100010001000A
16∼2116 \sim 211621323232100010001000B
22∼2522 \sim 252225323232100010001000

特殊限制 A:操作序列中不存在 R

特殊限制 B:每个操作序列中,R 的数量至多 151515 个。


解题思路

先考虑nnn比较小的情况。对于每个机器人,我们可以把它的操作表示成相对于起点位置的4种状态:必定为0/10/10/1,与之前相同/不同。

然后至少有一个合法的xxx的限制我们可以考虑容斥,钦定一些合法的位置,那么对于纸带的一个位置来说它的限制最多只有四种,我们对于不同的情况这个位置不同的起始状态对应同样数量的中止状态。

但是我们暴力枚举合法位置的复杂度是O(2n)O(2^n)O(2n)的,考虑能不能优化。

因为这个n=32n=32n=32,看上去就很像折半,所以我们考虑一下怎么折半。

我们会发现因为最大位置不能超出纸条,所以设一个机器人最远的操作位置是lenlenlen,那么对于这个机器人来说合法的xxx就不能超过n−lenn-lennlen。而如果lenlenlen比较小,那么一个位置能影响到后面的位置就不多,我们可以设fi,Sf_{i,S}fi,S表示目前做到iii,对于后面的限制目前是SSS时前面已经确定了限制的位置的答案。

然后所有的机器人同时做就可以了。

然后再处理限制的时候用bitsetbitsetbitset优化一下就行了。

时间复杂度:O(2nnmω)O(\frac{2^nnm}{\omega})O(ω2nnm)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<bitset>
#define ll long long
using namespace std;
const ll N=34,M=1100,P=1e9+7;
ll n,m,pw2[M],pw3[M],v[M][N],c[M];
ll ans,num,f[N][1<<17][2];
vector<ll> q[N];char s[N*3];
bitset<M> all,v1,v2,u_[N],u[4][N],F[1<<17][4];
signed main()
{scanf("%lld%lld",&n,&m);pw2[0]=pw3[0]=1;for(ll i=1;i<=m;i++)pw2[i]=pw2[i-1]*2ll%P,pw3[i]=pw3[i-1]*3ll%P;for(ll i=0;i<m;i++){scanf("%s",s+1);ll len=strlen(s+1),cr=0;for(ll j=1;j<=len;j++){if(s[j]=='R')v[i][c[i]]=cr,cr=0,c[i]++;else if(s[j]=='0')cr=2;else if(s[j]=='1')cr=3;else if(s[j]=='*')cr^=1;}v[i][c[i]]=cr;q[c[i]].push_back(i);all.set(i);}ans=1;for(ll i=1;i<=n*m;i++)ans=ans*3ll%P;for(ll r=n;r>=0;r--){for(ll i=0;i<q[n-r].size();i++){for(ll j=0;j<n+2;j++)u[v[q[n-r][i]][j]][j].set(q[n-r][i]);for(ll j=c[q[n-r][i]]+1;j<n+2;j++)u_[j].set(q[n-r][i]);}f[0][0][0]=1;num+=q[n-r].size();for(ll i=1;i<=r;i++){ll MS=(1<<min(i,n-r+1)),MT=(1<<min(i-1,n-r+1));for(ll s=0;s<MS;s++)f[i][s][0]=f[i][s][1]=0;for(ll z=0;z<2;z++)for(ll s=0;s<MT;s++){ll _z=z|(s*2>=MS);if(i<r)(f[i][(s<<1)&(MS-1)][_z]+=f[i-1][s][z])%=P;(f[i][(s<<1|1)&(MS-1)][_z]+=P-f[i-1][s][z])%=P;}for(ll z=0;z<2;z++){ll lr=z|(i<r);for(ll s=0;s<min(n-r+1,i);s++){for(ll j=lr;j<4;j++)F[1<<s][j]=u[j][s];if(!lr)F[1<<s][0]|=u_[s];}for(ll s=0;s<MS;s++){if(s!=(s&-s)){for(ll k=lr;k<4;k++)F[s][k]=F[s&-s][k]|F[s-(s&-s)][k];}if(lr){v1=F[s][1]|(F[s][2]&F[s][3]);v2=(F[s][2]|F[s][3])&(v1^all);}else{v1=(F[s][0]&F[s][1])|(F[s][2]&F[s][3]);v2=(F[s][0]|F[s][1])&(F[s][2]|F[s][3])&(v1^all);}ll X=v1.count(),Y=v2.count();(f[i][s][z]=f[i][s][z]*pw2[Y]%P*pw3[num-X-Y]%P)%=P;}}}ll lim=min(n-r+1,r),MS=1<<lim;for(ll z=0;z<2;z++)for(ll i=1;i<=n-r;i++){for(ll s=0;s<lim;s++){for(ll j=z;j<4;j++)F[1<<s][j]=u[j][s+i];}for(ll s=0;s<MS;s++){if(s!=(s&-s)){for(ll k=z;k<4;k++)F[s][k]=F[s&-s][k]|F[s-(s&-s)][k];}if(z){v1=F[s][1]|(F[s][2]&F[s][3]);v2=(F[s][2]|F[s][3])&(v1^all);}else{v1=(F[s][0]&F[s][1])|(F[s][2]&F[s][3]);v2=(F[s][0]|F[s][1])&(F[s][2]|F[s][3])&(v1^all);}ll X=v1.count(),Y=v2.count();(f[r][s][z]=f[r][s][z]*pw2[Y]%P*pw3[num-X-Y]%P)%=P;}}for(ll z=0;z<2;z++)for(ll s=0;s<MS;s++)(ans+=P-f[r][s][z])%=P;}printf("%lld\n",ans);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317291.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CodeForces:54

文章目录前言CF54A PresentsDescription\text{Description}DescriptionSolution\text{Solution}SolutionCF54B Cutting Jigsaw PuzzleDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF54C First Digit LawDescription\text{Desc…

[NOIP2016 提高组] 愤怒的小鸟

[NOIP2016 提高组] 愤怒的小鸟 题意&#xff1a; 有n只猪&#xff0c;给出猪的坐标(xi,yi),问最少用几个形如 yax^2bx 的曲线可以保证所有猪在曲线上&#xff0c;满足a<0,a,b为实数 n<18, 题解&#xff1a; 两个方法&#xff1a;爆搜或者状压dp 状压dp 看n<18也…

P5208-[WC2019] I 君的商店【交互,二分】

正题 题目链接:https://www.luogu.com.cn/problem/P5208 题目大意 有一个长度为nnn的010101序列aaa&#xff0c;你知道里面有奇数个111还是偶数个111。你每次可以选择两个下标集合S/TS/TS/T询问集合SSS和集合TTT位置的数字和哪个更大。 交互库只会告诉你S≤TS\leq TS≤T或者…

模板:后缀数组(SA)

文章目录前言解析后缀排序优化1&#xff1a;基数排序优化2&#xff1a;简化第一次排序优化3&#xff1a;提前break完整代码LCP与height所谓后缀数组&#xff0c;就是存储后缀的数组 &#xff08;逃&#xff09; 前言 为什么一个算法&#xff0c;如此难以理解却依然是成为一个…

P3959 [NOIP2017 提高组] 宝藏

P3959 [NOIP2017 提高组] 宝藏 题意: 额题意不好说&#xff0c;就是n个点m个边&#xff0c;选定一个点为根节点&#xff0c;构造一个最小生成树&#xff0c;边的权值为该该边起点到根节点之间的点的数量K&#xff08;不含根节点&#xff09; * 道路长度 1<n<12 0<m&…

如何在ASP.NET Core程序启动时运行异步任务(3)

原文&#xff1a;Running async tasks on app startup in ASP.NET Core (Part 3)作者&#xff1a;Andrew Lock译者&#xff1a;Lamond Lu之前我写了两篇有关在ASP.NET Core中运行异步任务的博文&#xff0c;本篇博文是对之前两篇博文中演示示例和实现方法的简短跟进。你可以通过…

CF1140G-Double Tree【最短路,矩阵乘法,树上倍增】

正题 题目链接:https://www.luogu.com.cn/problem/CF1140G 题目大意 给出一个nnn个点的树TTT&#xff0c;然后复制一份T′TT′&#xff0c;每个TTT中的点iii向T′TT′中的点iii都有连边构成一张图。 图上所有权值各不相同&#xff0c;现在qqq次询问图上两点的最短路。 1≤n≤…

数论六之计算几何——An Easy Problem,Ancient Berland Circus,Open-air shopping malls

可检验模板正确度An Easy Problem?!Ancient Berland CircusOpen-air shopping mallsAn Easy Problem?! problem 就是大讨论 #include <cmath> #include <cstdio> #include <iostream> using namespace std; #define eps 1e-6struct vec {double x, y;ve…

CodeForces:12271261(div1)1262(div2)

文章目录前言CF1227A Math ProblemDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF1227B BoxDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text{Code}CodeCF1227C MessyDescription\text{Des…

【NET CORE微服务一条龙应用】应用部署

简介本章主要介绍https://github.com/q315523275/FamilyBucket上微服务一条龙应用&#xff0c;在实际使用中的应用部署&#xff0c;以原始方式部署非docker部署应用主要包括&#xff1a;1、网关应用部署2、授权认证应用部署3、配置中心查询服务端应用部署4、综合管理应用部署5、…

牛客网区间dp练习

NC13230 合并回文子串 NC16129 小小粉刷匠 NC19909 [CQOI2007]涂色PAINT NC19997 [HAOI2016]字符合并 NC20238 [SCOI2003]字符串折叠 NC20252 [SCOI2007]压缩 NC20312 [SDOI2008]SUE的小球 POJ3042 Grazing on the Run

CF516D-Drazil and Morning Exercise【树上差分,倍增】

正题 题目链接:https://www.luogu.com.cn/problem/CF516D 题目大意 给出一棵nnn个点的树&#xff0c;定义f(x)f(x)f(x)表示距离点xxx最远的点的距离&#xff0c;qqq次询问给出一个kkk&#xff0c;要求一个最大的连通块满足连通块中所有点的f(x)f(x)f(x)最大最小差值不能超过k…

容斥问卷调查反馈——Co-prime,Character Encoding,Tree and Constraints,「2017 山东一轮集训 Day7」逆序对

文章目录Co-primesourcesolutioncodeCharacter EncodingsourcesolutioncodeTree and Constraintssourcesolutioncode「2017 山东一轮集训 Day7」逆序对sourcesolutioncodeCo-prime source TTT组数据&#xff0c;给出&#x1d43f;,&#x1d445;,&#x1d441;&#x1d43f;, …

手工修复Azure DevOps无法连接到Azure的问题

点击上方蓝字关注“汪宇杰博客”今天我在为一个从TFVC迁移到Git的老项目重新配置发布到Azure App Service的CI/CD管线的时候&#xff0c;Azure DevOps竟然爆了。这是一个微软已知的bug&#xff0c;目前还未修复&#xff0c;我来带大家看看如何手工workaround这个问题。首先&…

Loj#576-「LibreOJ NOI Round #2」签到游戏【线段树】

正题 题目链接:https://loj.ac/p/576 题目大意 给出一个长度为nnn的序列aaa&#xff0c;还有一个未知序列bbb&#xff0c;你每次可以花费gcd⁡ilrai\gcd_{il}^r a_igcdilr​ai​的代价得到∑ilrbi\sum_{il}^rb_i∑ilr​bi​的值。 每次修改aaa中的一个数&#xff0c;求得到b…

NC14732 锁

NC14732 锁 题意&#xff1a; n个居民&#xff0c;门上有k把锁&#xff0c;每个居民有若干钥匙&#xff0c;为1到k的一个子集&#xff0c;如果几名居民的钥匙的并集是1到k&#xff0c;即他们拥有全部锁的对应钥匙。 求最小的k&#xff0c;使得可以适当地给居民们每人若干钥匙…

CodeForces:1103(div1)1104(div2)

文章目录前言CF1104A Splitting into digitsDescription\text{Description}DescriptionSolution\text{Solution}SolutionDescription\text{Description}DescriptionCF1104B Game with stringDescription\text{Description}DescriptionSolution\text{Solution}SolutionCode\text…

专题突破一之分块——Untitled Problem II,Balanced Lineup,[ioi2009]Regions

文章目录SP2940 UNTITLE1 - Untitled Problem IIsourcesolutioncodeBalanced LineupsourcecodeCount on a tree II[ioi2009]RegionsSP2940 UNTITLE1 - Untitled Problem II source solution 分块 si{sik(i−l1)sikik(1−l)l≤i≤rsik(r−l1)r<is_i\begin{cases} s_ik\tim…

.NET Core实战项目之CMS 第十七章 CMS网站系统的部署

目前我们的.NET Core实战项目之CMS系列教程基本走到尾声了&#xff0c;通过这一系列的学习你应该能够轻松应对.NET Core的日常开发了&#xff01;当然这个CMS系统的一些逻辑处理还需要优化&#xff0c;如没有引入日志组件以及缓存功能&#xff0c;权限目前只支持控制到菜单&…

ICPC2019南昌区域赛

ICPC2019南昌区域赛 题号题目知识点难度A9102BA Funny Bipartite Graph状压dp思维稳银快金CAnd and Pair二项式定理快铜DBitwise TreeEBob’s Problem思维&#xff0c;生成树签到FDynamic Suffix ArrayGEating Plan思维题稳铜快银HPowers of TwoIResistanceJSummonKTreeLWho i…