题目链接:洛谷

题目大意:对于一个长度为$n$的序列$a_i$,它的最长贪心严格上升子序列定义为(1)最长上升子序列(2)对于这个子序列,每个数的后继必须是在原序列中它右边第一个比它大的数。求所有长度为$k$的子区间中,它的最长贪心严格上升子序列的长度。

数据范围:$1\leq k\leq n\leq 10^6,1\leq a_i\leq n$


我们注意到每个数的后继是唯一的,所以可以在数列后面加上一个$n+1$,然后它就是一个树结构。

然后直接用一个单调栈就可以建出来这棵树了。

那么这个最长贪心严格上升子序列的长度就是这个树上的最长链(只能从儿子到父亲)

如果在这个子区间内增加一个$a[x]$,那就是以$x$这个点的子树内的点为起点的最长贪心严格上升子序列都加上1,删除就是减去1。

就用一个线段树维护区间加,区间$\max$就可以了。

 1 #include<bits/stdc++.h>
 2 #define Rint register int
 3 using namespace std;
 4 const int N = 1000003;
 5 int n, k, p[N], stk[N], top, head[N], to[N], nxt[N], dfn[N], siz[N], tim;
 6 inline void add(int a, int b){
 7     static int cnt = 0;
 8     to[++ cnt] = b; nxt[cnt] = head[a]; head[a] = cnt;
 9 }
10 inline void dfs(int x){
11     dfn[x] = ++ tim; siz[x] = 1;
12     for(Rint i = head[x];i;i = nxt[i]) dfs(to[i]), siz[x] += siz[to[i]];
13 }
14 int seg[N << 2], lazy[N << 2];
15 inline void pushdown(int x){
16     if(lazy[x]){
17         seg[x << 1] += lazy[x];
18         seg[x << 1 | 1] += lazy[x];
19         lazy[x << 1] += lazy[x];
20         lazy[x << 1 | 1] += lazy[x];
21         lazy[x] = 0;
22     }
23 }
24 inline void pushup(int x){seg[x] = max(seg[x << 1], seg[x << 1 | 1]);}
25 inline void change(int x, int L, int R, int l, int r, int v){
26     if(l <= L && R <= r){
27         seg[x] += v; lazy[x] += v;
28         return;
29     }
30     int mid = L + R >> 1;
31     pushdown(x);
32     if(l <= mid) change(x << 1, L, mid, l, r, v);
33     if(mid < r) change(x << 1 | 1, mid + 1, R, l, r, v);
34     pushup(x);
35 }
36 int main(){
37     scanf("%d%d", &n, &k);
38     for(Rint i = 1;i <= n;i ++) scanf("%d", p + i);
39     for(Rint i = 1;i <= n;i ++){
40         while(top && p[stk[top]] < p[i]){
41             add(i, stk[top]); -- top;
42         }
43         stk[++ top] = i;
44     }
45     while(top) add(n + 1, stk[top]), -- top;
46     dfs(n + 1);
47     for(Rint i = 1;i <= k;i ++) change(1, 1, n + 1, dfn[i], dfn[i] + siz[i] - 1, 1);
48     printf("%d", seg[1]);
49     for(Rint i = k + 1;i <= n;i ++){
50         change(1, 1, n + 1, dfn[i], dfn[i] + siz[i] - 1, 1);
51         change(1, 1, n + 1, dfn[i - k], dfn[i - k] + siz[i - k] - 1, -1);
52         printf(" %d", seg[1]);
53     }
54 }

View Code

转载于:https://www.cnblogs.com/AThousandMoons/p/10624072.html

CF1132G Greedy Subsequences相关推荐

  1. [Codeforces1132G]Greedy Subsequences——线段树+单调栈

    题目链接: Codeforces1132G 题目大意:给定一个序列$a$,定义它的最长贪心严格上升子序列为$b$满足若$a_{i}$在$b$中则$a_{i}$之后第一个比它大的也在$b$中.给出一个数 ...

  2. 退役前的做题记录5.0

    退役前的做题记录5.0 出于某种原因新开了一篇. [CodeChef]Querying on a Grid 对序列建立分治结构,每次处理\((l,mid,r)\)时,以\(mid\)为源点建立最短路树 ...

  3. Codeforces 刷题记录(已停更)

    Codeforces 每日刷题记录 (已停更) 打'+'是一些有启发意义的题目,部分附上一句话题解,每日更新3题,大部分题目较水. Day ID Problem Tutorial Note 1 1 + ...

  4. 【Educational Codeforces Round 61 (Rated for Div. 2)】A.B.C.D.E.F.G

    前言 这场在最开始很顺利,A题6min1A,B题14min1A,但是由于C题过题人数太少一度认为这个C题很难,等有人过了才开始写最开始的想法,C题40min1A,过C之后发现F过的很多,去看提,发现和 ...

  5. LeetCode:115. Distinct Subsequences

    题目 Given a string S and a string T, count the number of distinct subsequences of S which equals T. A ...

  6. Distinct Subsequences@LeetCode

    Distinct Subsequences 动态规划题.先用二维动态规划的思路解释下:设match是动态规划表,其中match[i][j]表示S.substring(0, i)对T.substring ...

  7. Arithmetic_Thinking -- greedy algorithm

    贪心算法--就是一种寻找局部最优解的情况,然后整合成整体最优解的情况 简单的例子:买菜的找钱,现在有1元,5角,1角的硬币,要找给别人2元7角,现在是怎么才能以最少的硬币量找给别人,肯定是先来两个1元 ...

  8. 数据结构与算法(C++)– 贪婪算法(Greedy algorithm)

    贪婪算法(Greedy algorithm) 1.基础 定义:贪婪算法分阶段地工作,在每一阶段,选择在当前最好的决策,不考虑将来的后果.所以一般只能得到局部最优而不是全局最优. 贪婪算法: Dijks ...

  9. leetcode 115. Distinct Subsequences Hard | 115. 不同的子序列(动态规划)

    题目 https://leetcode.com/problems/distinct-subsequences/ 题解 方法1:递归(超时) 这种解法比较容易理解,时间复杂度没算出来,但肯定不是 O(m ...

  10. HDOJ 2227 HDU 2227 Find the nondecreasing subsequences ACM 2227 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋   题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=2227 题目描述: ...

最新文章

  1. 【科普】大脑是如何编码复杂信息的?
  2. 8.1 matlab图形窗口与坐标轴(图形对象的句柄和属性、坐标轴的操作、图形窗口的操作)
  3. MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比
  4. MongoDB 优化器profile
  5. python模块版本管理工具_【转】Python包管理工具
  6. 5 SD配置-企业结构-定义-定义销售组
  7. 计算机二级换c语言,09年计算机二级C语言辅导:C技巧(内存分配:更换策略,不要为难内存)...
  8. winform 调用外部程序和多线程
  9. mysql 唯一索引_面试官:谈谈你对mysql索引的认识?
  10. 1.React学习笔记----基础模板创建+远程仓库建立
  11. java正则获取内容_Java利用正则表达式提取数据的方法
  12. 文件过滤器FileFilter
  13. 浪潮服务器安装ESXI6.7 无raid驱动解决方案
  14. 【Django】Django视图views详解
  15. 处暑(Limit of Heat )节到了,应了解的生活常识
  16. 【JCC技术】JCC功能演示
  17. An Apple a day keeps the doctor away
  18. 有机酸膜分离之柠檬酸生产应用反渗透技术
  19. win10多用户同时远程桌面登陆(允许多个RDP会话)-支持win10最新1909版2004版
  20. 音频播放、录音、视频播放、拍照、视频录制

热门文章

  1. 一个文件版的名片管理系统(Python3)
  2. 使用kubeadm安装部署k8s
  3. 怎么将高版本DWG格式图纸转换成低版本的DXF格式?
  4. 故事 - 100℃的人生
  5. 程序员应该做的事(转自CSDN)
  6. Mac OS X 安装protobuf
  7. python中安装decimal模块_第38天:Python decimal 模块
  8. php获取远程文件夹下的文件是否存在,PHP判断远程文件是否存在函数
  9. python扩展库简介_NumPy简介-Python扩展程序库 -- NumPy-编程文章分享
  10. html中展开的小箭头,HTML5 移动网页应用中的展开式标签(带上下指示箭头)