题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6602

题目大意为求最长的区间,满足C种数字在区间内要么不出现,要么出现的次数都不小于K。

大致的分析一下,可以知道对于以R为右端点的区间来说,每种颜色的合法区间在[1~出现k次]和(上一次出现~下一次出现)。PS:[]为闭区间,()为开区间。

所以可以线段树维护一下,枚举区间右端点,然后在线段树上将上一次更新这种颜色的操作撤销(上次是+1,则当前-1),然后再次更新(+1)。

对于每个区间右端点,最大的有效区间为线段树上种类为C的最左边的位置。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#define lson l,mid,i<<1
#define rson mid+1,r,i<<1|1
using namespace std;
typedef long long ll;
const int maxn = 2e5 + ;
const ll mod = ;
int Max[maxn * ], lazy[maxn * ];
vector<int>cnt[maxn];
int num[maxn];
int n, c, k;
void up(int i) {
Max[i] = max(Max[i << ], Max[i << | ]);
}
void down(int i) {
if (lazy[i]) {
lazy[i << ] += lazy[i];
lazy[i << | ] += lazy[i];
Max[i << | ] += lazy[i];
Max[i << ] += lazy[i];
lazy[i] = ;
}
}
void build(int l, int r, int i) {
Max[i] = lazy[i] = ;
if (l == r)
return;
int mid = l + r >> ;
build(lson);
build(rson);
up(i);
}
void update(int L, int R, int k, int l, int r, int i) {
if (L > R)return;
if (L <= l && r <= R) {
Max[i] += k;
lazy[i] += k;
return;
}
down(i);
int mid = l + r >> ;
if (L <= mid)update(L, R, k, lson);
if (R > mid)update(L, R, k, rson);
up(i);
}
int query(int l, int r, int i) {
if (l == r)return l;
int ans = -, mid = l + r >> ;
down(i);
if (Max[i << ] == c)ans = query(lson);
else if (Max[i << | ] == c)ans = query(rson);
return ans;
}
int a[maxn];
int main() {
while (scanf("%d%d%d", &n, &c, &k) != EOF) {
for (int i = ; i <= c; i++)
cnt[i].clear(), cnt[i].push_back(), num[i] = ;
for (int i = ; i <= n; i++) {
scanf("%d", &a[i]);
cnt[a[i]].push_back(i);
}
build(, n, );
for (int i = ; i <= c; i++) {
cnt[i].push_back(n + );
update(cnt[i][] + , cnt[i][] - , , , n, );
}
int ans = ;
for (int i = ; i <= n; i++) {
update(cnt[a[i]][num[a[i]]] + , cnt[a[i]][num[a[i]] + ] - , -, , n, );
if (num[a[i]] >= k)
update(, cnt[a[i]][num[a[i]] - k + ], -, , n, );
num[a[i]]++;
update(cnt[a[i]][num[a[i]]] + , cnt[a[i]][num[a[i]] + ] - , , , n, );
if (num[a[i]] >= k)
update(, cnt[a[i]][num[a[i]] - k + ], , , n, );
int q = query(, n, );
if (q != -)
ans = max(ans, i - q + );
}
printf("%d\n", ans);
}
}

[2019杭电多校第二场][hdu6602]Longest Subarray(线段树)的更多相关文章

  1. 2019杭电多校第二场hdu6602 Longest Subarray(线段树)

    Longest Subarray 题目传送门 解题思路 本题求一个最大的子区间,满足区间内的数字要么出现次数大于等于k次,要么没出现过.给定区间内的数字范围是1~c. 如果r为右边界,对于一种数字x, ...

  2. 2019杭电多校第二场hdu6601 Keen On Everything But Triangle

    Keen On Everything But Triangle 题目传送门 解题思路 利用主席树求区间第k小,先求区间内最大的值,再求第二大,第三大--直到找到连续的三个数可以构成一个三角形.因为对于 ...

  3. [2019杭电多校第二场][hdu6601]Keen On Everything But Triangle

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6601 题意是说用给定区间内的数字组成周长最大的三角形. 大致做法就是求区间第1大,第2大和第3大然后判 ...

  4. [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]也满足 ...

  5. [2019杭电多校第二场][hdu6598]Harmonious Army(最小割)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6598 题意是说一个军队有n人,你可以给他们每个人安排战士或者法师的职业,有m对人有组合技,组合技的信息 ...

  6. 2019牛客多校第二场E MAZE(线段树 + 矩阵)题解

    题意: n * m的矩阵,为0表示可以走,1不可以走.规定每走一步只能向下.向左.向右走.现给定两种操作: 一.1 x y表示翻转坐标(x,y)的0.1. 二.2 x y表示从(1,x)走到(n,y) ...

  7. 2018 Multi-University Training Contest 2 杭电多校第二场

    开始逐渐习惯被多校虐orz  菜是原罪 1004  Game    (hdoj 6312) 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6312 虽然披着 ...

  8. 2019年杭电多校第二场 1012题Longest Subarray(HDU6602+线段树)

    题目链接 传送门 题意 要你找一个最长的区间使得区间内每一个数出现次数都大于等于\(K\). 思路 我们通过固定右端点考虑每个左端点的情况. 首先对于每个位置,我们用线段树来维护它作为\(C\)种元素 ...

  9. 2019年杭电多校第二场 1008题Harmonious Army(HDU6598+最小割+建图)

    题目链接 传送门 题意 有\(n\)个士兵,要你给他们分配职业.有\(m\)对关系,对于某一对关系\(u,v\),如果同为勇士则总能力增加\(a\),同法师则增加\(c\),一个勇士一个法师增加\(\ ...

随机推荐

  1. Kali Linux的发展史,专为数字取证和渗透测试而设计

    Kali Linux拥有非常强大的网络功能,Kali Linux是一个Debian衍生的Linux发行版,专为数字取证和渗透测试而设计.它是由OffensiveSecurityLtd维护和资助,是由M ...

  2. selenium定位

    https://www.cnblogs.com/programer-xinmu78/p/10881766.html https://www.cnblogs.com/eastonliu/p/908830 ...

  3. vue项目中 指令 v-html 中使用过滤器filters功能

    转载于简书 链接:http://www.jianshu.com/p/29b7eaabd1ba 问题 2.0 filters only work in mustache tags and v-bind. ...

  4. Python内置函数之filter map reduce

    Python内置函数之filter map reduce 2013-06-04 Posted by yeho Python内置了一些非常有趣.有用的函数,如:filter.map.reduce,都是对 ...

  5. ESP8266-12F 中断

    外部中断: 基于ESP8266的NodeMcu的数字IO的中断功能是通过attachInterrupt,detachInterrupt函数所支持的.除了D0/GPIO16,中断可以绑定到任意GPIO的 ...

  6. docker-compose简介

    一.Docker-Compose简介   Docker-Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排.   Docker-Compose将所管理的容器分为三 ...

  7. 【bzoj1096】[ZJOI2007]仓库建设

    *题目描述: L公司有N个工厂,由高到底分布在一座山上.如图所示,工厂1在山顶,工厂N在山脚.由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用.突然有一天,L公司的总 ...

  8. 【bzoj1146】[CTSC2008]网络管理Network

    题目描述: M公司是一个非常庞大的跨国公司,在许多国家都设有它的下属分支机构或部门.为了让分布在世界各地的N个部门之间协同工作,公司搭建了一个连接整个公司的通信网络.该网络的结构由N个路由器和N-1条 ...

  9. SpringMVC传参注解@RequestParam,@RequestBody,@ResponseBody,@ModelAttribute

    参考文档:https://blog.csdn.net/walkerjong/article/details/7946109 https://www.cnblogs.com/daimajun/p/715 ...

  10. Mysql中主键与索引

    摘自: https://www.cnblogs.com/wicub/p/5898286.html 一.什么是索引?索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没 ...