acdream 1427

来源:互联网 发布:算命的为何准 知乎 编辑:程序博客网 时间:2024/06/14 09:40

题意:短 略

解法:线段树单点更新 区间查询 

#include<cstdio>#include<string.h>#include<iostream>#include<limits.h>using namespace std;#define MAXN 200100#define ls (rt<<1)#define rs (rt<<1|1)#define mid ((l+r)>>1)int sum[MAXN<<2],num[MAXN],co[MAXN],n,lim;inline void ins(int rt,int l,int r,int pos,int w){    if(l==r){sum[rt]+=w;return ;}    if(pos<=mid)ins(ls,l,mid,pos,w);    if(mid<pos)ins(rs,mid+1,r,pos,w);    sum[rt]=min(sum[ls],sum[rs]);}inline int query(int rt,int l,int r,int L,int R){    if(L<=l&&r<=R)return sum[rt];    int ans=INT_MAX;    if(L<=mid)ans=min(ans,query(ls,l,mid,L,R));    if(mid<R)ans=min(ans,query(rs,mid+1,r,L,R));    return ans;}int main(){    while(~scanf("%d%d",&n,&lim)){        int _=0;        for(int i=1;i<=n;i++)            scanf("%d",&num[i]);        memset(sum,0,sizeof sum);memset(co,0,sizeof co);                for(int i=1;i<=n;i++){            co[num[i]]++;            ins(1,0,n,num[i],1);            if(num[i]==0){_++;continue;}                        if(query(1,0,n,0,num[i]-1)<co[num[i]]-lim) break;            _++;        }                printf("%d\n",_);    }}


0 0
原创粉丝点击