51Nod-1249-近似有序区间
来源:互联网 发布:数控折弯编程教学视频 编辑:程序博客网 时间:2024/05/20 21:02
ACM模版
描述
题解
这个题用线段树可解,奇思妙想啊~~~
首先我们可以很容易理解的是,
然后我们需要考虑将这个序列分解为
找到上述的所有极大近似有序区间后,我们也就只需要考虑固定左端点条件下,该区间有多少结点作为右端点可选,可选的条件自然是要大于等于左边一直到左端点的所有数,这也就构成了区间查询,不断查询并且缩小查询区间,一直到无法查询为止,也就找到了所有的合法右端点。
所以根据上述过程,我们可以很容易想到,这里需要倒着扫描序列,这样就很容易用线段树解决这个问题了。
代码
#include <cstdio>#include <iostream>#define ls rt << 1#define rs rt << 1 | 1using namespace std;const int MAXN = 5e4 + 10;int n;int S[MAXN];int vis[MAXN];int sum[MAXN];int tree[MAXN << 2];void build(int rt, int l, int r){ if (l == r) { tree[rt] = S[l]; return ; } int m = (l + r) >> 1; build(ls, l, m); build(rs, m + 1, r); tree[rt] = max(tree[ls], tree[rs]);}int query(int rt, int l, int r, int x, int y, int mx){ if (l == r) { if (S[l] >= mx) { return l; } return 0; } int m = (l + r) >> 1, k = 0; if (tree[rt] >= mx) { if (x <= m) { k = query(ls, l, m, x, y, mx); } if (k == 0 && y > m) { k = query(rs, m + 1, r, x, y, mx); } } return k;}int main(){ cin >> n; for (int i = 1; i <= n; i++) { cin >> S[i]; } build(1, 1, n); for (int i = n; i >= 1; i--) { if (S[i] > S[i + 1]) { sum[i] = 1; vis[i] = i; } else { vis[i] = vis[i + 1]; sum[i] = sum[i + 1] + 1; int mx = S[vis[i]]; int l = vis[i] + 1, r = l; while (S[r] >= S[i]) { r = vis[r] + 1; } r -= 1; while (l <= r) { mx = query(1, 1, n, l, r, mx); if (mx != 0) { sum[i]++; } else { break; } l = mx + 1; vis[i] = mx; mx = S[mx]; } } } long long ans = 0; for (int i = 1; i <= n; i++) { ans += sum[i]; } cout << ans << '\n'; return 0;}
阅读全文
0 0
- 51nod 1249 近似有序区间
- 51Nod-1249-近似有序区间
- 单调栈+树状数组——51nod1249 近似有序区间
- 51Nod-1747-近似多项式
- 51nod 1434 区间LCM
- 51nod区间的价值
- 51nod 1092【区间dp】
- 51nod-1434 区间LCM
- 51nod-1672 区间交
- 51nod 1021【区间DP】
- 51nod 1434 区间LCM
- 51Nod-1712-区间求和
- 51Nod - 1092 区间dp
- 51Nod - 1021 区间dp
- 51Nod 1712 区间求和
- 51nod 1712 区间求和
- 51NOD 1672 区间交
- 51nod 1672 区间交
- 前端跨域问题
- Python 3爬虫网易云(六)—— 第三方库安装
- Manthan, Codefest 17 E. Salazar Slytherin's Locket(数位DP)
- 钱币组合问题(一):(每种硬币不限次数)
- Ant构建Java项目总结(2)
- 51Nod-1249-近似有序区间
- 数据结构 —— 红黑树(C语言源码)
- Effective C++ — 继承与面向对象设计
- Java 源码分析(四)
- 数据结构单链表基本实现
- vue里面的scroll事件,以及如何处理事件问题,附带动画效果如何实现
- 【正一专栏】火箭人对怂疯老头——朝鲜史上最高级别的应对措施是啥?
- Session整理
- 10月计划