zoukankan      html  css  js  c++  java
  • ACdream 1427 Nice Sequence

    主题链接:http://115.28.76.232/problem?

    pid=1427


    Nice Sequence

    Time Limit: 12000/6000MS (Java/Others)Memory Limit: 128000/64000KB (Java/Others)

    Problem Description

          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.

    Input

          The first line of the input file contains n and k (1 ≤ n ≤ 200 000, 0 ≤ k ≤ 200 000). The second line contains n integer numbers ranging from 0 to n.

    Output

          Output the greatest l such that the sequence a1, a2,..., al is k-nice.

    Sample Input

    10 1
    0 1 1 0 2 2 1 2 2 3
    2 0
    1 0
    

    Sample Output

    8
    0
    

    Source

    Andrew Stankevich Contest 23

    Manager



    用线段树维护 0到A[i]-1间的最小值。用F[A[i]] 统计频率。推断 0 到 A[i]-1范围内的最小值与F[A[i]]-K的大小就可以。

    //#pragma comment(linker, "/STACK:36777216")
    #include <functional>
    #include <algorithm>
    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <iomanip>
    #include <numeric>
    #include <cstring>
    #include <climits>
    #include <cassert>
    #include <complex>
    #include <cstdio>
    #include <string>
    #include <vector>
    #include <bitset>
    #include <queue>
    #include <stack>
    #include <cmath>
    #include <ctime>
    #include <list>
    #include <set>
    #include <map>
    using namespace std;
    #define LL long long
    #define MAXN 200100
    struct Node{
        int left,right,v;
    };Node Tree[MAXN<<2];
    void Build(int id,int left,int right){
        Tree[id].v=0;
        Tree[id].left=left;
        Tree[id].right=right;
        if(left==right) return;
        int mid=(left+right)>>1;
        Build(id<<1,left,mid);
        Build(id<<1|1,mid+1,right);
    }
    void Update(int id,int pos,int add){
        int left=Tree[id].left,right=Tree[id].right;
        if(left==right){
            Tree[id].v+=add;
            return;
        }
        int mid=(left+right)>>1;
        if(mid>=pos)
            Update(id<<1,pos,add);
        else
            Update(id<<1|1,pos,add);
       Tree[id].v=min(Tree[id<<1].v,Tree[id<<1|1].v);
    }
    int Query(int id,int Qleft,int Qright){
        int left=Tree[id].left,right=Tree[id].right;
        if(left>=Qleft && right<=Qright)
            return Tree[id].v;
        int mid=(left+right)>>1;
        if(mid>=Qright)
            return Query(id<<1,Qleft,Qright);
        else if(mid<Qleft)
            return Query(id<<1|1,Qleft,Qright);
        int r1=Query(id<<1,Qleft,Qright),r2=Query(id<<1|1,Qleft,Qright);
        return min(r1,r2);;
    }
    int A[MAXN];
    int F[MAXN];
    int main(){
        int N,K;
        while(~scanf("%d%d",&N,&K)){
            for(int i=1;i<=N;i++)
                scanf("%d",&A[i]);
            Build(1,0,N);
            memset(F,0,sizeof(F));
            int i;
            for(i=1;i<=N;i++){
                F[A[i]]++;
                Update(1,A[i],1);
                if(A[i]==0)    continue;
                int ans=Query(1,0,A[i]-1);
                if(ans<F[A[i]]-K) break;
            }
            printf("%d
    ",i-1);
        }
    }
    





    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    第12组 Beta冲刺(2/5)
    第12组 Beta冲刺(1/5)
    第12组 Alpha事后诸葛亮
    第12组 Alpha冲刺(6/6)
    第12组 Alpha冲刺(5/6)
    期末大作业(第十七小组)
    补交:第2次&第5次实践作业
    第6次实践作业 (第17小组)
    第4次实践作业
    第3次实践作业
  • 原文地址:https://www.cnblogs.com/yxwkf/p/4719905.html
Copyright © 2011-2022 走看看