线段树求某值之前或之后与其差值不小于k的最近位置
来源:互联网 发布:驱动中国双十一数据 编辑:程序博客网 时间:2024/06/05 04:42
#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>using namespace std;#define maxn 100000 + 10#define lson L, mid, rt<<1#define rson mid+1, R, rt<<1|1int n, k;int a[maxn];int ans;struct Node{ int mi, ma;}T[maxn<<2];void pushup(int rt){ int l = rt<<1, r = rt<<1|1; T[rt].ma = max(T[l].ma, T[r].ma); T[rt].mi = min(T[l].mi, T[r].mi);}void build(int L, int R, int rt){ if(L == R) { T[rt].ma = T[rt].mi = a[L]; return ; } int mid = (L + R) >> 1; build(lson); build(rson); pushup(rt);}///注意树的节点与区间节点不要混淆void query(int l, int r, int v, int L, int R, int rt){ if(L == R) { if(abs(T[rt].mi - v) >= k) { if(ans == -1 || ans < L) ans = L; } return ; } int mid = (L + R) >> 1; if(r > mid) if(abs(T[rt<<1|1].mi - v) >= k || abs(T[rt<<1|1].ma - v) >= k) query(l, r, v, rson); if(ans == -1 && l <= mid) if(abs(T[rt<<1].mi - v) >= k || abs(T[rt<<1].ma - v) >= k) query(l, r, v, lson);}int d[maxn];long long sum;int main(){ int t; scanf("%d", &t); while(t--) { sum = 1; scanf("%d%d", &n, &k); for(int i=1; i<=n; i++) scanf("%d", &a[i]); build(1, n, 1); d[1] = 1; for(int i=2; i<=n; i++) { ans = -1; query(1, i, a[i], 1, n, 1); if(ans == -1) d[i] = d[i-1]; else d[i] = max(d[i-1], ans + 1); sum += i - d[i] + 1; } printf("%I64d\n", sum); } return 0;}
阅读全文
0 0
- 线段树求某值之前或之后与其差值不小于k的最近位置
- UESTC 250 数位dp(数字相位数之间的差值不小于2)
- hdu 3415 后缀数组 长度不小于 k 的公共子串的个数
- POJ 3415 求两个字符串间长度不小于k的公共子串的个数
- HUST 1352 求重复次数不小于k的子串的个数。
- poj 3415 ( 后缀数组 长度不小于 k 的公共子串的个数)
- 后缀数组(长度不小于k的公共子串的个数)
- POJ 3415 不小于k的公共子串的个数
- 后缀数组(长度不小于k的公共子串的个数)
- 长度不小于 k 的公共子串的个数(poj3415)
- poj3415之长度不小于k的公共子串个数
- 从大到小输出二叉搜索树中键值不小于K的关键字
- 不小于N的素数个数
- 求数组不小于0的和
- POJ - 3415 Common Substrings(后缀数组求长度不小于 k 的公共子串的个数+单调栈优化)
- POJ 3415 Common Substrings(长度不小于k 的公共子串的个数--后缀数组+单调栈优化)
- poj 3415 :长度不小于 k 的公共子串的个数(后缀数组+单调栈)
- 拦截器,在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略。
- PCI设备BAR空间的初始化
- Ubuntu下安装搜狗输入法
- linux系统如何使用fork函数创建子进程
- C语言调试记录
- c++基础の引用、const
- 线段树求某值之前或之后与其差值不小于k的最近位置
- Hession与webservice调用之间的区别与联系
- 2.4梯度下降法
- 1048. 数字加密
- 田忌赛马
- 凯撒密码加密你的姓名拼音(c)
- 分类算法-支持向量机(SVM)
- linux man page
- Linux配置文件