题目链接: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. 微信 PHP - SDK 包

    下载 个人公众号谢谢各位老铁支持

  2. 什么原因?全球许多网络提供商推迟部署IPv6

    全球许多网络提供商推迟部署IPv6,指出升级路由器和交换机的成本以及NAT为扩展IPv4地址所取得的令人印象深刻的成就. 这并没有阻止像澳门CTM这样的互联网服务供应商不要冒险,以此为榜样,并且满足终 ...

  3. sql server,mysql 和navicat for mysql的区别

    一.定义 sql server 应该指的是sqlserver数据库,包含数据库管理系统等. navicat for sql server只是一个sqlserver的第三方的开发工具,管理工具. 二.开 ...

  4. MongoDB的特殊操作

    相比关系型数据库, Array [1,2,3,4,5] 和 Object { 'name':'DragonFire' } 是MongoDB 比较特殊的类型了 特殊在哪里呢?在他们的操作上又有什么需要注 ...

  5. SSH自动登录脚本

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11926792.html vi app-stg.sh #!/usr/bin/expect -f #aut ...

  6. CDMA与OFDM之技术比较

    频谱利用率.支持高速率多媒体服务.系统容量.抗多径信道干扰等因素是目前大多数固定宽带无线接入设备商在选择CDMA(码分多址)或OFDM(正交 频分复用)作为点到多点(PMP)的关键技术时的主要出发点. ...

  7. rk3288-cc上编写一个hello world

    一.编写一个hello world驱动 懒,不写了 二.编写Kconfig和Makefile 我们在kernel/driver目录下创建一个hello目录 然后创建一个Kconfig文件: confi ...

  8. springboot-mybatis-demo遇到的坑

    目录 前言 问题&解决 1.初始化Maven工程过慢 2.Spring Boot 集成druid时时区问题和连接超时问题 3.完整工程下载 前言 环境: java version " ...

  9. [bzoj]2705: [SDOI2012]Longge的问题[数论][数学][欧拉函数][gcd]

    [bzoj]P2705 OR [luogu]P2303 Longge的问题 Description Longge的数学成绩非常好,并且他非常乐于挑战高难度的数学问题.现在问题来了:给定一个整数N,你需 ...

  10. 【bzoj4137】[FJOI2015]火星商店问题

    *题目描述: 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品,其标价可能 ...