• BestCoder Round #29 GTY's gay friends


    #include <cstdio>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    using namespace std;
    const int MAX = 100000+10;
    int res[MAX<<2],ans[MAX],t[MAX];
    int a[MAX],last[MAX];
    struct node {
        int L,R,id,d;
        bool operator <(const node rhs) const {
            return R<rhs.R;
        }
    }v[MAX];
    void push_up(int o) {
       res[o]=max(res[o<<1],res[o<<1|1]);
    }
    void build(int L,int R,int o) {
        if(L==R) {
            res[o]=a[L];
            return ;
        }
        int mid=(L+R)>>1;
        build(L,mid,o<<1);
        build(mid+1,R,o<<1|1);
        push_up(o);
    }
    int Query1(int L,int R,int o,int ls,int rs) {
        if(ls<=L&&rs>=R) {
            return res[o];
        }

        int mid=(L+R)>>1;
        int tt=0;
        if(ls<=mid) tt=max(tt,Query1(L,mid,o<<1,ls,rs));
        if(rs>mid) tt=max(tt,Query1(mid+1,R,o<<1|1,ls,rs));
        return tt;
    }
    int sum[MAX];
    int lowbit(int x) {
        return x&-x;
    }
    void modify(int pos,int val) {
        for(int i=pos;i<MAX;i+=lowbit(i)) {
            sum[i]+=val;
        }
    }
    int Query(int pos) {
        int res=0;
        for(int i=pos;i;i-=lowbit(i)) {
            res+=sum[i];
        }
        return res;
    }
    int main() {
        int n,m;
        while(scanf("%d %d",&n,&m)==2) {
            for(int i=1;i<=n;i++) {
                scanf("%d",&a[i]);
            }
            build(1,n,1);
            for(int i=1;i<=m;i++) {
                scanf("%d %d",&v[i].L,&v[i].R) ;
                v[i].id=i;
                v[i].d=(v[i].R-v[i].L+1);
            }
            sort(v+1,v+1+m);
            memset(sum,0,sizeof(sum));
            memset(last,0,sizeof(last));
            int j=1;

            for(int i=1;i<=n;i++) {
                if(last[a[i]]) {
                    modify(last[a[i]],-1);
                }
                modify(i,1);
                last[a[i]]=i;
                while(i==v[j].R&&j<=m) {

                    ans[v[j].id]=Query(v[j].R)-Query(v[j].L-1);
                  //  printf("%d %d %d ",ans[v[j].id],v[j].d,Query1(1,n,1,v[j].L,v[j].R));
                    if(ans[v[j].id]==v[j].d&&Query1(1,n,1,v[j].L,v[j].R)==v[j].d) {
                        t[v[j].id]=1;
                    }
                    else t[v[j].id]=0;
                    j++;
                }
            }
            for(int i=1;i<=m;i++) {
                if(t[i]) printf("YES ");
                else printf("NO ");
            }
        }
        return 0;
    }
  • 相关阅读:
    设计师必备:来自顶级设计师的建议清单
    Qt 控制线程的顺序执行(使用QWaitCondition,并且线程类的run函数里记得加exec(),使得线程常驻)
    Qt 模拟鼠标点击(QApplication::sendEvent(ui->pushbutton, &event0);)
    利用Qt开发跨平台APP(二)(iOS,使用Qt5.9,很详细,有截图)
    C# RESTful API
    NET架构
    一个宏实现
    初步了解 Netty
    使用Rabbit MQ消息队列
    NET CORE与Spring Boot
  • 原文地址:https://www.cnblogs.com/acvc/p/4279701.html
Copyright © 2020-2023  润新知