题目
Wavel Sequence
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 644 Accepted Submission(s): 335
Problem Description
Have you ever seen the wave? It's a wonderful view of nature. Little Q is attracted to such wonderful thing, he even likes everything that looks like wave. Formally, he defines a sequence
a1,a2,...,an
as ''wavel'' if and only if
a1<a2>a3<a4>a5<a6...
Picture from Wikimedia Commons
Now given two sequences a1,a2,...,an and b1,b2,...,bm , Little Q wants to find two sequences f1,f2,...,fk(1≤fi≤n,fi<fi+1) and g1,g2,...,gk(1≤gi≤m,gi<gi+1) , where afi=bgi always holds and sequence af1,af2,...,afk is ''wavel''.
Moreover, Little Q is wondering how many such two sequences f and g he can find. Please write a program to help him figure out the answer.
Picture from Wikimedia Commons
Now given two sequences a1,a2,...,an and b1,b2,...,bm , Little Q wants to find two sequences f1,f2,...,fk(1≤fi≤n,fi<fi+1) and g1,g2,...,gk(1≤gi≤m,gi<gi+1) , where afi=bgi always holds and sequence af1,af2,...,afk is ''wavel''.
Moreover, Little Q is wondering how many such two sequences f and g he can find. Please write a program to help him figure out the answer.
Input
The first line of the input contains an integer
T(1≤T≤15)
, denoting the number of test cases.
In each test case, there are 2 integers n,m(1≤n,m≤2000) in the first line, denoting the length of a and b .
In the next line, there are n integers a1,a2,...,an(1≤ai≤2000) , denoting the sequence a .
Then in the next line, there are m integers b1,b2,...,bm(1≤bi≤2000) , denoting the sequence b .
In each test case, there are 2 integers n,m(1≤n,m≤2000) in the first line, denoting the length of a and b .
In the next line, there are n integers a1,a2,...,an(1≤ai≤2000) , denoting the sequence a .
Then in the next line, there are m integers b1,b2,...,bm(1≤bi≤2000) , denoting the sequence b .
Output
For each test case, print a single line containing an integer, denoting the answer. Since the answer may be very large, please print the answer modulo
998244353
.
Sample Input
1 3 5 1 5 3 4 1 1 5 3
Sample Output
10Hint(1)f=(1),g=(2). (2)f=(1),g=(3). (3)f=(2),g=(4). (4)f=(3),g=(5). (5)f=(1,2),g=(2,4). (6)f=(1,2),g=(3,4). (7)f=(1,3),g=(2,5). (8)f=(1,3),g=(3,5). (9)f=(1,2,3),g=(2,4,5). (10)f=(1,2,3),g=(3,4,5).
题目大意
看hint应该很好理解
解题思路
有点求最长公共子序列的意思,通过DP求解该点之前的波峰和波谷的数量。有机会再写一次吧
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define LL long long
#define read(a) scanf("%d",&a)
const int mod=998244353;
int a[2000+10];
int b[2000+10];
LL dp[2000+10][2];
LL sum[2000+10][2];
void work()
{
memset(dp,0,sizeof(dp));
memset(sum,0,sizeof(sum));
int n,m;
read(n),read(m);
LL ans=0;
for(int i=1;i<=n;i++)
read(a[i]);
for(int i=1;i<=m;i++)
read(b[i]);
for(int i=1;i<=n;i++)
{
LL peak=1;
LL val=0;
for(int j=1;j<=m;j++)
{
if(a[i]==b[j])
{
dp[j][0]=peak;
dp[j][1]=val;
ans=(ans+(peak+val)%mod)%mod;
sum[j][0]=(sum[j][0]+dp[j][0])%mod;
sum[j][1]=(sum[j][1]+dp[j][1])%mod;
}
else if(a[i]>b[j])
{
val=(val+sum[j][0])%mod;
}
else
{
peak=(peak+sum[j][1])%mod;
}
}
}
printf("%lld\n",ans);
}
int main()
{
int T;
read(T);
while(T--)
{
work();
}
return 0;
}