2017 多校4 Wavel Sequence

题意:

Formally, he defines a sequence \(a_1,a_2,...,a_n\) as ''wavel'' if and only if \(a_1<a_2>a_3<a_4>a_5<a_6\)...
Now given two sequences \(a_1,a_2,...,a_n\) and \(b_1,b_2,...,b_m\), Little Q wants to find two sequences \(f_1,f_2,...,f_k(1≤f_i≤n,f_i<f_{i+1})\) and \(g_1,g_2,...,g_k(1≤g_i≤m,g_i<g_i+1)\), where \(a_{f_i}=b_{g_i}\) always holds and sequence \(a_{f_1},a_{f_2},...,a_{f_k}\) is ''wavel''.

\(1<=n,m<=2000\)
\(1<=a_i,b_i<=2000\)

题解:

设\(f_{i,j,k}\)
​​ 表示仅考虑\(a[1..i]\)与\(b[1..j]\),选择的两个子序列结尾分别是\(a_i\)和\(b_j\),且上升下降状态是\(k\) 时的方案数,
则\(f_{i,j,k}=\sum f_{x,y,1-k}\)
​​ ,其中\(x<i,y<j\)

具体点说
定义\(f[i][j][0/1]\)为选择的两个子序列结尾分别是\(a_i\)和\(b_j\),当前为下降/上升状态的方案数
则当\(a[i] = b[j]\)的时候有
\(f[i][j][0] = \sum f[x][y][1]\),其中\(x < i,y < j 且a[x] < a[i]\)
\(f[i][j][1] = \sum f[x][y][0] + 1\),其中\(x < i,y < j 且a[x] > a[i]\)
暴力枚举是O(n^4)的,可以用二维树状数组去优化两维变成\(O(n^{2}log{^2}n)\)
顺序枚举i,保证了第一维递增的,只需要用树状数组去维护第二维的下标和值

#include<bits/stdc++.h>
#define LL long long
#define P pair<int,int>
using namespace std;
const int N = 2e3 + 10;
const int mod = 998244353;
int read(){int x = 0;char c = getchar();while(c < '0' || c > '9') c = getchar();while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();return x;
}
int s[2][N][N];
int a[N],b[N];
int n,m;
void add(int &x,int y){x += y;if(x >= mod) x -= mod;
}
int lowbit(int x){return x & (-x);
}
int sum(int o,int i,int j){int ans = 0;while(i){int y = j;while(y){add(ans,s[o][i][y]);y -= lowbit(y);}i -= lowbit(i);}return ans;
}
void update(int o,int i,int j,int val){while(i <= n){int y = j;while(y <= 2000){add(s[o][i][y],val);y += lowbit(y);}i += lowbit(i);}
}
int main(){int T;T = read();while(T--){n = read(),m = read();for(int k = 0;k < 2;k++)for(int i = 1;i <= n;i++)for(int j = 1;j <= 2000;j++) s[k][i][j] = 0;for(int i = 1;i <= n;i++) a[i] = read();for(int i = 1;i <= m;i++) b[i] = read();int ans = 0;for(int i = 1;i <= m;i++){for(int j = 1;j <= n;j++){if(b[i] == a[j]){int tmp1 = sum(1,j-1,a[j]-1),tmp2 = (mod + sum(0,j-1,2000)-sum(0,j-1,a[j]))%mod;update(0,j,a[j],tmp1);/// 0 下降 1 上升update(1,j,a[j],(tmp2 + 1)%mod);add(ans,tmp1);add(ans,tmp2);add(ans,1);}}}printf("%d\n",ans);}return 0;
}

题解的\(O(n^2)\)的做法
用\(s[i][j][0/1]\)表示\(a\)和\(b\)分别在\(1\)~\(i\)和\(1\)~\(j\)的结尾的子序列的方案
那么\(dp[i][j][k] = s[i-1][j-1][1 - k] + k==1?1:0\)
\(i,j\)顺序枚举,遇到\(a[i] = b[j]\)的时候,前面可以顺便计算大于和小于它的方案,然后更新即可

#include<bits/stdc++.h>
#define LL long long
#define P pair<int,int>
using namespace std;
const int N = 2e3 + 10;
const int mod = 998244353;
int read(){int x = 0;char c = getchar();while(c < '0' || c > '9') c = getchar();while(c >= '0' && c <= '9') x = x * 10 + c - 48, c = getchar();return x;
}
int s[2][N][N];
int dp[2][N][N];
int a[N],b[N];
int n,m;
void add(int &x,int y){x += y;if(x >= mod) x -= mod;
}
int main(){int T;T = read();while(T--){n = read(),m = read();for(int i = 1;i <= n;i++) a[i] = read();for(int i = 1;i <= m;i++) b[i] = read();for(int k = 0;k < 2;k++)for(int i = 1;i <= n;i++)for(int j = 1;j <= m;j++) dp[k][i][j] = s[k][i][j] = 0;int ans = 0;for(int i = 1;i <= n;i++){int tmp0 = 0,tmp1 = 0;///0 下降 1 上升for(int j = 1;j <= m;j++){if(a[i] == b[j]){add(dp[0][i][j],tmp0);add(dp[1][i][j],(tmp1+1)%mod);add(ans,(dp[0][i][j]+dp[1][i][j])%mod);}else if(a[i] > b[j]){add(tmp0, s[1][i-1][j]);}else{add(tmp1,s[0][i-1][j]);}}for(int j = 1;j <= m;j++){s[0][i][j] = s[0][i-1][j];s[1][i][j] = s[1][i-1][j];if(a[i] == b[j]){add(s[0][i][j],dp[0][i][j]);add(s[1][i][j],dp[1][i][j]);}}}printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/jiachinzhao/p/7295643.html

2017 多校4 Wavel Sequence相关推荐

  1. 2017 多校3 hdu 6061 RXD and functions

    2017 多校3 hdu 6061 RXD and functions(FFT) 题意: 给一个函数\(f(x)=\sum_{i=0}^{n}c_i \cdot x^{i}\) 求\(g(x) = f ...

  2. 2017 多校2 hdu 6053 TrickGCD

    2017 多校2 hdu 6053 TrickGCD 题目: You are given an array \(A\) , and Zhu wants to know there are how ma ...

  3. hdu6103[尺取法] 2017多校6

    /*hdu6103[尺取法] 2017多校6*/ #include <bits/stdc++.h> using namespace std; int T, m; char str[2000 ...

  4. HDU 6078 Wavel Sequence

    Wavel Sequence Problem Description Have you ever seen the wave? It's a wonderful view of nature. Lit ...

  5. hud 6078 Wavel Sequence

    hud 6078 Wavel Sequence 题目大意:给你两个序列a,b,让你找出两个函数 f 和 g 使得 a[f]=b[g],并且a[f1],a[f2],a[f3]--a[fk]满足 序列a1 ...

  6. (2017多校训练第四场)HDU - 6078 Wavel Sequence dp

    传送门:点击打开链接 定义状态dp[i][j][0]表示以a[i],b[j]结尾的且为波谷的情况总和,dp[i][j][1] 为波峰. 对于某个i,j满足a[i] == b[j],则dp[i][j][ ...

  7. 2017多校第4场 HDU 6078 Wavel Sequence DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 题意:求两个序列的公共波形子序列的个数. 解法: 类似于最长公共上升子序列,对于每个i,只考虑存 ...

  8. 2017 多校训练第二场 HDU 6047 Maximum Sequence(贪心+优先队列)

    Maximum Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  9. 2017 Multi-University Training Contest - Team 4 :Wavel Sequence

    题目链接 题目翻译: 给出长度为n的序列a, 给出长度为m的序列b. 挑选一些下标f, 挑选一些下表g, 并且这两组下标都是升序排列的. 然后在选出Af == Bg,这些数,组成题目中所要求的波浪,求 ...

最新文章

  1. Travis CI : 最小的分布式系统(二)
  2. 有关Struts2a的ction直接使用response异步问题
  3. c语言程序设计B试题,c语言程序设计期末试题B(含答案)Word版
  4. linux进程管理 pdf,高效与精细的结合--Linux的进程管理.pdf
  5. 【读书笔记】设计模式沉思录
  6. 《嵌入式》复习资料公共版
  7. [论文笔记]ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS
  8. UML-类图-关键字如何使用?
  9. 【转】 叫人起床的学问
  10. 【专题】CSDN下载频道3月热门资源top100汇总
  11. SketchUp插件|自然散射 (Skatter 2)插件最新版免费下载及介绍(草图大师模型散布)
  12. iOS 10.1发现新漏洞:可绕过“激活锁”强行进入主屏
  13. 汇编1-地址总线、数据总线与控制总线详解
  14. Button按钮及其点击事件方式
  15. virtualbox中ubuntu虚拟机安装增强功能
  16. (附源码)小程序 酒店疫情系统 毕业设计 091931
  17. 新浪微博下拉菜单制作(DOM小练习)
  18. 通过Safari浏览器获取iOS设备UDID(设备唯一标识符)
  19. Python 实现生命游戏
  20. 基于SpringBoot的个人博客系统设计与实现

热门文章

  1. 计算机无法读取配置文件,由于权限不足,无法读取配置文件
  2. untiy 串口通信
  3. 计算机工程学院运动会加油稿50字,运动会加油稿50字
  4. tidb server的oom问题优化探索
  5. 今天好无聊……悟空……你变成女妖精吧……
  6. 【Python数据分析与可视化】期末复习试题集
  7. centos 8 使用 nmcli 配置网桥Bridge(最后有踩坑过程)
  8. Splunk中12小时制AM/PM的日期转换
  9. Android开发丶基于高德地图实现定位、搜索定位、绘制圆圈自定义图标及改变圆圈半径等功能
  10. 计算机存储容量用K还是KB,计算机中容量单位B、KB、MB、GB和TB的关系