Codeforces Round #426 (Div. 2) B The Festive Evening

来源:互联网 发布:php代码模板 编辑:程序博客网 时间:2024/06/06 04:09

对于每种字符,第一次出现的位置为起点,最后一次出现的位置为终点,构成一条线段。每种字符一条线段,求线段重叠,最多有多少个线段重叠,然后和k比较。线段树区间更新,然后查询最值

#include<bits/stdc++.h>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define mid (l+r)>>1const int MAXN = 1e6+10;int n,k;pair<int,int> ps[26];int sum[MAXN<<2];int col[MAXN<<2];void init(){    for(int i = 0; i < 26; ++i)    {        ps[i].first = MAXN;        ps[i].second = 0;    }}void pushdown(int rt){    if(col[rt])    {        sum[rt<<1]+=col[rt];        sum[rt<<1|1]+=col[rt];        col[rt<<1]+=col[rt];        col[rt<<1|1]+=col[rt];        col[rt]=0;    }}void pushup(int rt){    sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);}void update(int L, int R, int c, int l, int r, int rt){    if(L <= l && r <= R)    {        col[rt] += c;        sum[rt] += c;        return;    }    pushdown(rt);    int m=mid;    if(L<=m) update(L,R,c,lson);    if(R>m) update(L,R,c,rson);    pushup(rt);}int query(int L,int R,int l,int r,int rt){    if(L<=l&&r<=R)    {        return sum[rt];    }    pushdown(rt);    int m=mid, ret=0;    if(L<=m)    ret=max(ret,query(L,R,lson));    if(R>m)   ret=max(ret,query(L,R,rson));    return ret;}int main(){    init();    char ch;    int index;    scanf("%d %d",&n,&k);    getchar();    for(int i = 1; i <= n; ++i)    {        ch = getchar();        index = ch - 'A';        if(i < ps[index].first)            ps[index].first = i;        if(i > ps[index].second)            ps[index].second = i;    }    for(int i = 0; i < 26; ++i)    {        if(ps[i].first != MAXN)        {            update(ps[i].first,ps[i].second,1,1,n,1);        }    }    int res = query(1,n,1,n,1);    if(res > k)        printf("YES\n");    else        printf("NO\n");    return 0;}
阅读全文
0 0
原创粉丝点击