HDU 2836 Traversal(线段树+离散化+DP)
来源:互联网 发布:阿里云ecs无法连接ftp 编辑:程序博客网 时间:2024/05/20 09:24
题目链接:点击打开链接
题意:给你n个数的序列, 一个数h, 求相邻数之差不超过h的子序列的个数和 % 9901。
思路:经典水题, 显然用d[i]表示以a[i]结尾的满足条件的子序列个数。 那么对于j < i , | a[j] - a[i] | <= h , 等价于 a[j] <= a[i] + h && a[j] >= a[i] - h。 对于这个限制用线段树下标维护, 线段树用来维护d[i]的累加和。
细节参见代码:
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<string>#include<vector>#include<stack>#include<bitset>#include<cstdlib>#include<cmath>#include<set>#include<list>#include<deque>#include<map>#include<queue>#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))using namespace std;typedef long long ll;typedef long double ld;const ld eps = 1e-9, PI = 3.1415926535897932384626433832795;const int mod = 9901;const int INF = 0x3f3f3f3f;// & 0x7FFFFFFFconst int seed = 131;const ll INF64 = ll(1e18);const int maxn = 100000 + 10;int T,n,m,sum[maxn<<2],h,d[maxn],a[maxn],b[maxn];inline void add(int& a, int b) { a += b; if(a >= mod) a %= mod;}void pushup(int o) { sum[o] = sum[o<<1] + sum[o<<1|1]; if(sum[o] >= mod) sum[o] %= mod;}void build(int l, int r, int o) { int m = (l + r) >> 1; sum[o] = 0; if(l == r) return ; build(l, m, o<<1); build(m+1, r, o<<1|1); pushup(o);}void update(int L, int R, ll v, int l, int r, int o) { int m = (l + r) >> 1; if(L <= l && r <= R) { add(sum[o], v); return ; } if(L <= m) update(L, R, v, l, m, o<<1); if(m < R) update(L, R, v, m+1, r, o<<1|1); pushup(o);}int query(int L, int R, int l, int r, int o) { int m = (l + r) >> 1; if(L <= l && r <= R) return sum[o]; int ans = 0; if(L <= m) add(ans, query(L, R, l, m, o<<1)); if(m < R) add(ans, query(L, R, m+1, r, o<<1|1)); pushup(o); return ans;}int main() { while(~scanf("%d%d",&n,&h)) { for(int i=1;i<=n;i++) { scanf("%d",&a[i]); b[i-1] = a[i]; } sort(b, b+n); int len = unique(b, b+n) - b; build(1, len, 1); int ans = 0; for(int i=1;i<=n;i++) { int l = lower_bound(b, b+len, a[i]-h) - b + 1; int r = upper_bound(b, b+len, a[i]+h) - b ; int pos = lower_bound(b, b+len, a[i]) - b + 1; d[i] = 1; add(d[i], query(l, r, 1, len, 1)); add(ans, d[i]-1); update(pos, pos, d[i], 1, len, 1); } printf("%d\n",ans); } return 0;}
0 0
- HDU 2836 Traversal(线段树+离散化+DP)
- HDOJ 题目2836 Traversal(线段树,离散化,DP)
- HDU 3607 线段树+离散化+DP
- HDU 3016 Man Down(线段树+离散化+dp)
- hdu 3450 离散化+dp+线段树优化
- hdu 1255(线段树+离散化)
- HDU 2227 Find the nondecreasing subsequences(线段树+离散化+DP)
- 【dp+离散化+线段树优化】Paint
- poj1151(hdu 1542)线段树+离散化
- hdu 1542线段树(成段更新+离散化)
- hdu 3333 Turing Tree(线段树+离散化)
- hdu 4007 Dave(线段树+离散化+扫描线)
- HDU 1542 Atlantis(线段树+离散化+扫描线)
- HDU 4325 Flowers (线段树+离散化)
- hdu 1542 Atlantis (线段树+离散化+扫描线)
- hdu 3333 Turing Tree(图灵树,线段树,离散化)
- hdu 5124 lines (线段树+离散化)
- 【HDU】5249-KPI(线段树+离散化)
- h264 裸流打包成mp4 注意事项
- 如何通过maven官网查询相关依赖的具体代码和版本?
- nodejs篇(一)
- 兼容浏览器的js事件绑定函数
- 【杭电oj】1068 - Girls and Boys(最大独立集数,匈牙利算法)
- HDU 2836 Traversal(线段树+离散化+DP)
- docx的解析
- lightoj 1079 - Just another Robbery 01背包
- 160329集合
- Android官方开发文档Training系列课程中文版:数据存储之数据库存储
- IOS学习 info.plist 文件加两行代码 多线程NSThread/GCD 异步下载网络图片
- nginx_http_proxy_module,实现反向代理及缓存功能
- 浅谈Servlet的本质
- 32 继承(三)