Longest Subarray(HDU6602+线段树)
题意
要你找一个最长的区间使得区间内每一个数出现次数都大于等于K。
题解-》https://blog.csdn.net/Ratina/article/details/97503663
#include<bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const int maxn=1e5+;
int N,C,K,a[maxn];
int mx[maxn<<],laz[maxn<<];
void pushdown(int rt){
if(laz[rt]==) return ;
mx[rt<<]+=laz[rt];
mx[rt<<|]+=laz[rt];
laz[rt<<]+=laz[rt];
laz[rt<<|]+=laz[rt];
laz[rt]=;
}
void update(int L,int R,int c,int l,int r,int rt)
{
if(L<=l&&r<=R)
{
laz[rt]+=c;
mx[rt]+=c;
return ;
}
pushdown(rt);
int m=(l+r)>>;
if(L<=m)
update(L,R,c,lson);
if(R>m)
update(L,R,c,rson);
mx[rt]=max(mx[rt<<],mx[rt<<|]);
}
int query(int rt, int l, int r){
if(l==r) return l;
pushdown(rt);
int mid=(l+r)>>;
if(mx[rt<<]==C) return query(rt<<,l,mid);
else if(mx[rt<<|]==C) return query(rt<<|,mid+,r);
else return -;
}
int main(){
while(~scanf("%d%d%d",&N,&C,&K)){
vector<int>pos[maxn];
for(int i=;i<=C;i++)
pos[i].push_back();
for(int i=;i<=N;i++)
{
scanf("%d",&a[i]);
pos[a[i]].push_back(i);
}
if(K==){
printf("%d\n",N);
continue;
}
memset(mx,,sizeof(mx));
memset(laz,,sizeof(laz));
int ans=,cur[maxn]={};
for(int i=;i<=N;i++){
int x=a[i];
int p=++cur[x];
update(i,i,C-,,N,);
if(pos[x][p-]+<=pos[x][p]-)
update(pos[x][p-]+,pos[x][p]-,-,,N,);
if(p>=K)
update(pos[x][p-K]+,pos[x][p-K+],,,N,);
int temp=query(,,N);
if(temp!=-)
ans=max(ans,i-temp+);
}
printf("%d\n",ans);
}
}
Longest Subarray(HDU6602+线段树)的更多相关文章
- 2019年杭电多校第二场 1012题Longest Subarray(HDU6602+线段树)
题目链接 传送门 题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于\(K\). 思路 我们通过固定右端点考虑每个左端点的情况. 首先对于每个位置,我们用线段树来维护它作为\(C\)种元素 ...
- 【HDU6602】Longest Subarray【线段树+分治】
题目大意:给出一串序列,询问最长的合法子串为多长,其中合法子串必须满足子串中[1,C]的数量大于等于K或者为0 题解: 定义右端点为包含某一点所需要的最小区间的右端点 那么初始化时就可以O(n)求出每 ...
- 杭电多校第二场1012 L - Longest Subarray ce 线段树
这题是真的秀...我服了...线段树用好了,感觉什么都可以写... 题目大意:给你一个串,问满足以下条件的子串中最长的是多长:对于每个数字,要么在这个子串没出现过,要么出现次数超过k次. 我们对于每一 ...
- 【HDOJ6602】Longest Subarray(线段树,vector)
题意:给定一个长为n的序列,第i个数a[i]都是一个[1,c]中的整数 如果一段序列[l,r]中出现过的数字出现次数都>=K则称其为好的序列 求最长的好的序列的长度 n,k,c,a[i]< ...
- HDU6602 Longest Subarray hdu多校第二场 线段树
HDU6602 Longest Subarray 线段树 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6602 题意: 给你一段区间,让你求最长的区间使 ...
- 2019杭电多校第二场hdu6602 Longest Subarray(线段树)
Longest Subarray 题目传送门 解题思路 本题求一个最大的子区间,满足区间内的数字要么出现次数大于等于k次,要么没出现过.给定区间内的数字范围是1~c. 如果r为右边界,对于一种数字x, ...
- [2019杭电多校第二场][hdu6602]Longest Subarray(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6602 题目大意为求最长的区间,满足C种数字在区间内要么不出现,要么出现的次数都不小于K. 大致的分析一 ...
- 2019杭电多校二 L. Longest Subarray (线段树)
大意: 给定序列$a$, 元素范围$[1,C]$, 求一个最长子序列, 满足每个元素要么不出现, 要么出现次数$\le K$. 枚举右端点, 考虑左端点合法的位置. 显然一定是$C$种颜色合法位置的交 ...
- CSU - 1551 Longest Increasing Subsequence Again —— 线段树/树状数组 + 前缀和&后缀和
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1551 题意: 给出一段序列, 删除其中一段连续的子序列(或者不删), 使得剩下的序列 ...
随机推荐
- C++中的class和struct区别
1,经过不停的改进,结构体 struct 变得原来越不像它在 C 语言中的样子了: 1,struct 在 C 语言中仅为了定义一个变量的集合,仅此而已,不能定义函数: 2,struct 在 C++ 中 ...
- Scrapy 教程(六)-反爬
伪装浏览器 服务器可以查看访问的终端,如果不是浏览器,可能会被屏蔽,而且即使你用同一浏览器访问频率过快,也可能被屏蔽,所以需要伪装浏览器反爬. 有以下几种方法 1. 在 settings中添加 use ...
- http-proxy-middleware
概述 这是设置代理的神器,webpack的devServer.proxy就是使用了非常强大的 http-proxy-middleware 包.Node.js代理很简单. 轻松配置代理中间件进行连接,发 ...
- 基于 Redux + Redux Persist 进行状态管理的 Flutter 应用示例
好久没在 SegmentFault 写东西,唉,也不知道 是忙还是懒,以后有时间 再慢慢写起来吧,最近开始学点新东西,有的写了,个人博客跟这里同步. 一直都在自己的 React Native 应用中使 ...
- Delphi XE2_XE3 Update
Delphi 和 C++Builder XE2 更新摘要 XE2的关键特性如下: 1. FireMonkey Application Platform支持运行在Windows (32和64位),Mac ...
- js实现计算器效果
<!DOCTYPE html> <html> <!-- Created using jsbin.com Source can be edited via http://j ...
- spark(3)
0.spark -------------------------------------------- transformation map filter repartition spark核心AP ...
- 关于<input type="hidden"/>标签的记录
<input type="hidden" name="pid" value="10"/>标签放在一个input标签后可以使用,但 ...
- 14.Linux-CentOS系统proc文件系统丢失
问题: 在强制卸载根目录下的磁盘,导致/proc文件系统丢失. 解决: 重启服务器重新生成.
- SVN本地搭建服务
本地搭建svn 服务端并使用 1.下载SVN服务端软 VisualSVN server 地址:http://subversion.apache.org/packages.html 2.安装 Visu ...