[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 输入仅有一行,为需要你计 ...
随机推荐
- 密码学系列之:加密货币中的scrypt算法
目录 简介 scrypt算法 scrypt算法详解 scrypt的使用 简介 为了抵御密码破解,科学家们想出了很多种方法,比如对密码进行混淆加盐操作,对密码进行模式变换和组合.但是这些算法逐渐被一些特 ...
- 沟谷网络的提取及沟壑密度的计算(ArcPy实现)
一.背景 沟壑密度是描述地面被水道切割破碎程度的一个指标.沟壑密度是气候.地形.岩性.植被等因素综合影响的反映.沟壑密度越大,地面越破碎,平均坡度增大,地表物质稳定性降低,且易形成地表径流,土壤侵蚀加 ...
- dubbo服务架构介绍
Provider: 暴露服务的服务提供方. Consumer: 调用远程服务的服务消费方. Registry: 服务注册与发现的注册中心. Monitor: 统计服务的调用次数和调用时间的监控中心. ...
- [kuangbin带你飞]专题一 简单搜索 棋盘问题
题来:链接https://vjudge.net/problem/OpenJ_Bailian-132 J - 棋盘问题 1.题目: 在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别. ...
- Web前端安全之安全编码原则
随着Web和移动应用等的快速发展,越来越多的Web安全问题逐渐显示出来.一个网站或一个移动应用,如果没有做好相关的安全防范工作,不仅会造成用户信息.服务器或数据库信息的泄露,更可能会造成用户财产的损失 ...
- Go语言核心36讲(Go语言进阶技术四)--学习笔记
10 | 通道的基本操作 作为 Go 语言最有特色的数据类型,通道(channel)完全可以与 goroutine(也可称为 go 程)并驾齐驱,共同代表 Go 语言独有的并发编程模式和编程哲学. D ...
- 耗时一个月,整理出这份Hadoop吐血宝典
本文目录: 一.HDFS 二.MapReduce 三.Yarn 四.Hadoop3.x 新特性 五.Hadoop 大厂面试真题解析 Hadoop 涉及的知识点如下图所示,本文将逐一讲解: 本文档参考了 ...
- WPF实现雷达图(仿英雄联盟)
WPF开发者QQ群: 340500857 | 微信群 -> 进入公众号主页 加入组织 前言 有小伙伴提出需要实现雷达图. 由于在WPF中没有现成的雷达图控件,所以我们自己实现一个. PS:有更 ...
- Java序列初始化
1.数组 Java数组可以用元素集合初始化: char[] c=new char[]{'.','.','.','.'}; 而想要用指定数量的相同元素来初始化数组,可以使用Arrays.fill()方法 ...
- django-admin和django-admin.py的区别
问题 django初学者在使用django-admin创建项目时容易出现无法创建的错误,这是因为网上很多教程用的都是django-admin.py创建的项目,不出意外的话,你输入相同的命令会发现项目没 ...