2017 多校4 Wavel Sequence
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相关推荐
- 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 ...
- 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 ...
- hdu6103[尺取法] 2017多校6
/*hdu6103[尺取法] 2017多校6*/ #include <bits/stdc++.h> using namespace std; int T, m; char str[2000 ...
- HDU 6078 Wavel Sequence
Wavel Sequence Problem Description Have you ever seen the wave? It's a wonderful view of nature. Lit ...
- 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 ...
- (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][ ...
- 2017多校第4场 HDU 6078 Wavel Sequence DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 题意:求两个序列的公共波形子序列的个数. 解法: 类似于最长公共上升子序列,对于每个i,只考虑存 ...
- 2017 多校训练第二场 HDU 6047 Maximum Sequence(贪心+优先队列)
Maximum Sequence Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 2017 Multi-University Training Contest - Team 4 :Wavel Sequence
题目链接 题目翻译: 给出长度为n的序列a, 给出长度为m的序列b. 挑选一些下标f, 挑选一些下表g, 并且这两组下标都是升序排列的. 然后在选出Af == Bg,这些数,组成题目中所要求的波浪,求 ...
最新文章
- Travis CI : 最小的分布式系统(二)
- 有关Struts2a的ction直接使用response异步问题
- c语言程序设计B试题,c语言程序设计期末试题B(含答案)Word版
- linux进程管理 pdf,高效与精细的结合--Linux的进程管理.pdf
- 【读书笔记】设计模式沉思录
- 《嵌入式》复习资料公共版
- [论文笔记]ALBERT: A LITE BERT FOR SELF-SUPERVISED LEARNING OF LANGUAGE REPRESENTATIONS
- UML-类图-关键字如何使用?
- 【转】 叫人起床的学问
- 【专题】CSDN下载频道3月热门资源top100汇总
- SketchUp插件|自然散射 (Skatter 2)插件最新版免费下载及介绍(草图大师模型散布)
- iOS 10.1发现新漏洞:可绕过“激活锁”强行进入主屏
- 汇编1-地址总线、数据总线与控制总线详解
- Button按钮及其点击事件方式
- virtualbox中ubuntu虚拟机安装增强功能
- (附源码)小程序 酒店疫情系统 毕业设计 091931
- 新浪微博下拉菜单制作(DOM小练习)
- 通过Safari浏览器获取iOS设备UDID(设备唯一标识符)
- Python 实现生命游戏
- 基于SpringBoot的个人博客系统设计与实现
热门文章
- 计算机无法读取配置文件,由于权限不足,无法读取配置文件
- untiy 串口通信
- 计算机工程学院运动会加油稿50字,运动会加油稿50字
- tidb server的oom问题优化探索
- 今天好无聊……悟空……你变成女妖精吧……
- 【Python数据分析与可视化】期末复习试题集
- centos 8 使用 nmcli 配置网桥Bridge(最后有踩坑过程)
- Splunk中12小时制AM/PM的日期转换
- Android开发丶基于高德地图实现定位、搜索定位、绘制圆圈自定义图标及改变圆圈半径等功能
- 计算机存储容量用K还是KB,计算机中容量单位B、KB、MB、GB和TB的关系