http://acm.hdu.edu.cn/showproblem.php?pid=6602

题意:给出一个长度的为n的数字,其中数字都是1-C,即只有C种数,要求选出一个长度最大的区间,使得其中C个数,每一个出现的次数要不大于等于k要不等于0;

做法:这道题拿到的时候,就在想肯定是nlogn的复杂度过的,但是就是不知道该用什么数据结构维护。

下来看了题解,没有看懂,然后看了标程没看懂,今天早上重新看了看,终于大概明白是怎么个意思了。

首先我们对于每一个,我们讨论区间。此时

如果j==i则 对于区间来说,满足条件的数只有C-1个数。因为有C-1个没有出现满足出现的次数等于0,而另外那个出现的次数小于k因此只有C-1个数满足题意的条件。

然后j不断向前更新。

如果j<i,我们前面这个区间有多少数,小于k则有多少个数不满足条件,直到遇到一个数出现了k次,则此时这个区间满足条件的数加1

我们可以模拟一下样例的前几步:

num:            2        2 1       2 1 4       2 1 4 1       2 1 4 1 4      2 1 4 1 4 3       2 1 4 1 4 3 2

满足条件的个数:3        2 3       1 2 3       2 3 2 3       3 4 3 2 3      2 3 2 1 2 3       3 2 1 0 1 2 3

就和上面一样,如果对于每一个i都这样枚举j,这复杂度就到了n^2了

但不过你会发现对于新加入的一个数,他每一次都只改变一些区间的值,那就是上一次他出现的位置t1开始到i,即[t1+1,i],而且都是减一,以及他本来的这个位置,加上他的前第k个位置到第k-1个位置开始。这样我们就可以使用线段数维护区间信息。然后每一次询问一个最前面的值为C的位置,就可以了,这个线段树,写的时候小心一点。

对于k=1这个就不说了

#include "bits/stdc++.h"using namespace std;
const double eps = 1e-8;
#define reg register
#define lowbit(x) x&-x
#define pll pair<ll,ll>
#define pii pair<int,int>
#define fi first
#define se second
#define makp make_pairint dcmp(double x) {if (fabs(x) < eps) return 0;return (x > 0) ? 1 : -1;
}typedef long long ll;
typedef unsigned long long ull;
const ull hash1 = 201326611;
const ull hash2 = 50331653;
const int N = 100000 + 10;
const int M = 1000 + 10;
const int inf = 0x3f3f3f3f;
const ll mod = 998244353;
int val[N << 2], pos[N << 2], lazy[N << 2];
vector<int> v[N];
int n, c, k;void build(int o, int l, int r) {val[o] = lazy[o] = 0;pos[o] = l;if (l == r) return;int mid = (l + r) >> 1;build(o << 1, l, mid);build(o << 1 | 1, mid + 1, r);
}void pushdown(int o) {if (!lazy[o]) return;lazy[o << 1 | 1] += lazy[o];lazy[o << 1] += lazy[o];val[o << 1 | 1] += lazy[o];val[o << 1] += lazy[o];lazy[o] = 0;
}void pushup(int o) {val[o] = max(val[o << 1], val[o << 1 | 1]);if (val[o << 1] >= val[o << 1 | 1]) pos[o] = pos[o << 1];else pos[o] = pos[o << 1 | 1];
}void update(int o, int l, int r, int ql, int qr, int x) {if (ql > qr) return;if (l >= ql && r <= qr) {lazy[o] += x, val[o] += x;return;}pushdown(o);int mid = (l + r) >> 1;if (ql <= mid) update(o << 1, l, mid, ql, qr, x);if (qr > mid) update(o << 1 | 1, mid + 1, r, ql, qr, x);pushup(o);
}int query(int o, int l, int r, int ql, int qr) {if (val[o] != c) return 0;if (l >= ql && r <= qr) return pos[o];pushdown(o);int mid = (l + r) >> 1;if (ql <= mid) {int t = query(o << 1, l, mid, ql, qr);if (t) return t;}if (qr > mid) return query(o << 1 | 1, mid + 1, r, ql, qr);
}int main() {while (~scanf("%d%d%d", &n, &c, &k)) {for (int i = 1; i <= c; i++) {v[i].clear();v[i].push_back(0);}build(1, 1, n);int x, ans = 0;for (int i = 1; i <= n; i++) {scanf("%d", &x);update(1, 1, n, i, i, c - 1);update(1, 1, n, v[x].back() + 1, i - 1, -1);v[x].push_back(i);int p = v[x].size() - k;if (p >= 1) update(1, 1, n, v[x][p - 1] + 1, v[x][p], 1);int t = query(1, 1, n, 1, i);if (t != 0) ans = max(ans, i - t + 1);}printf("%d\n", ans);}return 0;
}

HDU6599多校第二场 Longest Subarray -- 线段树相关推荐

  1. HDU - 6602 Longest Subarray(线段树+思维)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,每个数字的范围是 [ 1 , C ] ,现在需要求一个子串,使得字串中的字母,要么出现 0 次,要么出现至少 K 次,问这个子串的最大长度是多 ...

  2. Boundary(2020多校第二场B)

    Boundary(2020多校第二场B) 文章目录 题意: 题解: 思路1: 代码: 思路二 代码 题意: 坐标平面有n个点(不与原点(0,0)重复),现考虑一个圆,(0,0)点在圆的边界,问这个圆的 ...

  3. 牛客多校第二场补题(继续罚坐)

    牛客多校第二场(继续罚坐场) Draw Grids ZYT和LBC玩游戏,在4*4的矩阵中,从起点开始,每个人只能连一条直线,且只能在起点或者上一个人的终点位置连上这个位置相邻的一条直线,并且不能形成 ...

  4. Fake Maxpooling(2020多校第二场F)

    Fake Maxpooling(2020多校第二场F) 文章目录 题意: 题解: 代码: 题意: 一个n * m的矩阵,第i行第j列的值是lcm(i,j),然后给定一个 k * k的子矩阵(k< ...

  5. Duration(2020多校第二场D)

    Duration(2020多校第二场D) 文章目录 题意 题解 代码 首先,非常感谢出题人出这个题,避免了我全wa的尴尬 题意 求两个时间相差多少秒,两个时间为同一天 题解 全部转化成秒,然后求差 代 ...

  6. 2021牛客暑假多校第二场 K题—Stack (链表)

    2021牛客暑假多校第二场 K题-Stack 题意: 一个单调栈,给你第n次操作时里面数据的数量,让你给出里面塞入的会是哪些数字. 主要思想:链表模拟 (代码里面有注释) (题解一开始说的是拓扑,后来 ...

  7. 20190724杭电多校第二场

    没有补题..倒是又想到了1002的二分做法,比原来好写了不少,也快了不少. #include<bits/stdc++.h> using namespace std; #define p_b ...

  8. 【多校训练】2021牛客多校第二场

    [前言] 这是打的第二场,rk39,但是AB这两个比较简单的题都没做emm,大概还是磨合的不够.然后感觉对于阈值类的东西还不是很敏感,应该看到不太好做就直接去想这种阈值的.校内3/9(然后就开启了常年 ...

  9. HDU 2020 多校第二场 游记

    咕了整整一天才来写 2333 这次邓老师没来 /kk,不过打的还算不错,可惜还是有一题没调出来,不然就是 11 题队了 /ll 1001 题意好像有点奇怪,不过 djq 还是一眼看对了,拿了这题一血. ...

最新文章

  1. stream测试内存_.net core百万设备连接服务和硬件需求测试
  2. 各种语言速度之比,实验验证Cgojuliajavapythonoctave
  3. java--JVM--栈帧--JVM及其优化---逃逸技术(堆栈分配方法)(转载)
  4. 与python相关计算机基础知识
  5. Silverlight网络寻奇 at 090413
  6. Atitti 编程语言高级 api 与高级知识 堆栈api 异常api Meta anno注解元数据api Ref 反射api Database meta api 字节码库如果你正在编写一个框架或者
  7. 软件工程专业的论文答辩_软件工程论文答辩开场白范例
  8. 【MMD】MikuMikuDance入门教程|下载模型动作相机场景音乐借物表
  9. win7装sql2000找不到服务器,Win7怎么正确安装使用sql2000教程
  10. 用java做出长方体的表面积_计算长方体、四棱锥的表面积和体积(Java)acm.sdut...
  11. 「咕咕网校 - 基础省选」树上问题的进阶 by Drench
  12. 喜讯 | 哈特公寓荣誉获最佳新锐公寓奖
  13. cursor: not-allowed; readonly的升级版,鼠标经过时,显示为禁止图标
  14. MSDC 4.3 接口规范(16)
  15. android设备连接win10,win10手机连接Android设备、iphone 操作方法
  16. 计算机软考证书全面分析
  17. matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色
  18. FATE —— 二.3.2 Hetero-NN使用CustModel设置顶部、底部模型
  19. 请求一次服务器会显示请求了两次,在Appengin中,每个请求都会到达服务器两次...
  20. 【YoLov5实战】记录一次不太成功的实战,足球场人物识别

热门文章

  1. html 设置流星效果,如何使用html实现流星雨的效果(代码)
  2. Abp.io(vNext)开发日志:单页面应用与外部/社交登录
  3. 计算机类双万计划院校,2021双一流高校名单公布排序-附2020入选双万计划大学名单...
  4. Flot柱状图如何并列显示
  5. Ae 表达式语言引用​:Global
  6. Ae 表达式语言引用​之:Property
  7. Mac使用CMake编译stasm
  8. lazarus解决三角形凑边长问题
  9. apex声音断断续续_【游戏耳机佩戴】_摘要频道_什么值得买
  10. 《数字短片创作(修订版)》——主题