题意:给定一个长为n的序列,第i个数a[i]都是一个[1,c]中的整数

如果一段序列[l,r]中出现过的数字出现次数都>=K则称其为好的序列

求最长的好的序列的长度

n,k,c,a[i]<=1e5

思路 :考虑固定右端点,对于每种数字来说合法的左端点都是两段

将对于每种数字来说合法的左端的位置都+1,则和为c的位置都是合法的,显然取最小的左端点

右端点右移的时候推一下左端点如何移动,用一个vector存每种数字出现的位置,往前k个就直接下标减k

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,ll>P;
#define N 100010
#define M 200010
#define fi first
#define se second
#define MP make_pair
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1 const ll MOD=1e9+,inv2=(MOD+)/;
double eps=1e-;
int INF=<<;
ll inf=5e13;
int dx[]={-,,,};
int dy[]={,,-,}; int mx[N<<],tag[N<<],pos[N<<],n,C,k;
VI c[N]; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void pushup(int p)
{
if(mx[ls]>=mx[rs])
{
mx[p]=mx[ls];
pos[p]=pos[ls];
}
else
{
mx[p]=mx[rs];
pos[p]=pos[rs];
}
} void pushdown(int p)
{
if(tag[p]!=)
{
tag[ls]+=tag[p];
tag[rs]+=tag[p];
mx[ls]+=tag[p];
mx[rs]+=tag[p];
tag[p]=;
}
} void build(int l,int r,int p)
{
mx[p]=tag[p]=;
pos[p]=l;
if(l==r) return;
int mid=(l+r)>>;
build(l,mid,ls);
build(mid+,r,rs);
} void update(int l,int r,int x,int y,int v,int p)
{
if(l>r) return;
if(x>y) return;
if(x<=l&&r<=y)
{
mx[p]+=v;
tag[p]+=v;
return;
}
pushdown(p);
int mid=(l+r)>>;
if(x<=mid) update(l,mid,x,y,v,ls);
if(y>mid) update(mid+,r,x,y,v,rs);
pushup(p);
} int query(int l,int r,int x,int y,int p)
{
if(l>r) return ;
if(x>y) return ;
if(mx[p]!=C) return ;
if(x<=l&&r<=y) return pos[p];
pushdown(p);
int mid=(l+r)>>;
int res=query(l,mid,x,y,ls);
if(res) return res;
return query(mid+,r,x,y,rs);
}
int main()
{
while(scanf("%d%d%d",&n,&C,&k)!=EOF)
{
build(,n,);
rep(i,,C)
{
c[i].clear();
c[i].push_back();
}
int ans=;
rep(i,,n)
{
//printf("i=%d\n",i);
int x=read();
update(,n,i,i,C-,);
update(,n,c[x].back()+,i-,-,);
c[x].push_back(i);
int now=(int)c[x].size()-k-;
if(now>=) update(,n,c[x][now]+,c[x][now+],,);
int j=query(,n,,i,);
if(j) ans=max(ans,i-j+);
}
printf("%d\n",ans);
} return ;
}

最新文章

  1. DirectX基础 常用函数语句
  2. 基于PHP以及Mysql,使用WordPress搭建站点
  3. Orchard使用中的坎坎坷坷
  4. 【Django】Apache上运行多个Django项目
  5. IE7下position:relative的问题
  6. Python天天美味(15) - Python正则表达式操作指南(re使用)(转)
  7. nodejs 微信中使用file组件上传图片在某些机型上点击无反应
  8. linux下的openoffice安装和服务自启动
  9. BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )
  10. MySQL优化之表结构优化的5大建议(数据类型选择讲的很好)
  11. Oracle 触发器的使用
  12. Do you have an English name? 你有英文名吗?
  13. springboot项目利用Swagger2生成在线接口文档
  14. 深度解析使用CSS单位px、em、rem、vh、vw、vmin、vmax实现页面布局
  15. vetur插件提示 [vue-language-server] Elements in iteration expect to have &#39;v-bind:key&#39; directives错误的解决办法
  16. dockerfile 介绍
  17. Vxlan学习笔记——原理(转)
  18. layer弹出层的iframe页面回调
  19. DP Training(Updating)
  20. Unix环境高级编程(十六)进程间通信

热门文章

  1. sqlalchemy.exc.IntegrityError: (mysql.connector.errors.IntegrityError) 1062 (23000): Duplicate entry &#39;1&#39; for key &#39;PRIMARY&#39;
  2. applicationContext.xml无错有红叉,Error occured processing XML &#39;Provider org.apache.xerces.parsers.解决方案
  3. input只输入数字和小数后两位
  4. Web安全测试——常见的威胁攻防
  5. CentOS安装Prolog和Erlang语言
  6. 最短路 dijkstra算法
  7. [BZOJ 3307]Cow Politics (LCA)
  8. Python自学第二天学习之《列表》
  9. python学习第十一天列表的分片和运算
  10. P2324 [SCOI2005]骑士精神(A*)