题意:

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|1using 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-6;
const int mod = 1e9+7;
const int maxn = 2e5+100;
const int maxm = 4e6+100;
const int inf = 0x3f3f3f3f;
const db pi = acos(-1.0);int n,c,k;
int a[maxn];
vector<int>v[maxn];
int mx[maxn<<2];
int addv[maxn<<2];
void build(int l, int r, int root){int mid = (l+r)>>1;if(l==r){mx[root]=c;return;}build(lson);build(rson);mx[root]=max(mx[lc],mx[rc]);addv[root]=0;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]=0;}return;
}
void update(int x, int y, int val, int l, int r, int root){int mid = (l+r)>>1;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)>>1;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 = 1; i <= n; i++){v[i].clear();v[i].pb(0);}for(int i = 1; i <= n; i++){scanf("%d", &a[i]);}build(1,n,1);int ans = 0;for(int i = 1; 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+1,r,1,1,n,1);v[a[i]].pb(i);l=v[a[i]][v[a[i]].size()-k];r=v[a[i]].back();update(l+1,r,-1,1,n,1);}else{update(v[a[i]].back()+1,i,-1,1,n,1);v[a[i]].pb(i);if((int)v[a[i]].size()>k){int l = v[a[i]][v[a[i]].size()-k];update(1,l,1,1,n,1);}}int L = ask(1,n,1);ans=max(ans,max(0,i-L+1));}printf("%d\n",ans);}return 0;
}
/*
7 5 2
3 1 5 2 5 2 3*/

转载于:https://www.cnblogs.com/wrjlinkkkkkk/p/11285401.html

HDU 6602 Longest Subarray (线段树)相关推荐

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

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

  2. HDU6599多校第二场 Longest Subarray -- 线段树

    http://acm.hdu.edu.cn/showproblem.php?pid=6602 题意:给出一个长度的为n的数字,其中数字都是1-C,即只有C种数,要求选出一个长度最大的区间,使得其中C个 ...

  3. hdu 3397 Sequence operation(线段树,lazy,区间合并)

    hdu 3397 Sequence operation 线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了 0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区 ...

  4. 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...

    HDU 5861 题意 在n个村庄之间存在n-1段路,令某段路开放一天需要交纳wi的费用,但是每段路只能开放一次,一旦关闭将不再开放.现在给你接下来m天内的计划,在第i天,需要对村庄ai到村庄bi的道 ...

  5. hdu 2871 Memory Control(线段树)

    题目链接:hdu 2871 Memory Control 题目大意:模拟一个内存分配机制. Reset:重置,释放全部空间 New x:申请内存为x的空间,输出左地址 Free x:释放地址x所在的内 ...

  6. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)

    Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Sub ...

  7. HDU 4262 Juggler (模拟+线段树优化)

    转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526       by---cxlove http://acm.hdu.e ...

  8. HDU 5669 Road(线段树建树)(分层图最短路)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5669 [分析]线段树建树+分层图最短路 #include <cstdio> #includ ...

  9. HDU - I Hate It(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Time Limit: 9000/3000 MS (Java/Others) Memory Li ...

  10. HDU - 3333 Turing Tree 线段树区间不同值和+详解+思想

    传送门 首先第一次做这种求不同元素和的线段树题,猜想是个裸题.但是题目中有一句话显然给题目降低了很大的难度,就是 想想其实它就是在暗示你这道题你要结合多次询问来处理,也就是所谓的离线,而不是一次一次的 ...

最新文章

  1. Open Cascade DataExchange DXF
  2. 官方数据:5次SDN大会的背后
  3. 硬盘由于io设备错误无法运行此项请求_移动硬盘坏了真倒霉,祸不单行U盘也坏了,数据怎么存储才安全?...
  4. 华为交换机之SNMP管理
  5. 微信小程序通用功能设计和实现
  6. 如何快速的打造python 版的vim ide
  7. Sharepoint-拾贝
  8. iOS10 Xcode 8 中provisioning file 相关bug
  9. 解决办法:cv::randn(cv::_InputOutputArray const, cv::_InputArray const, cv::_InputArray const)’未定义的引用
  10. 【优化调度】基于matlab粒子群算法求解水火电系统经济、环境运行单目标调度优化问题【含Matlab源码 1138期】
  11. Oracle 11g RAC添加一节点过程
  12. projectwbs表_从Project 2007导出WBS图表到Visio 2007
  13. Ubuntu 配置 SFTP 服务器
  14. Matlab 极坐标平面 插值,如何在极坐标中进行插值
  15. QCA7000/QCA7005基于全志V3S Linux系统驱动移植
  16. 知识点总结之Java语言的优点
  17. 在声学技术这件事上,小米MIX 怎么就黑科技了?
  18. 974. 和可被 K 整除的子数组
  19. tpl怎么口_解决tplogin.cn打开是电信登录页面的办法是什么?
  20. 明日书院:毛笔字临帖注意六大章法关系 以尺牍为例

热门文章

  1. 安装配置管理 之 安装和配置 JPackage Java
  2. 调用sklearn包中的PLA算法[转载]
  3. AWStats日志分析部署
  4. 【SQL Server】CONVERT() 函数
  5. WebSocket和WebRtc的一些心得
  6. noip2009 普及组
  7. jquery的validate的用法
  8. asp.net获取服务器信息
  9. 驰骋工作流引擎-自由表单
  10. 两列float引起的父容器高度失效的解决办法