P7324-[WC2021]表达式求值【dp】

正题

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


题目大意

给一个只包含mmm个值的表达式,<<<表前后取最小值,>>>表前后取最大,???可以是小于也可以是大于。

然后nnn次给出这mmm个值,所有方案下表达式取值的和。输出这nnn次答案的和。

1≤n≤5×104,1≤m≤10,1≤∣S∣≤5×1041\leq n\leq 5\times 10^4,1\leq m\leq 10,1\leq |S|\leq 5\times 10^41n5×104,1m10,1S5×104


解题思路

有括号所以先把表达树建出来,考虑到mmm很小,应该和状压有点关系。暴力的做法是直接做nnn次,时间复杂度是O(nm∣S∣)O(nm|S|)O(nmS)显然过不了。

因为取值只有mmm个,考虑把所有的信息压缩起来。实际上我们需要的信息就只有mmm个数之间的大小顺序,这样的状态数是m!m!m!个,要搞起来时间复杂度最快是O(m!∣S∣)O(m!|S|)O(m!S)也过不了。

但是对于一个数字来说我们就只需啊哟考虑它和其他数字的大小关系,状态数是2m2^m2m。设fx,s,0/1f_{x,s,0/1}fx,s,0/1表示到节点xxx时,小于数字xxx的值状态是sss时到该节点的数字小于/大于数字xxx的方案数。

然后对于每个sss跑出来一个答案,然后按照这个后面就很好做了。

时间复杂度O(2m∣S∣+nmlog⁡n)O(2^m|S|+nm\log n)O(2mS+nmlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stack>
#define ll long long
using namespace std;
const ll N=1e5+10,P=1e9+7;
ll n,m,k,cnt,L,ans,a[10][N],p[10],rev[N];
ll ls[N],rs[N],f[N][2],z[N],c[N];
char s[N];stack<ll> st;
ll Build(ll l,ll r){if(l==r){++cnt;c[cnt]=s[l]-'0';return cnt;}if(rev[r]==l)return Build(l+1,r-1);ll x=++cnt;if(rev[r]){ls[x]=Build(l,rev[r]-2);rs[x]=Build(rev[r]+1,r-1);c[x]=s[rev[r]-1];}else{ls[x]=Build(l,r-2);rs[x]=Build(r,r);c[x]=s[r-1];}return x;
}
void dfs(ll x,ll s){f[x][0]=f[x][1]=0;if(c[x]<10){f[x][!(s&(1<<c[x]))]=1;return;}dfs(ls[x],s);dfs(rs[x],s);if(c[x]!='>'){for(ll i=0;i<2;i++)for(ll j=0;j<2;j++)(f[x][min(i,j)]+=f[ls[x]][i]*f[rs[x]][j]%P)%=P;}if(c[x]!='<'){for(ll i=0;i<2;i++)for(ll j=0;j<2;j++)(f[x][max(i,j)]+=f[ls[x]][i]*f[rs[x]][j]%P)%=P;}return;
}
bool cmp(ll x,ll y)
{return a[x][k]<a[y][k];}
signed main()
{scanf("%lld%lld",&n,&m);for(ll i=0;i<m;i++)for(ll j=1;j<=n;j++)scanf("%lld",&a[i][j]);scanf("%s",s+1);L=strlen(s+1);for(ll i=1;i<=L;i++){if(s[i]=='(')st.push(i);else if(s[i]==')'){ll x=st.top();rev[x]=i;rev[i]=x;st.pop();}}Build(1,L);ll MS=(1<<m);for(ll i=0;i<MS;i++)dfs(1,i),z[i]=f[1][1];for(k=1;k<=n;k++){for(ll i=0;i<m;i++)p[i]=i;sort(p,p+m,cmp);(ans+=z[0]*a[p[0]][k]%P)%=P;ll S=0;for(ll i=1;i<m;i++){S|=(1<<p[i-1]);(ans+=z[S]*(a[p[i]][k]-a[p[i-1]][k])%P)%=P;}}printf("%lld\n",(ans+P)%P);return 0;
}

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

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

相关文章

平面分割 题解(1.16 递推模拟)

平面分割 代码一行&#xff0c;解析一箱~~ 解析 计f[i]&#xff1a;从1到i累加之和 先假设最好情况&#xff0c;p2&#xff1b; 此时第一条会增加1个 第二条与第一条相交&#xff0c;再加2个 第三条与前2条相交&#xff0c;再加3个 … 故n条时共增加f[n]个&#xff0c;共f[n]…

牛客题霸 [二叉树的最大深度]C++题解/答案

二叉树的最大深度 题目描述 求给定二叉树的最大深度&#xff0c; 最大深度是指树的根结点到最远叶子结点的最长路径上结点的数量。 题解&#xff1a; 众所周知&#xff0c;树有左子树和右子树&#xff0c;每向下一层&#xff0c;深度就1, 所以我们就不断递归&#xff0c;看…

AT1983-[AGC001E]BBQ Hard【dp,组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/AT1983 题目大意 给出nnn个数对(ai,bi)(a_i,b_i)(ai​,bi​) 求 ∑i1n∑ji1n(aibiajbjaiaj)\sum_{i1}^n\sum_{ji1}^n\binom{a_ib_ia_jb_j}{a_ia_j}i1∑n​ji1∑n​(ai​aj​ai​bi​aj​bj​​) 1≤n≤2105,1≤ai,bi≤20001…

.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

本来这篇只是想简单介绍下ASP.NET Core MVC项目的&#xff08;毕竟要照顾到很多新手朋友&#xff09;&#xff0c;但是转念一想不如来点猛的&#xff08;考虑到急性子的朋友&#xff09;&#xff0c;让你通过本文的学习就能快速的入门ASP.NET Core。既然是快速入门所以过多过深…

codeforces1301 F. Super Jaber(多源bfs+枚举)

F. Super Jaber 最终答案的方案可以分为2种&#xff1a; 不使用传送&#xff0c;即曼哈顿距离。从起点S到最近&#xff08;步数最少&#xff09;的颜色为C的格子x&#xff0c;传送到离终点T最近的颜色也为c的格子y&#xff0c;再走到T&#xff08;从S到x以及y到T的过程中均使…

题解: 区间合并(opj 2-4-7620)

一开始轻视这道题了&#xff0c;想用各种各样奇怪的区间标记把这道题水掉&#xff0c;结果WA声一片。。&#xff08;我大意了&#xff0c;没有AC&#xff01;&#xff09; 后来大脑开始思考&#xff0c;贪心解决掉了&#xff0c;AC快乐~~&#xff08;忽略这道题来自分治…qwq&a…

牛客题霸 [二叉搜索树的第k个结点]C++题解/答案

牛客题霸 [二叉搜索树的第k个结点]C题解/答案 题目&#xff1a; 给定一棵二叉搜索树&#xff0c;请找出其中的第k小的结点。 题解&#xff1a; 二叉搜索树&#xff1a; 若它的左子树不空&#xff0c;则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空&#xf…

codeforces1303 F. Number of Components(并查集+添_正序、删_逆序)

F. Number of Components 并查集&#xff0c;每次修改考虑的是这个修改带来的贡献&#xff0c;就是和相邻颜色的对比&#xff0c;如果不考虑先不考虑颜色覆盖&#xff0c;那么添加颜色首先会产生一个新的连通块&#xff0c;然后考虑合并&#xff0c;每合并一次就会减少一个连通…

内部设计师揭秘!王者峡谷中竟有隐藏的c++代码??!!腾讯已经炸了!!!

解析 模拟的时候用关于n的一元二次方程实根公式解的不亦乐乎。。。后来经高人提醒才发现万物皆为斐波拉契。。 就很《离谱》 于是代码就不难了 也算有收获吧&#xff0c;遇到这种看起来莫名其妙的题时&#xff0c;不着急死磕&#xff0c;可以先写个上图一样的程序找找规律 “实…

.NET Core实战项目之CMS 第三章 入门篇-源码解析配置文件及依赖注入

写在前面上篇文章我给大家讲解了ASP.NET Core的概念及为什么使用它&#xff0c;接着带着你一步一步的配置了.NET Core的开发环境并创建了一个ASP.NET Core的mvc项目&#xff0c;同时又通过一个实战教你如何在页面显示一个Content的列表。不知道你有没有跟着敲下代码&#xff0c…

P5305-[GXOI/GZOI2019]旧词【树链剖分,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P5305 题目大意 给一棵有根树和kkk&#xff0c;QQQ次询问给出x,yx,yx,y求 ∑i1xdepLCA(i,y)k\sum_{i1}^{x}dep_{LCA(i,y)}^ki1∑x​depLCA(i,y)k​ 1≤n,Q≤5105,1≤k≤1091\leq n,Q\leq 5\times 10^5,1\leq k\leq 10^91≤n,…

牛客题霸 [二叉树的镜像]C++题解/答案

牛客题霸 [二叉树的镜像]C题解/答案 题目描述 操作给定的二叉树&#xff0c;将其变换为源二叉树的镜像。 题解&#xff1a; 根据题也不难看出&#xff0c;二叉树的镜像定义其实就是左右树翻转 所以我们一直递归左子树&#xff0c;到头后递归右子树&#xff0c;开始翻转&…

2021牛客暑期多校训练营1 G-Game of Swapping Numbers(最优解转化+贪心)

G-Game of Swapping Numbers 讲题人做法 最优解转化&#xff1a; 考虑任意一个最优解&#xff0c;我们把交换后的数字重新放回原来的位置&#xff0c;相当于为每一个元素分配了它在答案中的符号。比如 A{0, 3}, B {1, 2}&#xff0c;最优解符号分配是 A{-0,3}, B{-1,2}。 …

不止代码:导弹拦截

题目描述 某国为了防御敌国的导弹袭击&#xff0c;发展出一种导弹拦截系统。但是这种导弹拦截系统有一个缺陷&#xff1a;虽然它的第一发炮弹能够到达任意的高度&#xff0c;但是以后每一发炮弹都不能高于前一发的高度。某天&#xff0c;雷达捕捉到敌国的导弹来袭。由于该系统…

对.NET Core未来发展趋势的浅层判断

经常听到园里.NET开发人员在抱怨生态不如JAVA&#xff0c;想要转JAVA&#xff0c;所谓打不过你&#xff0c;我就加入你&#xff01;杜兰特的思维方式固然是获取总冠军的一种方式&#xff0c;但是我们要关起门来问自己有没有杜兰特的实力。用开发生态来类比NBA不是特别恰当&…

AT2567-[ARC074C]RGB Sequence【dp】

正题 题目链接:https://www.luogu.com.cn/problem/AT2567 题目大意 长度为nnn的包含三种颜色RGBRGBRGB的序列&#xff0c;mmm个限制[l,r,k][l,r,k][l,r,k]表示区间l∼rl\sim rl∼r恰好有kkk种颜色。 求方案数 1≤n≤3001\leq n\leq 3001≤n≤300 解题思路 很水的题是吧&…

牛客题霸 [字符串变形]C++题解/答案

牛客题霸 [字符串变形]C题解/答案 题目&#xff1a; 对于一个给定的字符串&#xff0c;我们需要在线性(也就是O(n))的时间里对它做一些变形。首先这个字符串中包含着一些空格&#xff0c;就像"Hello World"一样&#xff0c;然后我们要做的是把着个字符串中由空格隔…

2021牛客暑期多校训练营1 H-Hash Function(数学+FFT)

H-Hash Function Shining_xzl大佬题解 本题答案符合题意的充分必要条件是&#xff1a;不能是任意两个数的差以及他们的因数&#xff0c;因此只需用用FFT求出这些数的差&#xff0c;记为差的集合。 从小到大考虑一个答案&#xff0c;以及答案的倍数是不是上述差的集合&#x…

priority_queue+贪心:运输(题解)

解析 不难发现每次都应合并最大的一对&#xff0c;从而使局部最优带动整体最优 sort就会很自然的想到 但是问题是合并完之后的新值可能已经不是当前最大了&#xff08;WA。。qwq&#xff09; 于是想到每次循环sort一遍&#xff0c;结果n^2logn又超时了。。。 在一位高人的指引…

【话题揭秘】某大型国有银行的敏捷落地实践

“某大型国有银行的敏捷落地实践”话题介绍银行行业是强烈依赖IT的非IT行业&#xff0c;传统金融要想打破现有局面&#xff0c;除了要解决外因&#xff0c;还要突破内部因素&#xff0c;其中一点就是技术重塑和战略手段&#xff0c;也就是常说的数字化转型&#xff0c;这也是经…