CF1132G
听说,一个好的Oier都是题目喂出来的。
题目
定义一个序列的最长贪心严格上升子序列为:若选出的子序列为 \(a\),对于其中相邻两项 \(i,j\),不存在 b\(i<k<j\),满足在原序列 \(b\) 中,有 \(b_i<b_k\),换句话说就是选择一个元素后必须选择它之后第一个大于它的元素
给定一个长度为 \(n\) 的序列,同时给定一个常数 \(k\),求该序列的所有长度为 \(k\)的子区间的最长贪心严格上升子序列的长度
数据范围\(10^6\)
解题思路
先想了一个长链剖分的假做法,发现不会处理长儿子,自闭了。
考虑每个点的出度都不超过1,所以他构成了一颗森林
设\(f_x\)表示从x开始往上走,最长走多远。
每加入一个点,需要把它的子树内的所有点权值+1
每删除一个点,需要把它的权值变得足够小
线段树维护即可
代码
#include<bits/stdc++.h>
#define now edge[i].v
#define go(x) for(int i=head[x];i;i=edge[i].nxt)
#define ls o<<1,l,mid
#define rs o<<1|1,mid+1,r
using namespace std;
const int sz=1e6+527;
int n,k;
int cnt,T;
int x,y,z;
int head[sz];
int a[sz],ans[sz];
int dfn[sz],lev[sz];
stack<int>s;
struct Edge{
int v,nxt;
}edge[sz];
struct node{
int tag,mx;
}tr[sz<<2];
void add(int u,int v){
edge[++cnt]=(Edge){v,head[u]};
head[u]=cnt;
}
void update(int o){
tr[o<<1].tag+=tr[o].tag;
tr[o<<1|1].tag+=tr[o].tag;
tr[o<<1].mx+=tr[o].tag;
tr[o<<1|1].mx+=tr[o].tag;
tr[o].tag=0;
}
void modify(int o,int l,int r){
if(x<=l&&r<=y) return (void)(tr[o].mx+=z,tr[o].tag+=z);
if(tr[o].tag) update(o);
int mid=(l+r)>>1;
if(x<=mid) modify(ls);
if(y>mid) modify(rs);
tr[o].mx=max(tr[o<<1].mx,tr[o<<1|1].mx);
}
void dfs(int x){
dfn[x]=++T;
go(x)
dfs(now);
lev[x]=T;
}
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
while(!s.empty()&&a[s.top()]<a[i]){
add(i,s.top());
s.pop();
}
s.push(i);
}
n++;
while(!s.empty()){
add(n,s.top());
s.pop();
}
dfs(n);
for(int i=1;i<=k;i++){
x=dfn[i],y=lev[i],z=1;
modify(1,1,n);
}
ans[1]=tr[1].mx;
for(int i=k+1;i<n;i++){
x=dfn[i],y=lev[i],z=1;
modify(1,1,n);
x=dfn[i-k],y=lev[i-k],z=-1;
modify(1,1,n);
ans[i-k+1]=tr[1].mx;
}
for(int i=1;i<=n-k;i++) printf("%d ",ans[i]);
}
CF1132G的更多相关文章
- [CF1132G]Greedy Subsequences
[CF1132G]Greedy Subsequences 题目大意: 定义一个序列的最长贪心严格上升子序列为:任意选择第一个元素后,每次选择右侧第一个大于它的元素,直到不能选为止. 给定一个长度为\( ...
- 【CF1132G】Greedy Subsequences(线段树)
[CF1132G]Greedy Subsequences(线段树) 题面 CF 题解 首先发现选完一个数之后选择下一个数一定是确定的. 对于每个数预处理出左侧第一个比他大的数\(L\),那么这个数加入 ...
- cf1132G. Greedy Subsequences(线段树)
题意 题目链接 Sol 昨天没想到真是有点可惜了. 我们考虑每个点作为最大值的贡献,首先预处理出每个位置\(i\)左边第一个比他大的数\(l\),显然\([l + 1, i]\)内的数的后继要么是\( ...
- cf1132G 线段树解分区间LIS(一种全新的线段树解LIS思路)+单调栈
/* 给定n个数的数列,要求枚举长为k的区间,求出每个区间的最长上升子序列长度 首先考虑给定n个数的数列的LIS求法:从左往右枚举第i点作为最大点的贡献, 那么往左找到第一个比a[i]大的数,设这个数 ...
随机推荐
- javascript 释放变量
JavaScript 释放变量 在Javascript是可以使用“delete”来手动删除变量,通过这样的方法让GC(Garbage collection)来回收内存,但在JS中并不是所有的变量都可以 ...
- C++之memset函数
可参考: C++中memset函数的用法 C++中memset函数的用法 C++中memset()函数的用法详解 c/c++学习系列之memset()函数 透彻分析C/C++中memset函数 mem ...
- Excel 2016在大数据分析领域有了很多的改善
Excel 2016在大数据分析领域有了很多的改善 通常,我们会把大数据分析的整个过程分为五个阶段: 获取获取,数据分析,可视化,发布报告,应用报告. 在获取数据方面,Excel 2016相对Exce ...
- 关于Spring Cloud Feign的一些记录!
学习Spring Cloud Feign过程中,相关资料都会反复强调:微服务调用的话(@FeignClient) 客户端方法的返回值和服务端方法的返回值还有方法名之类的都是要求一致的! 关于方法名是 ...
- Python3读取深度学习CIFAR-10数据集出现的若干问题解决
今天在看网上的视频学习深度学习的时候,用到了CIFAR-10数据集.当我兴高采烈的运行代码时,却发现了一些错误: # -*- coding: utf-8 -*- import pickle as p ...
- NOI2018 Day1 归程(return)
第一次参加NOI,当然,我没去现场做,只是在网络同步赛做了而已. 那网站,特别特别卡啊-- 最后只交了第一题,原本认为能AC,但是因为某些原因只有50分. 我这可怜的第一次啊-- 题目 题目点此处下载 ...
- 【codeforces 508D】Tanya and Password
[题目链接]:http://codeforces.com/problemset/problem/508/D [题意] 给你一个字符的所有连续3个的子串; 让你复原出原串; (包含小写.大写字母以及数字 ...
- 局部内部类为什么只能访问final局部变量,对于成员变量却可以随便访问?
局部内部类为什么只能访问final局部变量,对于成员变量却可以随便访问? public class OuterClass { private int memberField = 10; public ...
- 数据交换格式之 - Json
Json简介: JSON是JavaScript对象表示法,是一种与语言无关的数据交换的格式,是一种完全独立于语言的文本格式. 使用ajax进行前后台数据交换,移动端与服务端的数据交换. web客户端和 ...
- 修改CentOS6.5主机名引起MySQL5.6.35服务问题
本来是心血来潮修改CentOS6.5的主机名 /****** 修改CentOS6.5默认主机名 ******/ .备份系统网络配置文件 [root@localhost ~]# cp /etc/sysc ...