[loj3463]表达式求值
类似cf582E,先建出表达式树,然后树形dp+离散+min和max卷积的优化,复杂度为$o(nm|E|)$,无法通过
考虑我们仅关心于这$n$个数的大小关系,具体来说,假设给出的数组是$a_{i,j}$(其中$0\le i<m,1\le j\le n$),对于某一个$j$,将$a_{i,j}$从小到大排序后,依次是$a_{p_{i},j}$($0\le i<m$,$p_{i}$为$[0,m)$的一个排列)
暴力枚举$j$和$p_{i}$,接下来去统计答案不小于$a_{p_{i},j}$的方案数:
对于树形dp的状态上,我们仅需要记录小于$a_{p_{i},j}$和不小于$a_{p_{i},j}$的方案数,换言之是$o(1)$转移,但dp次数为$o(nm)$,因此总复杂度仍然是$o(nm|E|)$
但注意到,影响dp过程的只有对于每一个$i$,$[a_{i,j}\ge a_{p_{i},j}]$的值,不难发现至多$2^{m}$种,预处理出每一种值的结果,再枚举$j$和$p_{i}$求出是哪一种值即可
时间复杂度为$o(2^{m}|E|+nm)$,可以通过

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 50005
4 #define mod 1000000007
5 stack<int>st_op,st_num;
6 int V,n,m,p,ans,b[11][N],a[N],ls[N],rs[N],id[11],f[1<<10][N][2];
7 char s[N];
8 bool cmp(int x,int y){
9 return b[x][p]>b[y][p];
10 }
11 void merge(){
12 a[++V]=st_op.top();
13 st_op.pop();
14 rs[V]=st_num.top();
15 st_num.pop();
16 ls[V]=st_num.top();
17 st_num.pop();
18 st_num.push(V);
19 }
20 void dfs(int k,int p){
21 if ((!ls[k])&&(!rs[k])){
22 f[p][k][((p&(1<<a[k]))>0)]=1;
23 return;
24 }
25 dfs(ls[k],p);
26 dfs(rs[k],p);
27 int s=(1LL*f[p][ls[k]][0]*f[p][rs[k]][1]+1LL*f[p][ls[k]][1]*f[p][rs[k]][0])%mod;
28 if (a[k]==0){
29 f[p][k][0]=(1LL*f[p][ls[k]][0]*f[p][rs[k]][0]+s)%mod;
30 f[p][k][1]=1LL*f[p][ls[k]][1]*f[p][rs[k]][1]%mod;
31 }
32 if (a[k]==1){
33 f[p][k][0]=1LL*f[p][ls[k]][0]*f[p][rs[k]][0]%mod;
34 f[p][k][1]=(1LL*f[p][ls[k]][1]*f[p][rs[k]][1]+s)%mod;
35 }
36 if (a[k]==2){
37 f[p][k][0]=(2LL*f[p][ls[k]][0]*f[p][rs[k]][0]+s)%mod;
38 f[p][k][1]=(2LL*f[p][ls[k]][1]*f[p][rs[k]][1]+s)%mod;
39 }
40 }
41 int main(){
42 scanf("%d%d",&n,&m);
43 for(int i=0;i<m;i++)
44 for(int j=1;j<=n;j++)scanf("%d",&b[i][j]);
45 scanf("%s",s);
46 int l=strlen(s),flag=0;
47 for(int i=0;i<l;i++)
48 if (('0'<=s[i])&&(s[i]<='9')){
49 a[++V]=s[i]-'0';
50 st_num.push(V);
51 if ((!st_op.empty())&&(st_op.top()!=-1))merge();
52 }
53 else{
54 if (s[i]=='(')st_op.push(-1);
55 if (s[i]=='<')st_op.push(0);
56 if (s[i]=='>')st_op.push(1);
57 if (s[i]=='?'){
58 st_op.push(2);
59 flag=1;
60 }
61 if (s[i]==')'){
62 st_op.pop();
63 if ((!st_op.empty())&&(st_op.top()!=-1))merge();
64 }
65 }
66 while (!st_op.empty())merge();
67 for(int i=0;i<(1<<m);i++)dfs(V,i);
68 for(int i=1;i<=n;i++){
69 for(int j=0;j<m;j++)id[j]=j;
70 p=i;
71 sort(id,id+m,cmp);
72 id[m]=m;
73 int s=0;
74 for(int j=0;j<m;j++){
75 s|=(1<<id[j]);
76 ans=(ans+1LL*f[s][V][1]*(b[id[j]][i]-b[id[j+1]][i]))%mod;
77 }
78 }
79 printf("%d",ans);
80 return 0;
81 }
[loj3463]表达式求值的更多相关文章
- 表达式求值(noip2015等价表达式)
题目大意 给一个含字母a的表达式,求n个选项中表达式跟一开始那个等价的有哪些 做法 模拟一个多项式显然难以实现那么我们高兴的找一些素数代入表达式,再随便找一个素数做模表达式求值优先级表 - ( ) + ...
- 用Python3实现表达式求值
一.题目描述 请用 python3 编写一个计算器的控制台程序,支持加减乘除.乘方.括号.小数点,运算符优先级为括号>乘方>乘除>加减,同级别运算按照从左向右的顺序计算. 二.输入描 ...
- 数据结构算法C语言实现(八)--- 3.2栈的应用举例:迷宫求解与表达式求值
一.简介 迷宫求解:类似图的DFS.具体的算法思路可以参考书上的50.51页,不过书上只说了粗略的算法,实现起来还是有很多细节需要注意.大多数只是给了个抽象的名字,甚至参数类型,返回值也没说的很清楚, ...
- nyoj305_表达式求值
表达式求值 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...
- 利用栈实现算术表达式求值(Java语言描述)
利用栈实现算术表达式求值(Java语言描述) 算术表达式求值是栈的典型应用,自己写栈,实现Java栈算术表达式求值,涉及栈,编译原理方面的知识.声明:部分代码参考自茫茫大海的专栏. 链栈的实现: pa ...
- 数据结构--栈的应用(表达式求值 nyoj 35)
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=35 题目: 表达式求值 时间限制:3000 ms | 内存限制:65535 KB描述 AC ...
- NOIP2013普及组 T2 表达式求值
OJ地址:洛谷P1981 CODEVS 3292 正常写法是用栈 #include<iostream> #include<algorithm> #include<cmat ...
- HNU 12817 Shipura(表达式求值)
题目链接:http://acm.hnu.cn/online/?action=problem&type=show&id=12817 解题报告:定义两种运算符号,一种是>>,就 ...
- NOIP201302表达式求值
NOIP201302表达式求值 题目描述 Description 给定一个只包含加法和乘法的算术表达式,请你编程计算表达式的值. 输入描述 Input Description 输入仅有一行,为需要你计 ...
随机推荐
- 题解 CF468C Hack it!
题目传送门 Description 设 \(f(i)\) 表示 \(i\) 的数码只和,给出 \(a\),求出 \(l,r\) 使得 \(\sum_{i=l}^{r} f(i)\equiv 0\pmo ...
- FastAPI 学习之路(十六)Form表单
系列文章: FastAPI 学习之路(一)fastapi--高性能web开发框架 FastAPI 学习之路(二) FastAPI 学习之路(三) FastAPI 学习之路(四) FastAPI 学习之 ...
- python os.walk处理树状目录结构的文件
在项目工作中,时常需要用到处理文件的方法,尤其是在windows环境下的树状目录结构 os.walk恰好能完美的处理这种树状目录结构文件,能高效地帮助我们得到我们需要处理的文件 目录结构: Deskt ...
- Win10 配置JDK1.8 (JDK 8)环境变量
JDK的安装: 1. JDK安装过程中,一般X掉公共JRE,因为JDK包含了JRE: 环境变量的配置: 1. 打开环境变量,编辑系统变量,新建: 变量名:JAVA_HOME 变量值:D:\so ...
- 看动画学算法之:队列queue
目录 简介 队列的实现 队列的数组实现 队列的动态数组实现 队列的链表实现 队列的时间复杂度 简介 队列Queue是一个非常常见的数据结构,所谓队列就是先进先出的序列结构. 想象一下我们日常的排队买票 ...
- Alpha发布声明
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 Alpha-发布声明 我们是谁 删库跑路对不队 我们在做什么 题士 进度如何 进度总览 一.功能与特性 1. ...
- UltraSoft - Beta - Scrum Meeting 11
Date: May 27th, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 记录会议 Liuzh 前端 增加了对重复日程的支持 Kkkk 前端 测试验证前后端 ...
- BUAA-软件工程第一次作业
软件工程第一次作业 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第1次个人作业 我在这个课程的目标 团队完成好的软件,并对自己作出规划 这个作 ...
- Noip模拟57 2021.9.20
规律总结:联考必爆炸 T1 2A 没$A$掉的大水题,但是是真的不知道$000$前面的$00$也算先导$0$,以后要长记性,这种东西不能再错了 再打三遍: $000$前面的$00$也算先导$0$ $0 ...
- QEvent
QEvent类是所有事件类的基类,每一个对象都包含事件参数.Qt的主事件循环(QCoreApplication::exec())从事件队列中接收本地窗口系统的事件,并将它们翻译成QEvent,将这些事 ...