HDU6078Wavel Sequence
題目鏈接
題意
? 對(duì)于一個(gè)數(shù)列 a1,a2,a3,...,an ,當(dāng)且僅當(dāng) a1<a2>a3<a4>a5<a6... , b1,b2,b3,...,bm 。可以構(gòu)建兩個(gè)新的數(shù)列 f1,f2,f3,...,fk , g1,g2,g3,...,gk 。問(wèn)能構(gòu)建多少個(gè) f,g 滿(mǎn)足 afi=bgi 且 af1,af2,...,afk 是一個(gè)波浪。
分析
? 考慮枚舉A數(shù)列中取到位置 i 。B數(shù)列中取到了位置 j 。假設(shè)已知 cnt0 表示取 ai 之前,前一個(gè)值比 ai 高的種數(shù),即以 ai 為波谷的種數(shù), cnt1 為以 ai 為波峰的種數(shù)。那么如果 ai==bj ,對(duì)答案的貢獻(xiàn)為 cnt0+cnt1 。那么新的問(wèn)題是如何快速求解 cnt0 和 cnt1 。設(shè) sum[j][k] 表示 A 數(shù)列最多取到 i?1 , B 數(shù)列以位置 j 結(jié)尾,波峰波谷類(lèi)型為 k 的種類(lèi)數(shù)( k=1 表示波峰, k=0 表示波谷)。那么 cnt0=∑j?1t=1,bt>aisum[t][1],cnt1=∑j?1t=1,bt<aisum[t][0] 的過(guò)程中進(jìn)行。對(duì)于 sum 數(shù)組的維護(hù),顯然只有出現(xiàn)可行方案時(shí)需要更新,增加的方案為以 ai 為結(jié)尾的方案數(shù),即對(duì)應(yīng)的 cnt0,cnt1 。
代碼
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<queue> using namespace std; #define MAXN 2020 #define eps 1e-7 #define lson rt<<1 #define rson rt<<1|1 #define LL long long const int mod=998244353; int a[MAXN]; int b[MAXN]; int sum[MAXN][2]; int main(){int T,n,m;cin>>T;while(T--){scanf("%d %d",&n,&m);memset(sum,0,sizeof(sum));for(int i=1;i<=n;++i)scanf("%d",&a[i]);for(int i=1;i<=m;++i)scanf("%d",&b[i]);int ans=0;for(int i=1;i<=n;++i){int cnt0=1,cnt1=0;for(int j=1;j<=m;++j){if(a[i]==b[j]){ans=(ans+(cnt0+cnt1)%mod)%mod;sum[j][1]=(sum[j][1]+cnt1)%mod;sum[j][0]=(sum[j][0]+cnt0)%mod;}else if(b[j]>a[i])cnt0=(cnt0+sum[j][1])%mod;elsecnt1=(cnt1+sum[j][0])%mod;}}printf("%I64d\n",ans);} }總結(jié)
以上是生活随笔為你收集整理的HDU6078Wavel Sequence的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 海豚php 安装,下载及安装
- 下一篇: 别混淆区别很大 LED网格屏和格栅屏区