HDU 6602 Longest Subarray (线段树)
题意:
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 (线段树)相关推荐
- HDU - 6602 Longest Subarray(线段树+思维)
题目链接:点击查看 题目大意:给出一个长度为 n 的序列,每个数字的范围是 [ 1 , C ] ,现在需要求一个子串,使得字串中的字母,要么出现 0 次,要么出现至少 K 次,问这个子串的最大长度是多 ...
- HDU6599多校第二场 Longest Subarray -- 线段树
http://acm.hdu.edu.cn/showproblem.php?pid=6602 题意:给出一个长度的为n的数字,其中数字都是1-C,即只有C种数,要求选出一个长度最大的区间,使得其中C个 ...
- hdu 3397 Sequence operation(线段树,lazy,区间合并)
hdu 3397 Sequence operation 线段树lazy和区间合并结合的一个题,相当于几个题集中到一起嘛,分开想就好了 0,1,2操作都要lazy,2的异或操作找到每一只含1或只含0的区 ...
- 2016 Multi-University Training Contest 10 [HDU 5861] Road (线段树:区间覆盖+单点最大小)...
HDU 5861 题意 在n个村庄之间存在n-1段路,令某段路开放一天需要交纳wi的费用,但是每段路只能开放一次,一旦关闭将不再开放.现在给你接下来m天内的计划,在第i天,需要对村庄ai到村庄bi的道 ...
- hdu 2871 Memory Control(线段树)
题目链接:hdu 2871 Memory Control 题目大意:模拟一个内存分配机制. Reset:重置,释放全部空间 New x:申请内存为x的空间,输出左地址 Free x:释放地址x所在的内 ...
- HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
Attack Time Limit: 5000/3000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others) Total Sub ...
- HDU 4262 Juggler (模拟+线段树优化)
转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove http://acm.hdu.e ...
- HDU 5669 Road(线段树建树)(分层图最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5669 [分析]线段树建树+分层图最短路 #include <cstdio> #includ ...
- HDU - I Hate It(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 Time Limit: 9000/3000 MS (Java/Others) Memory Li ...
- HDU - 3333 Turing Tree 线段树区间不同值和+详解+思想
传送门 首先第一次做这种求不同元素和的线段树题,猜想是个裸题.但是题目中有一句话显然给题目降低了很大的难度,就是 想想其实它就是在暗示你这道题你要结合多次询问来处理,也就是所谓的离线,而不是一次一次的 ...
最新文章
- Open Cascade DataExchange DXF
- 官方数据:5次SDN大会的背后
- 硬盘由于io设备错误无法运行此项请求_移动硬盘坏了真倒霉,祸不单行U盘也坏了,数据怎么存储才安全?...
- 华为交换机之SNMP管理
- 微信小程序通用功能设计和实现
- 如何快速的打造python 版的vim ide
- Sharepoint-拾贝
- iOS10 Xcode 8 中provisioning file 相关bug
- 解决办法:cv::randn(cv::_InputOutputArray const, cv::_InputArray const, cv::_InputArray const)’未定义的引用
- 【优化调度】基于matlab粒子群算法求解水火电系统经济、环境运行单目标调度优化问题【含Matlab源码 1138期】
- Oracle 11g RAC添加一节点过程
- projectwbs表_从Project 2007导出WBS图表到Visio 2007
- Ubuntu 配置 SFTP 服务器
- Matlab 极坐标平面 插值,如何在极坐标中进行插值
- QCA7000/QCA7005基于全志V3S Linux系统驱动移植
- 知识点总结之Java语言的优点
- 在声学技术这件事上,小米MIX 怎么就黑科技了?
- 974. 和可被 K 整除的子数组
- tpl怎么口_解决tplogin.cn打开是电信登录页面的办法是什么?
- 明日书院:毛笔字临帖注意六大章法关系 以尺牍为例