题目链接:

Codeforces1132G

题目大意:给定一个序列$a$,定义它的最长贪心严格上升子序列为$b$满足若$a_{i}$在$b$中则$a_{i}$之后第一个比它大的也在$b$中。给出一个数$k$,求出所有长度为$k$的子区间的最长贪心严格上升子序列。

考虑如果选取一个数之后一定会选取它之后第一个比它大的数,那么我们将每个数与它右边第一个比他大的数连边,这样我们就得到了一个森林,再建立一个虚拟节点并将森林中所有根都连向他就得到了一棵树。对于整个序列来说选取了一个点就会选取这个点在树上到根路径上的所有点,而整个序列的答案就是每个点深度的最大值。现在考虑一个子区间的答案,当区间右端点右移时,新加入区间的这个数会对原区间中比这个数小的数的答案$+1$也就是将这个数在树上的子树中所有点的答案$+1$(这些答案$+1$的所有点中虽然包括区间之前的数但显然这些数的答案不会比区间内数的答案更大,最多只会与最大值相同),同样当区间左端点右移时,就将这个数在树上的子树中所有点的答案$-1$来确保区间之前的数的答案不会比区间中数的答案更优。我们对整棵树的$dfs$序维护线段树,每次询问只需要分别将左右端点右移然后在线段树上区间修改并查询全局最大值即可。至于每个数右边第一个大于它的数只需要维护一个单调递减的单调栈然后每次弹栈时将栈顶与当前数连边即可。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int st[1000010];
int top;
int s[1000010];
int t[1000010];
int mx[4000010];
int sum[4000010];
int head[1000010];
int to[2000010];
int nex[2000010];
int n,k;
int a[1000010];
int dfn;
int tot;
void add(int x,int y)
{
nex[++tot]=head[x];
head[x]=tot;
to[tot]=y;
}
void dfs(int x)
{
s[x]=++dfn;
for(int i=head[x];i;i=nex[i])
{
dfs(to[i]);
}
t[x]=dfn;
}
void pushup(int rt)
{
mx[rt]=max(mx[rt<<1],mx[rt<<1|1]);
}
void pushdown(int rt)
{
if(sum[rt])
{
sum[rt<<1]+=sum[rt];
sum[rt<<1|1]+=sum[rt];
mx[rt<<1]+=sum[rt];
mx[rt<<1|1]+=sum[rt];
sum[rt]=0;
}
}
void change(int rt,int l,int r,int L,int R,int x)
{
if(L<=l&&r<=R)
{
sum[rt]+=x;
mx[rt]+=x;
return ;
}
pushdown(rt);
int mid=(l+r)>>1;
if(L<=mid)
{
change(rt<<1,l,mid,L,R,x);
}
if(R>mid)
{
change(rt<<1|1,mid+1,r,L,R,x);
}
pushup(rt);
}
int main()
{
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
while(top&&a[st[top]]<a[i])
{
add(i,st[top]);
top--;
}
st[++top]=i;
}
while(top)
{
add(n+1,st[top]);
top--;
}
dfs(n+1);
for(int i=1;i<=k;i++)
{
change(1,1,n+1,s[i],t[i],1);
}
printf("%d ",mx[1]);
for(int i=k+1;i<=n;i++)
{
change(1,1,n+1,s[i],t[i],1);
change(1,1,n+1,s[i-k],t[i-k],-1);
printf("%d ",mx[1]);
}
}

[Codeforces1132G]Greedy Subsequences——线段树+单调栈的更多相关文章

  1. Codeforces 781E Andryusha and Nervous Barriers 线段树 单调栈

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF781E.html 题目传送门 - CF781E 题意 有一个矩形,宽为 w ,高为 h .一开始会有 w 个 ...

  2. 洛谷P4425 转盘 [HNOI/AHOI2018] 线段树+单调栈

    正解:线段树+单调栈 解题报告: 传送门! 1551又是一道灵巧连题意都麻油看懂的题,,,,所以先解释一下题意好了,,,, 给定一个n元环 可以从0时刻开始从任一位置出发 每次可以选择向前走一步或者在 ...

  3. 线段树+单调栈+前缀和--2019icpc南昌网络赛I

    线段树+单调栈+前缀和--2019icpc南昌网络赛I Alice has a magic array. She suggests that the value of a interval is eq ...

  4. 牛客多校第四场sequence C (线段树+单调栈)

    牛客多校第四场sequence C (线段树+单调栈) 传送门:https://ac.nowcoder.com/acm/contest/884/C 题意: 求一个$\max {1 \leq l \le ...

  5. Codeforces 1175F - The Number of Subpermutations(线段树+单调栈+双针/分治+启发式优化)

    Codeforces 题面传送门 & 洛谷题面传送门 由于这场的 G 是道毒瘤题,蒟蒻切不动就只好来把这场的 F 水掉了 看到这样的设问没人想到这道题吗?那我就来发篇线段树+单调栈的做法. 首 ...

  6. BZOJ.4540.[HNOI2016]序列(莫队/前缀和/线段树 单调栈 RMQ)

    BZOJ 洛谷 ST表的一二维顺序一定要改过来. 改了就rank1了哈哈哈哈.自带小常数没办法. \(Description\) 给定长为\(n\)的序列\(A_i\).\(q\)次询问,每次给定\( ...

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

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

  8. cdqz2017-test10-rehearsal(CDQ分治&可持久化线段树&单调栈)

    题意: 给出n个三元组 e[i]=(si,ti,wi) 第i个三元组的价值为 Σ w[j] ,j 满足以下4个条件: 1.j<i 2.tj<ti 3.sj<si 4.不存在j< ...

  9. 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)

    传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ...

随机推荐

  1. 持续集成之单元测试篇——WWH(讲讲我们做单元测试的故事)

    持续集成之单元测试篇--WWH(讲讲我们做单元测试的故事) 前言 临近上线的几天内非重大bug不敢进行发版修复,担心引起其它问题(摁下葫芦浮起瓢) 尽管我们如此小心,仍不能避免修改一些bug而引起更多 ...

  2. Python-面向对象简介

    面向对象介绍 学习面向对象过程中会遇到一些名词,我们先解释下 名词解释 类:一个类即是对一类拥有相同属性的对象的抽象.蓝图.原型.模板.在类中定义了这些对象的都具备的属性(variables(data ...

  3. Open Live Writer安装教程

    配置步骤: 1.在菜单中选择"工具">"帐户",出现下面的画面: 2.点击"添加按钮",在出现的窗口中选择"其他日志服务&q ...

  4. asp.net mvc5 action多个参数

    需要完成http://site.com/user/add/1/2这样的url解析 使用action的参数直接获取数据的方式 Action声明如下 ) { ViewBag.clubID = id; ) ...

  5. C#设计模式之5:简单工厂和工厂方法模式

    工厂模式包含三种,简单工厂模式,工厂方法模式,抽象工厂模式.这三种都是解决了一个问题,那就是对象的创建问题.他们的职责就是将对象的创建和对象的使用分离开来. 当我们创建对象的时候,总是会new一个对象 ...

  6. Html5使用canvas作图

    以下例子是项目中实际用到的.不足之处请大家指正,设计到画线,写文字,填充,文字旋转. <!DOCTYPE html> <html> <head lang="en ...

  7. [转帖]cnblog 新闻 : 亚太云计算市场报告:腾讯位列前五 份额首超谷歌

    亚太云计算市场报告:腾讯位列前五 份额首超谷歌 投递人 itwriter 发布于 2019-03-18 12:06 评论(1) 有213人阅读 原文链接 [收藏] « » 美国市场研究机构 Syner ...

  8. [转帖]nginx服务器安装及配置文件详解

    nginx服务器安装及配置文件详解 http://seanlook.com/2015/05/17/nginx-install-and-config/  发表于 2015-05-17 |  更新于: 2 ...

  9. HDU 5782 Cycle —— KMP

    题目:Cycle 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5782 题意:给出两个字符串,判断两个字符串的每一个前缀是否循环相等(比如abc 和 ca ...

  10. Oracle创建表sql语句

    create table t_owners ( id number primary key, name ), addressid number, housenumber ), watermeter ) ...