/*
给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献,
那么往左找到第一个比a[i]大的数,设这个数下标l,那么[l+1,i-1]的后继显然是i
那么[l+1,i-1]区间,和包括第i个数的LIS都可以+1,处理完所有点后求[1,n]区间的最大值即可
区间更新显然用线段树解决,线段树叶子结点维护第i个位置被加次数,即以第i个结点为起点的LIS长度 本题是枚举长为k的区间,求每个区间的LIS,那么只要在更新时查询区间[i-k+1,i]的最大值即可
要先预处理出第一个比a[i]大的a[i]左边的数的下标 : 单调栈
*/
#include<bits/stdc++.h>
#include<stack>
using namespace std;
#define maxn 1200006
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
int n,k,a[maxn],l[maxn];
int Max[maxn<<],lazy[maxn<<];
inline void pushup(int rt){
Max[rt]=max(Max[rt<<],Max[rt<<|]);
}
inline void pushdown(int rt){
if(lazy[rt]){
lazy[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];
Max[rt<<]+=lazy[rt];
Max[rt<<|]+=lazy[rt];
lazy[rt]=;
}
} void update(int L,int R,int l,int r,int rt){
if(L<=l && R>=r){
lazy[rt]++;Max[rt]++;
return;
}
pushdown(rt);
int m=l+r>>;
if(L<=m)update(L,R,lson);
if(R>m)update(L,R,rson);
pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
if(L<=l && R>=r)return Max[rt];
pushdown(rt);
int m=l+r>>,res=;
if(L<=m)res=max(res,query(L,R,lson));
if(R>m)res=max(res,query(L,R,rson));
return res;
} stack<int>stk;
int main(){
cin>>n>>k;
for(int i=;i<=n;i++)scanf("%d",&a[i]);
a[]=0x3f3f3f3f;
stk.push();
for(int i=;i<=n;i++){
while(a[i]>a[stk.top()])
stk.pop();
l[i]=stk.top();
stk.push(i);
}
/* for(int i=1;i<=n;i++)
cout<<l[i]<<" ";*/
for(int i=;i<=n;i++){
update(l[i]+,i,,n,);
if(i-k+>=)
cout<<query(i-k+,i,,n,)<<" ";
}
}

cf1132G 线段树解分区间LIS(一种全新的线段树解LIS思路)+单调栈的更多相关文章

  1. CF1092 D & E —— 思路+单调栈,树的直径

    题目:https://codeforces.com/contest/1092/problem/D1 https://codeforces.com/contest/1092/problem/D2 htt ...

  2. UVa 548 树(已知其中两种遍历, 还原树)

    题意: 给出后序遍历和先序遍历, 还原一棵树, 然后求出从根节点到叶子的最小路劲和. 分析: 已知后序遍历, 那么后序的最后一个节点就是根节点, 然后在中序中找到这个节点, 它的左边就是左子树, 它的 ...

  3. hdu 3974 线段树 将树弄到区间上

    Assign the task Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. AtCoder Regular Contest 063 F : Snuke’s Coloring 2 (线段树 + 单调栈)

    题意 小 \(\mathrm{C}\) 很喜欢二维染色问题,这天他拿来了一个 \(w × h\) 的二维平面 , 初始时均为白色 . 然后他在上面设置了 \(n\) 个关键点 \((X_i , Y_i ...

  5. Splay(区间翻转)&树套树(Splay+线段树,90分)

    study from: https://tiger0132.blog.luogu.org/slay-notes P3369 [模板]普通平衡树 #include <cstdio> #inc ...

  6. HDU 1754 I Hate It(线段树单点替换+区间最值)

    I Hate It [题目链接]I Hate It [题目类型]线段树单点替换+区间最值 &题意: 本题目包含多组测试,请处理到文件结束. 在每个测试的第一行,有两个正整数 N 和 M ( 0 ...

  7. noip 借教室 线段树95分做法

    大致的思路是用线段树维护每个区间内部的最小值 段更新最小值 每次查某个区间的最小值是否满足租借要求 满足就借出去 update最小值 注意pushdown操作  还有一个从子区间提取答案的操作 提交地 ...

  8. 数据结构1 线段树查询一个区间的O(log N) 复杂度的证明

    线段树属于二叉树, 其核心特征就是支持区间加法,这样就可以把任意待查询的区间$[L, R]$分解到线段树的节点上去,再把这些节点的信息合并起来从而得到区间$[L,R]$的信息. 下面证明在线段树上查询 ...

  9. 1890. Money out of Thin Air(线段树 dfs转换区间)

    1890 将树的每个节点都转换为区间的形式 然后再利用线段树对结点更新 这题用了延迟标记 相对普通线段树 多了dfs的转换 把所要求的转换为某段区间 RE了N次 最后没办法了 记得有个加栈的语句 拿来 ...

随机推荐

  1. 给出随机存储器(RAM)和只读存储器(ROM)的差别

    给出随机存储器(RAM)和只读存储器(ROM)的差别

  2. 如何预览Github上的页面

    参考链接:https://www.jianshu.com/p/46ddd926f005

  3. oracle监听的动态注册和静态注册

    参考资料: https://blog.csdn.net/tianlesoftware/article/details/5543166 https://www.cnblogs.com/guilingya ...

  4. 如何解决错误0×80071AC3

            前几天我在机房敲百例的时候,敲完了想把文件夹移动到我的U盘里去,结果出现了这种情况           上面说运行chkdsk并重试,我运行了一下,没什么反应,我就想既然不能移动文件夹 ...

  5. python set 使用

    创建集合set python set类是在python的sets模块中,大家现在使用的python2.7.x中,不需要导入sets模块可以直接创建集合.>>>set('boy')se ...

  6. WindowsPE权威指南-PE文件头中的重定位表

    PE加载的过程 任何一个EXE程序会被分配4GB的内存空间,用户层处理低2G的内存,驱动处理高2G的内存. 1.双击EXE程序,操作系统开辟一个4GB的空间. 2.从ImageBase决定了加载后的基 ...

  7. Latex 问题解决

    1. 当bib文件中包含待引用的参考文献,并且在tex中正常通过\cite{}引用,却依然提示citation undefined,pdf中显示问号时,怎么解决报错. 解决:删除根目录下的  .bbl ...

  8. window安装mysql(详细步骤)

    前两天电脑炸了,就重新装了系统重新安装了一遍mysql. 首先 你需要有一个安装包哈哈哈,mysql的安装包. 最好不要安装在c盘呦~ 来进入正题吧... ********************** ...

  9. python3+selenium入门04-元素定位

    我们在对浏览界面做操作时,比如点击按钮,搜索框输入内容.都需要把鼠标挪过去,然后再点击,或者输入内容.在selenium操作时也是一样的.需要先对元素进行定位,然后才能进行操作.可以借助浏览器的开发者 ...

  10. VS2015 发布常见问题

    1. 发布时预编译 所示如下: 遇到的问题 使用abp时引用了System.Collections.Immutable.dll,但是项目编译一直出错, 排查: 查看项目引用,可看到System.Col ...