//#pragma comment(linker, "/STACK:102400000,102400000")

/**
题目:hdu6078 Wavel Sequence
链接:http://acm.hdu.edu.cn/showproblem.php?pid=6078
题意:给定a序列和b序列。从a中取一个子序列x(数的位置顺序保持不变),子序列每个数满足a1<a2>a3<a4>a5<a6... 波浪形
从b中取相同长度的子序列y,也满足波浪形。 如果x与y序列一模一样,那么找到一个匹配方式。
求a与b两个序列有多少种匹配方式(相同的数但不同的位置,那么算作不同)。 思路:
定义dp[i][j][k]表示x序列以a[i]为结尾,y序列以b[j]结尾,k=0表示a[i]是波谷,k=1表示a[i]是波峰时候的匹配方式。
容易想到
dp[i][j][0] = sigma(dp[x][y][1]), x<i,y<j,b[x]>b[i]; (a[i]==b[j],a[x]==b[y])
dp[i][j][1] = sigma(dp[x][y][0]), x<i,y<j,b[x]<b[i];
由于i的枚举是最外围循环,所以当前这个i要得到的结果来源前面计算过的,一定满足x<i.所以x<i不用作为限制因素。
现在要考虑满足y<j,b[x]>b[i]||b[x]<b[i]; 所以用二维树状数组维护y和b[x]。 定义c[j][value][k]表示y序列的结尾下标在j以内,数值大小value以内,波浪状态为k时候的匹配方式数。 */
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<set>
#include<cstring>
#include<time.h>
#include<random>
#include<cmath>
using namespace std;
typedef pair<int,int> P;
typedef long long LL;
const int mod = ;
const int INF = 0x3f3f3f3f;
const int N = ;
int n, m;
int a[N], b[N];
int dp[N][];
int c[N][N][];
///二维树状数组
int query(int i,int j,int flag)
{
int s = ;
for(int x = i; x > ; x-=(x&(-x))){
for(int y = j; y > ; y-=(y&(-y))){
s = (s+c[x][y][flag])%mod;
}
}
return s;
}
void update(int i,int j,int flag,int d)
{
for(int x = i; x <= ; x+=(x&(-x))){
for(int y = j; y <= ; y+=(y&(-y))){
c[x][y][flag] = (c[x][y][flag]+d)%mod;
}
}
}
int main()
{
int T;
cin>>T;
for(int i = ; i<T; i++)
{
scanf("%d%d",&n,&m);
for(int i = ; i <= n; i++) scanf("%d",&a[i]);
for(int i = ; i <= m; i++) scanf("%d",&b[i]);
memset(c, , sizeof c);
LL ans = ;
for(int i = ; i <= n; i++){
for(int j = ; j <= m; j++){
if(a[i]!=b[j]) continue;
dp[j][] = (query(j,,)-query(j,b[j],)++mod)%mod;///+1是因为每一个b[j]都可以单独自身作为波谷,成为一个序列。
dp[j][] = query(j,b[j]-,);
ans = (ans+dp[j][]) %mod;
ans = (ans+dp[j][]) %mod;
update(j,b[j],,dp[j][]);
update(j,b[j],,dp[j][]);
}
}
printf("%lld\n",ans); }
return ;
}

hdu6078 Wavel Sequence dp+二维树状数组的更多相关文章

  1. POJ 2029 Get Many Persimmon Trees(DP||二维树状数组)

    题目链接 题意 : 给你每个柿子树的位置,给你已知长宽的矩形,让这个矩形包含最多的柿子树.输出数目 思路 :数据不是很大,暴力一下就行,也可以用二维树状数组来做. #include <stdio ...

  2. BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  3. BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)

    分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...

  4. [BZOJ3594] [Scoi2014]方伯伯的玉米田 二维树状数组优化dp

    我们发现任何最优解都可以是所有拔高的右端点是n,然后如果我们确定了一段序列前缀的结尾和在此之前用过的拔高我们就可以直接取最大值了然后我们在这上面转移就可以了,然后最优解用二维树状数组维护就行了 #in ...

  5. bzoj 3594: [Scoi2014]方伯伯的玉米田【二维树状数组+dp】

    设f[i][j]为前i棵玉米被拔高了j(因为是单调不降所以前面越高越好,所以每次拔一个前缀),转移是f[i][j]=f[k][l]+1,l<=j,a[k]+l<=a[i]+j,然后用二维树 ...

  6. SCOI2014 bzoj3594 方伯伯的玉米田(二维树状数组+dp)

    3594: [Scoi2014]方伯伯的玉米田 Time Limit: 60 Sec  Memory Limit: 128 MBSubmit: 1971  Solved: 961[Submit][St ...

  7. 【二维树状数组】【CF10D】 LCIS

    传送门 Description 给你两个串,求他们的最长公共上升子序列 Input 第一行是第一个串的长度\(n\) 第二行\(n\)个数代表第一个串 第三行是第二个串的长度\(m\) 第四行\(m\ ...

  8. 二维树状数组 BZOJ 1452 [JSOI2009]Count

    题目链接 裸二维树状数组 #include <bits/stdc++.h> const int N = 305; struct BIT_2D { int c[105][N][N], n, ...

  9. HDU1559 最大子矩阵 (二维树状数组)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1559 最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)  ...

随机推荐

  1. IntelliJ IDEA java开发 WebService

    测试的功能是通过访问solr服务器,获取相关信息,然后以webservice的形式供客户端访问来获取数据.通过查询资料,现在把过程记录如下: 1.环境 IntelliJ IDEA 2017.2.6 J ...

  2. global constructor

    HQ在要求我们修改code style后,又让我检查并去掉"global constructor". 第一次听说这玩意,就研究了一下.发现网上有人讨论的很精彩,就记下来. “glo ...

  3. 2014ACM/ICPC亚洲区域赛牡丹江现场赛总结

    不知道怎样说起-- 感觉还没那个比赛的感觉呢?如今就结束了. 9号.10号的时候学校还评比国奖.励志奖啥的,由于要来比赛,所以那些事情队友的国奖不能答辩.自己的励志奖班里乱搞要投票,自己又不在,真是无 ...

  4. X5平方速算法的证明

    X5代表15,25,35,45,55......以上变化的部分为X,如25这个数,X就等于2. X5平方数的速算法是这样:让X乘以X+1,后面写上25就是X5乘以X5的结果.比如25x25,先让2x3 ...

  5. Linux中查看jdk安装目录、Linux卸载jdk、rpm命令、rm命令参数

    一.查看jdk安装目录 [root@node001 ~]# whereis java java: /usr/bin/java /usr/local/java #java执行路径 [root@node0 ...

  6. 虚拟机VMware12.0安装centos 6.5+VMware中虚拟机网络模式区分

    之前的步骤一路next,有设置内存大小的根据机器的配置设置一下即可. 需要注意的地方, 下面是对于简化版进行设置的步骤 虚拟机网络模式 1.桥接模式 在桥接模式下,VMware虚拟机里的系统就像是 局 ...

  7. Autolayout约束动画化-Animating Autolayout Constraints

    原文:Animating Autolayout Constraints 作者:@kharrison 译者:CocoaChina--起个名字好难(CC论坛ID) 首发:CocoaChina 记于二零一五 ...

  8. B. Vanya and Books( Codeforces Round #308 (Div. 2) 简单题)

    B. Vanya and Books time limit per test 1 second memory limit per test 256 megabytes input standard i ...

  9. Android 如何增大开机铃声 M

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  10. tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控

    tornado zbar 二维码识别 ,配合nginx 反向代理,supervisord 监控 1.zbar识别二维码程序,python2.6.6 #!/usr/bin/env python # co ...