HDU 6078 Wavel Sequence (dp + 树状数组, 2017 Multi-Univ Training Contest 4)
来源:互联网 发布:新概念英语4 知乎 编辑:程序博客网 时间:2024/06/08 19:39
Problem
含 N 个数的 a 数组
Limit
Idea
直接 dp 操作,记 dp[i][j][k]
表示公共子序列以
考虑通过二维树状数组优化求和,二维树状数组第一维表示枚举的 a 数组的第 i 个数,第二维表示
则 dp[i][j][0] = get(i-1, b[j]-1, 1)
和 dp[i][j][1] = get(i-1, 2000, 0) - get(i-1, b[j], 0)
,get(x, y, wavel)
函数为获取二维树状数组所有在矩形 [1,1] -> [x, y]
的数值和(wavel 标识前置状态,由于波谷前必为波峰,波峰前必为波谷)。
若优先枚举 i 后枚举 j ,则可能存在查询树状数组时
Code
#include<bits/stdc++.h>using namespace std;const int N = 2000 + 10;const int mod = 998244353;int T, n, m, a[N], b[N], tree[N][N][2], dp[N][N][2];int lowbit(int x) { return x & -x; }void add(int x, int y, int w, int wavel) { //wavel = 0 means next a[i] > a[x] for i > x; for(int i=x;i<N;i+=lowbit(i)) for(int j=y;j<N;j+=lowbit(j)) (tree[i][j][wavel] += w) %= mod;}int get(int x, int y, int wavel) { int res = 0; for(int i=x;i;i-=lowbit(i)) for(int j=y;j;j-=lowbit(j)) (res += tree[i][j][wavel]) %= mod; return res;}int main(){ scanf("%d", &T); while(T--) { memset(tree, 0, sizeof(tree)); memset(dp, 0, sizeof(dp)); scanf("%d %d", &n, &m); for(int i=1;i<=n;i++) scanf("%d", &a[i]); for(int i=1;i<=m;i++) scanf("%d", &b[i]); long long ans = 0; for(int j=1;j<=m;j++) for(int i=1;i<=n;i++) { if(a[i] != b[j]) continue; (dp[i][j][0] = get(i-1, 2000, 1) - get(i-1, b[j], 1) + 1) %= mod; (ans += dp[i][j][0]) %= mod; (dp[i][j][1] = get(i-1, b[j]-1, 0)) %= mod; (ans += dp[i][j][1]) %= mod; add(i, b[j], dp[i][j][0], 0); add(i, b[j], dp[i][j][1], 1); } printf("%lld\n", (ans+mod) % mod); }}
阅读全文
0 0
- HDU 6078 Wavel Sequence (dp + 树状数组, 2017 Multi-Univ Training Contest 4)
- HDU 6133 Army Formations (树状数组, 2017 Multi-Univ Training Contest 8)
- HDU 6076 Security Check (DP, 2017 Multi-Univ Training Contest 4)
- HDU-6078 Wavel Sequence(dp+树状数组)
- HDU 6065 RXD, tree and sequence (LCA, 2017 Multi-Univ Training Contest 3)
- HDU 6086 Rikka with String (AC 自动机+状压 dp, 2017 Multi-Univ Training Contest 5)
- HDU 6125 Free from square (状压 dp , 2017 Multi-Univ Training Contest 7)
- HDU 6071 Lazy Running (Dijstra, 2017 Multi-Univ Training Contest 4)
- HDU 6069 Counting Divisors (2017 Multi-Univ Training Contest 4)
- HDU 6070 Dirt Ratio (二分+线段树, 2017 Multi-Univ Training Contest 4)
- HDU 6073 Matching In Multiplication (拓扑+DFS, 2017 Multi-Univ Training Contest 4)
- HDU 6074 Phone Call (LCA+并查集, 2017 Multi-Univ Training Contest 4)
- HDU 6072 Logical Chain (Biset+Kosaraju, 2017 Multi-Univ Training Contest 4)
- HDU 6138 Fleet of the Eternal Throne (后缀数组+字典树, 2017 Multi-Univ Training Contest 8)
- HDU 6058 Kanade's sum (链表, 2017 Multi-Univ Training Contest 3)
- HDU 6046 hash (HASH, 2017 Multi-Univ Training Contest 2)
- HDU 6085 Rikka with Candies (bitset, 2017 Multi-Univ Training Contest 5)
- HDU 6090 Rikka with Graph (贪心+构造, 2017 Multi-Univ Training Contest 5)
- 杭电acm 1880魔咒词典(水题)
- 删除Kali Linux多余的系统架构
- Pod升级AFNetWorking3.0崩溃
- hdu6033
- java-将一个正整数分解质因数
- HDU 6078 Wavel Sequence (dp + 树状数组, 2017 Multi-Univ Training Contest 4)
- greater<int>()和less<int>()的使用
- 13.odoo入门——杂记之git
- Android架构设计05-基于IOC的布局,控件,事件注入
- 数据库字段的长度 作用
- python 动态引入模块 importlib 和 __import__ 不一样
- Android之ExpandableListView的各种效果(默认展开不合闭,自定义父栏目及箭头控制)
- cvpr2017-branchout——基于CNN的在线集成跟踪
- c语言标准库