HDU 2836 - Traversal (树状数组 + DP)
来源:互联网 发布:优化网站的文件和资源 编辑:程序博客网 时间:2024/04/20 01:39
题意
给出一串序列,求它的子序列个数,满足条件
思路
看了Because Of You的题解。
先可以想到一个DP。
消去绝对值!
这样就说明j是在一个范围内。
那么我们就可以利用树状数组的特性,直接得到答案为
不过这里的i+k和i-k需要表示成一个输入里有的数,因为要离散化。这里可以利用二分得到。
代码
#include <stack>#include <cstdio>#include <list>#include <cassert>#include <set>#include <iostream>#include <string>#include <vector>#include <queue>#include <functional>#include <cstring>#include <algorithm>#include <cctype>#include <string>#include <map>#include <cmath>using namespace std;#define LL long long#define ULL unsigned long long#define SZ(x) (int)x.size()#define Lowbit(x) ((x) & (-x))#define MP(a, b) make_pair(a, b)#define MS(arr, num) memset(arr, num, sizeof(arr))#define PB push_back#define X first#define Y second#define ROP freopen("input.txt", "r", stdin);#define MID(a, b) (a + ((b - a) >> 1))#define LC rt << 1, l, mid#define RC rt << 1|1, mid + 1, r#define LRT rt << 1#define RRT rt << 1|1const double PI = acos(-1.0);const int INF = 0x3f3f3f3f;const double eps = 1e-8;const int MAXN = 1e5 + 10;const int MOD = 9901;const int MOD2 = 1e9 + 9;const int seed = 188147;const int dir[][2] = { {-1, 0}, {0, -1}, { 1, 0 }, { 0, 1 } };int cases = 0;typedef pair<int, int> pii;int sum[MAXN], arr[MAXN], val[MAXN];void Update(int idx, int num){ while (idx < MAXN) { sum[idx] += num; if (sum[idx] > MOD) sum[idx] %= MOD; idx += Lowbit(idx); }}int Query(int r){ int ret = 0; while (r > 0) { ret += sum[r]; r -= Lowbit(r); if (ret > MOD) ret %= MOD; } return ret % MOD;}int main(){ //ROP; int n, k; while (~scanf("%d%d", &n, &k)) { MS(sum, 0); for (int i = 1; i <= n; i++) { scanf("%d", &arr[i]); val[i] = arr[i]; } sort(arr+1, arr+1+n); int len = unique(arr+1, arr+1+n) - (arr+1); int ans = 0; for (int i = 1; i <= n; i++) { int idx = lower_bound(arr+1, arr+1+len, val[i]) - arr; int lower = lower_bound(arr+1, arr+1+len, val[i]-k) - arr; int upper = upper_bound(arr+1, arr+1+len, val[i]+k) - arr - 1; int curAns = (Query(upper) - Query(lower-1)) % MOD; ans += curAns; if (ans > MOD) ans %= MOD; Update(idx, curAns+1); } printf("%d\n", (ans%MOD + MOD) % MOD); } return 0;}
0 0
- HDU 2836 - Traversal (树状数组 + DP)
- HDU 2836 Traversal [树状数组+二分+dp]【数据结构】
- hdu -2836 - Traversal(树状数组)
- hdu 2836 树状数组 + DP
- hdu 3450 树状数组 + dp
- hdu 3450(树状数组+dp)
- hdu 2227 树状数组+dp
- hdu 4455(dp+树状数组)
- HDU 4455 DP+树状数组
- hdu 3030 树状数组 简单 DP
- hdu 4991 Ordered Subsequence(dp+树状数组)
- hdu 4991(dp+树状数组)
- hdu 2227(dp+树状数组)
- HDU - 4991(树状数组优化 dp)
- HDU 4455 Substrings 树状数组 + DP
- hdu 3450 树状数组优化dp
- HDU 4991 Ordered Subsequence -- DP+树状数组
- hdu 5542(树状数组优化dp)
- 百度地图-非常实用的搜索自定义
- linux中C编程的一些时间函数整理
- 百度地图修改鼠标样式
- QT数据库操作QSqlQuery
- 百度地图-修改marker图标(icon)
- HDU 2836 - Traversal (树状数组 + DP)
- 百度地图-点击事件问题
- UIGestureRecognizer手势的判断
- Step Two - 配置JAVA环境
- 数据信息图形化管理的明智选择-VisualNet
- cracked me.1. Acid burn
- 菜鸟练习PAT(四)
- 0、0和数值“零”在指针上下文中不是一回事
- 创建和删除快捷方式以及判断是否有快捷方式