听说,一个好的Oier都是题目喂出来的。

题目

定义一个序列的最长贪心严格上升子序列为:若选出的子序列为 \(a\),对于其中相邻两项 \(i,j\),不存在 b\(i<k<j\),满足在原序列 \(b\) 中,有 \(b_i<b_k\),换句话说就是选择一个元素后必须选择它之后第一个大于它的元素

给定一个长度为 \(n\) 的序列,同时给定一个常数 \(k\),求该序列的所有长度为 \(k\)的子区间的最长贪心严格上升子序列的长度

数据范围\(10^6\)

解题思路

先想了一个长链剖分的假做法,发现不会处理长儿子,自闭了。

考虑每个点的出度都不超过1,所以他构成了一颗森林

设\(f_x\)表示从x开始往上走,最长走多远。

每加入一个点,需要把它的子树内的所有点权值+1

每删除一个点,需要把它的权值变得足够小

线段树维护即可

代码

  1. #include<bits/stdc++.h>
  2. #define now edge[i].v
  3. #define go(x) for(int i=head[x];i;i=edge[i].nxt)
  4. #define ls o<<1,l,mid
  5. #define rs o<<1|1,mid+1,r
  6. using namespace std;
  7. const int sz=1e6+527;
  8. int n,k;
  9. int cnt,T;
  10. int x,y,z;
  11. int head[sz];
  12. int a[sz],ans[sz];
  13. int dfn[sz],lev[sz];
  14. stack<int>s;
  15. struct Edge{
  16. int v,nxt;
  17. }edge[sz];
  18. struct node{
  19. int tag,mx;
  20. }tr[sz<<2];
  21. void add(int u,int v){
  22. edge[++cnt]=(Edge){v,head[u]};
  23. head[u]=cnt;
  24. }
  25. void update(int o){
  26. tr[o<<1].tag+=tr[o].tag;
  27. tr[o<<1|1].tag+=tr[o].tag;
  28. tr[o<<1].mx+=tr[o].tag;
  29. tr[o<<1|1].mx+=tr[o].tag;
  30. tr[o].tag=0;
  31. }
  32. void modify(int o,int l,int r){
  33. if(x<=l&&r<=y) return (void)(tr[o].mx+=z,tr[o].tag+=z);
  34. if(tr[o].tag) update(o);
  35. int mid=(l+r)>>1;
  36. if(x<=mid) modify(ls);
  37. if(y>mid) modify(rs);
  38. tr[o].mx=max(tr[o<<1].mx,tr[o<<1|1].mx);
  39. }
  40. void dfs(int x){
  41. dfn[x]=++T;
  42. go(x)
  43. dfs(now);
  44. lev[x]=T;
  45. }
  46. int main(){
  47. scanf("%d%d",&n,&k);
  48. for(int i=1;i<=n;i++){
  49. scanf("%d",&a[i]);
  50. while(!s.empty()&&a[s.top()]<a[i]){
  51. add(i,s.top());
  52. s.pop();
  53. }
  54. s.push(i);
  55. }
  56. n++;
  57. while(!s.empty()){
  58. add(n,s.top());
  59. s.pop();
  60. }
  61. dfs(n);
  62. for(int i=1;i<=k;i++){
  63. x=dfn[i],y=lev[i],z=1;
  64. modify(1,1,n);
  65. }
  66. ans[1]=tr[1].mx;
  67. for(int i=k+1;i<n;i++){
  68. x=dfn[i],y=lev[i],z=1;
  69. modify(1,1,n);
  70. x=dfn[i-k],y=lev[i-k],z=-1;
  71. modify(1,1,n);
  72. ans[i-k+1]=tr[1].mx;
  73. }
  74. for(int i=1;i<=n-k;i++) printf("%d ",ans[i]);
  75. }

题目链接

CF1132G的更多相关文章

  1. [CF1132G]Greedy Subsequences

    [CF1132G]Greedy Subsequences 题目大意: 定义一个序列的最长贪心严格上升子序列为:任意选择第一个元素后,每次选择右侧第一个大于它的元素,直到不能选为止. 给定一个长度为\( ...

  2. 【CF1132G】Greedy Subsequences(线段树)

    [CF1132G]Greedy Subsequences(线段树) 题面 CF 题解 首先发现选完一个数之后选择下一个数一定是确定的. 对于每个数预处理出左侧第一个比他大的数\(L\),那么这个数加入 ...

  3. cf1132G. Greedy Subsequences(线段树)

    题意 题目链接 Sol 昨天没想到真是有点可惜了. 我们考虑每个点作为最大值的贡献,首先预处理出每个位置\(i\)左边第一个比他大的数\(l\),显然\([l + 1, i]\)内的数的后继要么是\( ...

  4. cf1132G 线段树解分区间LIS(一种全新的线段树解LIS思路)+单调栈

    /* 给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献, 那么往左找到第一个比a[i]大的数,设这个数 ...

随机推荐

  1. 洛谷P5104 红包发红包

    题目链接: P5104 题目分析: 题目和\(n\)是没什么关系的,因为是\(n\)个人抢,其实不一定抢完 其实很显然--就是求一个连续型随机变量的期望 首先设一个随机变量\(X\),表示第一个人拿到 ...

  2. redis深入学习(三)-----事务、主从复制、jedis

    reids事务 概念 可以一次执行多个命令,本质是一组命令的集合.一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞 作用 一个队列中,一次性.顺序性.排他性的执行一系列 ...

  3. java软引用、弱引用(转摘)

    本文转自网络,源地址:https://www.jianshu.com/p/b56731447179 一.引用对象类型定义 首先,引用对象在Java定义中有三种类型,从弱到强依次为:软引用.弱引用与虚引 ...

  4. 基于baseline和stochastic gradient descent的个性化推荐系统

    文章主要介绍的是koren 08年发的论文[1],  2.1 部分内容(其余部分会陆续补充上来). koren论文中用到netflix 数据集, 过于大, 在普通的pc机上运行时间很长很长.考虑到写文 ...

  5. 单例模式以及在C#中的使用

    下面做一些简要的说明. 1. 单例模式(Singleton Pattern),又称作单件模式,当然也有一种诙谐的称谓:单身模式.在经典的GoF所著的<Design Patterns>一书中 ...

  6. Spring_用Spring容器创建对象并给属性赋值

    创建spring配置文件:spring-config.xml.对象的创建和赋值都在这里进行配置. 创建实体类,设置属性 import java.util.List; import java.util. ...

  7. 廖雪峰Java10加密与安全-3摘要算法-3SHA-1算法

    1.SHA-1算法 SHA-1算法也是一种哈希算法. 输出160 bits/20bytes 由美国国家安全局开发 SHA-0/SHA-1/SHA-256/SHA-512 * SHA-0有问题,已经作废 ...

  8. jaxFileUpload插件异步上传图片

    第一步:引入jquery文件和jaxFileUpload文件 文件位置:https://pan.baidu.com/s/1jHEyIyy 第二步,前端: <div class="for ...

  9. 深入浅出 Java Concurrency (16): 并发容器 part 1 ConcurrentMap (1)[转]

    从这一节开始正式进入并发容器的部分,来看看JDK 6带来了哪些并发容器. 在JDK 1.4以下只有Vector和Hashtable是线程安全的集合(也称并发容器,Collections.synchro ...

  10. SpringMVC,3种不同的URL路由配置方法 [转]

    SpringMVC中配置URL拦截,非常简单.网上找个示例,就能通过.但是,在我做了好几个Web项目,又参与了别人主导的Web项目时,发现URL配置也非常有学问. 1. 先说说一种比较常见的: < ...