基本情况
ABC秒了,D读错题卡了一段时间,还好爆搜强项,E感觉极其类似LIS,但是似乎又不能用二分DP来写。
E
感觉极其类似LIS,但是暴力DP肯定T,又知道不能用二分优化
事实如此,确实类似LIS,但是通过线段树来维护区间最大值.
暂时还没有熟练线段树,先用atc的库来平替.
实现上就是将元素依次加入线段树 , 然后用当前元素符合条件区间的最大值来更新当前元素对应点的值.
最后输出总区间最大值即可.
int op(int a, int b) { return max(a, b); }
int e() { return 0; }
const int A = 500010;
int main()
{
int n, d;
cin >> n >> d;
atcoder::segtree<int, op, e> seg(A);
for (int i = 0, x; i < n; i++) {
cin >> x;
int l = max(0, x - d);
int r = min(A - 1, x + d);
int MAX = seg.prod(l, r + 1);
seg.set(x, MAX + 1);
}
cout << seg.all_prod() << endl;
return 0;
}
标签:AtCoder,339,Beginner,int,线段,seg,LIS,最大值
From: https://www.cnblogs.com/kdlyh/p/18005356