标签:des style http color io os ar java for
Let us consider the sequence a1, a2,..., an of non-negative integer numbers. Denote as ci,j the number of occurrences of the number i among a1,a2,..., aj. We call the sequence k-nice if for all i1<i2 and for all j the following condition is satisfied: ci1,j ≥ ci2,j ?k.
Given the sequence a1,a2,..., an and the number k, find its longest prefix that is k-nice.
10 1 0 1 1 0 2 2 1 2 2 3 2 0 1 0
8 0
题解及代码:
比赛的时候是队友写的这道题,因为查询的时候要进行优化,所以给他加了一个线段树维护区间最小值就AC了。
今天看了一下这道题,感觉也不难。它的定义有些难懂啊,其实就是当我们从左向右输入到一个元素x时,要保证其左侧元素中1-(x-1)出现的次数大于等于 x的出现次数-k,找出这样的最长的前缀。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <set> #include <map> #include <queue> #include <string> #define maxn 200010 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 using namespace std; typedef long long ll; int a[200005]; struct segment { int l,r; int value; } son[maxn<<2]; void PushUp(int rt) { son[rt].value=min(son[rt<<1].value,son[rt<<1|1].value); } void Build(int l,int r,int rt) { son[rt].l=l; son[rt].r=r; if(l==r) { son[rt].value=0; return; } int m=(l+r)/2; Build(lson); Build(rson); PushUp(rt); } void Update(int p,int rt) { if(son[rt].l==son[rt].r) { son[rt].value++; return; } int m=(son[rt].l+son[rt].r)/2; if(p<=m) Update(p,rt<<1); else Update(p,rt<<1|1); PushUp(rt); } int Query(int l,int r,int rt) { if(son[rt].l==l&&son[rt].r==r) { return son[rt].value; } int ret=0; int m=(son[rt].l+son[rt].r)/2; if(r<=m) ret=Query(l,r,rt<<1); else if(l>m) ret=Query(l,r,rt<<1|1); else { ret=Query(lson); ret=min(ret,Query(rson)); } return ret; } int main() { int n,k,x,ans=0; bool flag=false; scanf("%d%d",&n,&k); Build(1,n+1,1); for(int i=1;i<=n;i++) { scanf("%d",&x); if(!flag) { x++; a[x]++; Update(x,1); if(Query(1,x,1)<a[x]-k) flag=true; if(!flag) ans=i; } } printf("%d\n",ans); return 0; }
标签:des style http color io os ar java for
原文地址:http://blog.csdn.net/knight_kaka/article/details/39852833