HDU 6602 Longest Subarray (线段树)
题意:
1e5的数组,c(1e5)种数字求最长的子串,使得其中每个出现的数字出现的次数为0次或者大于k次
思路:
枚举右端点i,维护当前右端点时,每个左端点的可行元素数量,当且仅当可行元素为c时更新答案
每次用最左边的可行的左端点与当前右端点更新答案
对于每个元素,如果它从i往左第1次出现的元素为pos1,第k次出现的为pos2
那么该元素的可行区域为[1,pos2]与[pos1+1,i]
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<stack>
#include<queue>
#include<deque>
#include<set>
#include<vector>
#include<map> #define fst first
#define sc second
#define pb push_back
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
#define lc root<<1
#define rc root<<1|1 using namespace std; typedef double db;
typedef long double ldb;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> PI;
typedef pair<ll,ll> PLL; const db eps = 1e-;
const int mod = 1e9+;
const int maxn = 2e5+;
const int maxm = 4e6+;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0); int n,c,k;
int a[maxn];
vector<int>v[maxn];
int mx[maxn<<];
int addv[maxn<<];
void build(int l, int r, int root){
int mid = (l+r)>>;
if(l==r){mx[root]=c;return;}
build(lson);
build(rson);
mx[root]=max(mx[lc],mx[rc]);
addv[root]=;
return;
}
void pushdown(int l, int r, int root){
if(addv[root]){
addv[lc]+=addv[root];
addv[rc]+=addv[root];
mx[lc]+=addv[root];
mx[rc]+=addv[root];
addv[root]=;
}
return;
}
void update(int x, int y, int val, int l, int r, int root){
int mid = (l+r)>>;
if(x<=l&&r<=y){
addv[root]+=val;
mx[root]+=val;
return;
}
pushdown(l,r,root);
if(x<=mid)update(x,y,val,lson);
if(y>mid)update(x,y,val,rson);
mx[root]=max(mx[rc],mx[lc]);
return;
}
int ask(int l, int r, int root){
int mid = (l+r)>>;
if(l==r){
if(mx[root]==c)return l;
else return inf;
}
pushdown(l,r,root);
if(mx[lc]==c)return ask(lson);
else if(mx[rc]==c)return ask(rson);
return inf;
} int main(){
while(~scanf("%d %d %d", &n, &c, &k)){
for(int i = ; i <= n; i++){v[i].clear();v[i].pb();}
for(int i = ; i <= n; i++){
scanf("%d", &a[i]);
}
build(,n,);
int ans = ;
for(int i = ; i <= n; i++){
if((int)v[a[i]].size()>k){
int l = v[a[i]][v[a[i]].size()-k];
int r = v[a[i]].back();
update(l+,r,,,n,);
v[a[i]].pb(i);
l=v[a[i]][v[a[i]].size()-k];
r=v[a[i]].back();
update(l+,r,-,,n,);
}
else{
update(v[a[i]].back()+,i,-,,n,);
v[a[i]].pb(i);
if((int)v[a[i]].size()>k){
int l = v[a[i]][v[a[i]].size()-k];
update(,l,,,n,);
}
}
int L = ask(,n,);
ans=max(ans,max(,i-L+));
}
printf("%d\n",ans);
}
return ;
}
/*
7 5 2
3 1 5 2 5 2 3 */
HDU 6602 Longest Subarray (线段树)的更多相关文章
- 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$种颜色合法位置的交 ...
- hdu 5700区间交(线段树)
区间交 Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submiss ...
- Snacks HDU 5692 dfs序列+线段树
Snacks HDU 5692 dfs序列+线段树 题意 百度科技园内有n个零食机,零食机之间通过n−1条路相互连通.每个零食机都有一个值v,表示为小度熊提供零食的价值. 由于零食被频繁的消耗和补充, ...
- Hdu 3564 Another LIS 线段树+LIS
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission( ...
- HDU 5091---Beam Cannon(线段树+扫描线)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5091 Problem Description Recently, the γ galaxies bro ...
- HDU 1542 Atlantis(线段树扫描线+离散化求面积的并)
Atlantis Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
随机推荐
- js判断各种类型
js的六种基本类型:Object,Boolean,Number,String,Undefined,Null; Object中又有:Function,Array,Date... 如何判断数据类型? Ob ...
- 来吧,一文彻底搞懂Java中最特殊的存在——null
没事的时候,我并不喜欢逛 P 站,而喜欢逛 programcreek 这些技术型网站,于是那天晚上,在夜深人静的时候,我就发现了一个专注基础但不容忽视的主题.比如说:Java 中的 null 到底是什 ...
- YOLO V3训练自己的数据集
数据的输入几乎和Faster rcnn一样,标签格式xml是一样的. 相比Faster rcnn,数据多了一步处理,通过voc_annotation.py将图片路径和bbox+class存储在txt下 ...
- Spring--2.Spring之IOC--IOC容器的23个实验(2)
Spring--2.Spring之IOC--IOC容器的23个实验(1) 中的所有实验我都是在同一个工程中进行的,从第十个实验开始,我将新建一个新的工程开始实验. 目前导包还是跟第一个项目一致,bea ...
- Scala与Mongodb实践4-----数据库操具体应用
目的:在实践3中搭建了运算环境,这里学会如何使用该环境进行具体的运算和相关的排序组合等. 由数据库mongodb操作如find,aggregate等可知它们的返回类型是FindObservable.A ...
- Java 基础(一)| 使用泛型的正确姿势
前言 为跳槽面试做准备,今天开始进入 Java 基础的复习.希望基础不好的同学看完这篇文章,能掌握泛型,而基础好的同学权当复习,希望看完这篇文章能够起一点你的青涩记忆. 一.什么是泛型 泛型,即&qu ...
- 替代not in 和 in 的办法
在程序中,我们经常会习惯性的使用in和not in,在访问量比较小的时候是可以的,但是一旦数据量大了,我们就推荐使用not exists或者外连接来代替了.如果要实现一张表有而另外一张表没有的数据时, ...
- 序列化之二(将"\/Date(942289871000)\/"格式的时间替换成"yyyy-MM-dd HH:mm:ss"格式)
序列化就是一种用来处理对象流的机制.所谓对象流也就是将对象的内容进行流化,流的概念这里不用多说(就是I/O).我们可以对流化后的对象进行读写 操作,也可将流化后的对象传输于网络之间(注:要想将对象传输 ...
- python小功能记录
本博客会不断完善,记录python小功能. 1. 合并两个字典 # in Python 3.5+ >>> x = {'a': 1, 'b': 2} >>> y = ...
- python爬虫——selenium+chrome使用代理
先看下本文中的知识点: python selenium库安装 chrome webdirver的下载安装 selenium+chrome使用代理 进阶学习 搭建开发环境: selenium库 chro ...