博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
zoj 3349 dp + 线段树优化
阅读量:5224 次
发布时间:2019-06-14

本文共 2094 字,大约阅读时间需要 6 分钟。

题目:给出一个序列,找出一个最长的子序列,相邻的两个数的差在d以内。

1 /* 2 线段树优化dp 3 dp[i]表示前i个数的最长为多少,则dp[i]=max(dp[j]+1) abs(a[i]-a[j])<=d 4 复杂度为O(n ^ 2) 5 利用线段树优化,线段树保存区间最大值。离散化后便可求出,还要注意 对于叶子节点保存的即为dp的值,每次更改即可,开始一直累加。。。。。 6 */ 7 #include 
8 #include
9 #include
10 #include
11 #include
12 13 using namespace std;14 #define lson l,m,rt<<115 #define rson m + 1, r, rt<<1|116 const int maxn = 1e5 + 5;17 int s[maxn];18 int n, d;19 int san[maxn], tot;20 int sum[maxn << 2];21 void pushUp(int rt){22 sum[rt] = max(sum[rt<<1], sum[rt<<1|1]);23 }24 void update(int pos, int c, int l, int r, int rt){25 if (l == r){26 sum[rt] = c;//注意27 return ;28 }29 int m = (l + r) >> 1;30 if (pos <= m) update(pos, c, lson);31 else update(pos, c, rson);32 pushUp(rt);33 }34 int query(int L, int R, int l, int r, int rt){35 if (L <= l && R >= r){36 return sum[rt];37 }38 int m = (l + r) >> 1;39 int ret = 0;40 if (L <= m) ret = query(L, R, lson);41 if (R > m) ret = max(ret, query(L, R, rson));42 return ret;43 }44 int main(){45 while (~scanf("%d%d", &n, &d)){46 tot = 0;47 for (int i = 1; i <= n; ++i){48 scanf("%d", &s[i]);49 san[tot++] = s[i];50 }51 sort(san, san + tot);52 tot = unique(san, san + tot) - san;53 54 memset(sum, 0, sizeof(sum));55 int ans = 0;56 for (int i = 1; i <= n; ++i){57 int pos = lower_bound(san, san + tot, s[i]) - san + 1;58 int l = lower_bound(san, san + tot, s[i] - d) - san + 1;59 int r = upper_bound(san, san + tot, s[i] + d) - san;60 int que = query(l, r, 1, tot, 1) + 1;61 //cout << " l = " << l << " r = " << r << endl;62 ans = max(ans, que);63 //cout << " ans = " << ans << endl;64 update(pos, que, 1, tot, 1);65 }66 printf("%d\n", ans);67 }68 return 0;69 }

 

转载于:https://www.cnblogs.com/Missa/p/3416569.html

你可能感兴趣的文章
网络请求返回HTTP状态码(404,400,500)
查看>>
Spring的JdbcTemplate、NamedParameterJdbcTemplate、SimpleJdbcTemplate
查看>>
Mac下使用crontab来实现定时任务
查看>>
303. Range Sum Query - Immutable
查看>>
图片加载失败显示默认图片占位符
查看>>
【★】浅谈计算机与随机数
查看>>
《代码阅读方法与实现》阅读笔记一
查看>>
解决 sublime text3 运行python文件无法input的问题
查看>>
javascript面相对象编程,封装与继承
查看>>
Atlas命名空间Sys.Data下控件介绍——DataColumn,DataRow和DataTable
查看>>
Java中正则表达式的使用
查看>>
算法之搜索篇
查看>>
新的开始
查看>>
java Facade模式
查看>>
NYOJ 120校园网络(有向图的强连通分量)(Kosaraju算法)
查看>>
SpringAop与AspectJ
查看>>
Leetcode 226: Invert Binary Tree
查看>>
http站点转https站点教程
查看>>
解决miner.start() 返回null
查看>>
关于MFC中窗口的销毁
查看>>