杭电多校第二场1012 L - Longest Subarray ce 线段树
这题是真的秀。。。我服了。。。线段树用好了,感觉什么都可以写。。。
题目大意:给你一个串,问满足以下条件的子串中最长的是多长:对于每个数字,要么在这个子串没出现过,要么出现次数超过k次。
我们对于每一个位置i,肯定希望往左找到最远满足条件的,然后维护一个最大值,岂不美哉?
那么我们该如何找到最远满足条件的???那么又该维护一些什么东西?
我们维护一个数组t[],t[j]=m表示从i位往左到j位置,满足条件的个数(要么为0个,要么大于等于k个),用线段树维护。
对于每个一个位置i,我们需要在当前位置加上C-1,代表从当前点,区间长度为0
我们每次讨论t[i]的时候就是将i位置作为右端点,因为a[i]=x,所以除x以外的其他数,左端点都可以是i位置,因为[i,i]这个区间内只有x出现了1次,其他都是出现0次,出现0次的肯定是可行的,所以先加上C-1(-1是因为i位置是否为x的可行左端点还需要进一步讨论)
然后我们考虑从i位置的数a[i],由于第i位出现了a[i],那么造成了当前位置到上一个位置和a[i]相等值的位置,这个区间以前是可以的,但是现在变得不可以。我们需要
从上一个位置到这个的值全部-1,代表a[i],不再这个区间可用。并且,我们从当前位置往前的k个a[i]的位置的到前k-1个a[i]的位置,这个位置以前是不可用的,但是由于右边新增加了一个a[i],这个区间将由不可用变成可用,那么在区间内部应该+1,代表这个值原来不可用,现在可用。
#include<bits/stdc++.h>
#define LL long long
#define lson rt<<1
#define rson rt<<1|1
using namespace std;
const int maxx = 1e5+;
struct node{
int l,r;
int laze,cnt;
}tree[maxx<<];
int a[maxx];
int pre[maxx];
int n,c,k;
vector<int>G[maxx];
void push_down(int rt){
if (tree[rt].laze){
tree[lson].cnt+=tree[rt].laze;
tree[rson].cnt+=tree[rt].laze;
tree[lson].laze+=tree[rt].laze;
tree[rson].laze+=tree[rt].laze;
tree[rt].laze=;
}
}
void buildtree(int rt,int l,int r){
tree[rt].l=l;
tree[rt].r=r;
tree[rt].laze=;
tree[rt].cnt=;
if (l==r){
return;
}
int mid=(l+r)>>;
buildtree(lson,l,mid);
buildtree(rson,mid+,r);
}
void update(int rt,int ul,int ur,int w){
int l=tree[rt].l;
int r=tree[rt].r;
if(ul<=l && r<=ur){
tree[rt].cnt+=w;
tree[rt].laze+=w;
return ;
}
push_down(rt);
int mid=(l+r)>>;
if (ur<=mid){
update(lson,ul,ur,w);
}else if(ul>mid){
update(rson,ul,ur,w);
}else {
update(lson,ul,mid,w);
update(rson,mid+,ur,w);
}
tree[rt].cnt=max(tree[lson].cnt,tree[rson].cnt);
}
int query(int rt){
int l=tree[rt].l;
int r=tree[rt].r;
if(l==r){
return l;
}
push_down(rt);
int mid=(l+r)>>;
if(tree[lson].cnt==c){
return query(lson);
}else if(tree[rson].cnt==c){
return query(rson);
}else {
return -;
}
}
int main(){
while(~scanf("%d%d%d",&n,&c,&k)){
for(int i=;i<=c;i++){
G[i].clear();
G[i].push_back();
}
memset(pre,,sizeof(pre));
for (int i=;i<=n;i++){
scanf("%d",&a[i]);
G[a[i]].push_back(i);
}
buildtree(,,n);
if(k==){
printf("%d\n",n);
continue;
}
int ans=;
for (int i=;i<=n;i++){
int x=a[i];
int p=++pre[a[i]];
update(,i,i,c-);
if(G[a[i]][p-]+<=G[a[i]][p]-)
update(,G[a[i]][p-]+,G[a[i]][p]-,-);
if(p>=k)
update(,G[a[i]][p-k]+,G[a[i]][p-k+],);
int pos=query();
if(pos!=-){
ans=max(ans,i-pos+);
}
}
printf("%d\n",ans);
}
return ;
}
杭电多校第二场1012 L - Longest Subarray ce 线段树的更多相关文章
- 2019年杭电多校第二场 1012题Longest Subarray(HDU6602+线段树)
题目链接 传送门 题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于\(K\). 思路 我们通过固定右端点考虑每个左端点的情况. 首先对于每个位置,我们用线段树来维护它作为\(C\)种元素 ...
- 2018 Multi-University Training Contest 2 杭电多校第二场
开始逐渐习惯被多校虐orz 菜是原罪 1004 Game (hdoj 6312) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6312 虽然披着 ...
- 2019杭电多校第二场hdu6602 Longest Subarray(线段树)
Longest Subarray 题目传送门 解题思路 本题求一个最大的子区间,满足区间内的数字要么出现次数大于等于k次,要么没出现过.给定区间内的数字范围是1~c. 如果r为右边界,对于一种数字x, ...
- 杭电多校第二场 hdu 6315 Naive Operations 线段树变形
Naive Operations Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 502768/502768 K (Java/Other ...
- [2019杭电多校第二场][hdu6602]Longest Subarray(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6602 题目大意为求最长的区间,满足C种数字在区间内要么不出现,要么出现的次数都不小于K. 大致的分析一 ...
- 2019杭电多校第二场hdu6601 Keen On Everything But Triangle
Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...
- 杭电多校第二场 1005 hack it
题意: 构造一个n*n 的 01 矩阵, 0 < n < 2001, 矩阵需要满足没有一个子矩阵的4个角都是1,并且矩阵内1的个数至少有85000个. 题解:数论构造题 参考From 代 ...
- [2019杭电多校第二场][hdu6601]Keen On Everything But Triangle
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6601 题意是说用给定区间内的数字组成周长最大的三角形. 大致做法就是求区间第1大,第2大和第3大然后判 ...
- [2019杭电多校第二场][hdu6599]I Love Palindrome String(回文自动机&&hash)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6599 题目大意为求字符串S有多少个子串S[l,r]满足回文串的定义,并且S[l,(l+r)/2]也满足 ...
随机推荐
- 模板方法(Template Method)(父类声明算法骨架,子类具体不同实现)
在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...
- NOIP模拟17.10.12
T1 临江仙 旧梦 题目背景 闻道故园花陌,今年奼紫嫣红.扬帆直渡水千重.东君何解意,送我一江风. 还是昔时庭院,终得醉卧花丛.残更惊醒月明中.流光如旧岁,多少梦成空. 题目描述 #define go ...
- 考试总结 模拟27(W)
心得:太弱了,T1问题:理解错了题,矿石可以放到同一处,,太弱了,小凯的疑惑,没什么印象T2问题:拆式子T3问题:换根dp的思想模拟9T1+T2
- CTSC2017密钥、吉夫特
自己是有多么sb. 密钥 大家都说这是一道普及-的题,一年前我做不起,我可以说我太弱啦,我就普及组水平,今年我还是做不起…… 看大佬题解都是:开个桶就好啦! 我:你在说什么…… 首先把环拉成链,倍长. ...
- AutoDesk产品,Maya 2018 安装,Microsoft Visual C++ 2012 安装失败,结果 = -2147024546,安装Microsoft Visual C++ 2012 Redistributable 错误0x80070005 等等
今日老弟装Maya 2018出现问题,我帮忙解决了一下问题,过程颇为曲折,记录一下,看能否帮到有类似困惑的朋友. 我和老弟的电脑牌子一样,就现在自己电脑上装了,竟然开始和他的错误是一样的!都是Micr ...
- 【POJ 3261】Milk Patterns
[链接]h在这里写链接 [题意] 给你一个长度为n的序列. 问你能不能在其中找到一个最长的子串. 这个子串至少出现了k次. [题解] 长度越长,就越不可能出现k次 后缀数组+二分. N最大为2 ...
- CSS权值比较(读书笔记)
1.继承0.1 标签1 类选择符10 ID选择符100 2.层叠:后面的样式会覆盖前面的样式. 3.内联样式表(标签内部) > 嵌入样式表(当前文件中) > 外部样式(外 ...
- LaTeX Error: File `slashbox.sty' not found. 解决办法
从这里下载对应的文件,解压后把文件放在C:\Latex\2018\texmf-dist\tex\latex 中. 再打开cmd命令窗口,输入texhash刷新!
- Android Bitmap缓存介绍
转载自http://blog.csdn.net/linghu_java/article/details/8595717 Android中加载一个Bitmap(位图)到你的UI界面是非常简单的,但是如果 ...
- Directx11教程40 纹理映射(10)
原文:Directx11教程40 纹理映射(10) 本章尝试使用纹理行列式,或者说纹理数组,在ps中,使用2个纹理,最终的像素颜色,是光照颜色*纹理1采样颜色*纹理2采样颜色,主要是想达到如 ...