zoukankan      html  css  js  c++  java
  • pyy整队 线段树

    pyy整队 线段树

    问题描述:

    众所周知pyy当了班长,服务于民。一天体育课,趁体育老师还没来,pyy让班里n个同学先排好 队。老师不在,同学们开始玩起了手机。站在队伍前端玩手机,前面的人少了,谁都顶不住。于是陆陆 续续有人往队伍最后躲去,但大家都沉迷某骗氪手游,忘记了老师说前面位置有空缺要补齐的要求。一 些同学还时不时地低头问向指挥队伍的班长pyy,排在自己前面成绩最好的同学是谁,这样自己才能心 安理得放心大胆的继续玩手机。 这时老师来了,同学们在可以忽略不计的时间内收好了手机。看着到处充满空缺的队伍,体育老 师勃然大怒并借题发挥,以扬体育组声威,限pyy以最快的时间整顿队伍。由于是体育老师,并看不出 来队伍的位置后移了,老师只关心队伍是否整齐没有空缺。 老师给了pyy一次移动一名同学的权力,因此pyy无法使用技能“向前看齐”。pyy的哥哥强制要求 你帮助pyy回答之前同学们的问题,并告诉pyy在老师来之后,至少移动多少个同学可以使队伍整齐。

    输入格式

    第一行为两个整数(n,m(1le n,m le 1e5)),表示有(n)位同学,在老师来之前进行了(m)次小动作。

    第二行为(n)个以空格隔开的整数(a_1,a_2,cdots a_n(1le a_i le 1e7)),表示初始时队伍中第(i)位同学的 年级成绩排名(数据保证不会有两人成绩重复)。

    接下来(m)行描述同学们的行为,每行由一个字符(A)(S)和一个整数(x)构成。若为(A x),则表示年级成绩排名为(x)的同学向pyy询问自己前面成绩最好的是哪位同学;若为(M x),则表 示年级成绩排名为(x)的同学此时躲到了当前队伍的最尾端(不存在队尾同学躲向队尾)。

    输出格式

    (m)个操作中对于每个同学的询问,顺序输出所询问同学的年级成绩排名,并以换行隔开。若询问 学生不存在则输出(-1)
    最后一行输出至少移动多少位同学,使得队伍整齐。

    还是比较简单的线段树题。

    对于操作直接用线段树搞就是了,维护一棵下标为队列位置的线段树,对(A)操作我们直接查询([1,pos[x]])即可,对于(M)我们将原位置单点修改为(INF),在队尾修改为(x)即可。

    麻烦的是最后一个询问,首先肯定不能统计空格数(废话),而是要用一个长度为(n)的窗口扫一遍,每次统计需要移动的同学数量来更新答案。考试时打死想不出来,以为还要套个DP,是我太蒻了

    在最后查询队列所有位置状态时,直接写的暴力query(O(nlog_n))反正也不会TLE,其实可以直接一次(O(n))查询所有叶节点,懒得写了

    #include <cstdio>
    #include <algorithm>
    #define MAXN 100010
    using namespace std;
    inline int read(){
        char ch=getchar();int s=0;
        while(ch<'0'||ch>'9') ch=getchar();
        while(ch>='0'&&ch<='9') s=s*10+(ch^'0'), ch=getchar();
        return s;
    }
    int n,m,s;
    int a[MAXN],a_sort[MAXN];
    int idx[MAXN];
    int qlast;
    int pos[MAXN*2];
    #define INF 0x3f3f3f3f
    #define sl (x<<1)
    #define sr (x<<1|1)
    int tre[MAXN*2*4];
    void buildt(int x, int l, int r){
        tre[x]=INF;
        if(l==r) return;
        int mid=(l+r)>>1;
        buildt(sl, l, mid);
        buildt(sr, mid+1, r);
    }
    void change(int x, int l, int r, int pos, int val){
        if(l==r){
            tre[x]=val;
            return;
        }
        int mid=(l+r)>>1;
        if(pos<=mid) change(sl, l, mid, pos, val);
        else change(sr, mid+1, r, pos, val);
        tre[x]=min(tre[sl], tre[sr]);
    }
    int query(int x, int l, int r, int ql, int qr){
        if(ql>qr) return INF;
        if(ql<=l&&r<=qr){
            return tre[x];
        }
        int mid=(l+r)>>1;
        int res=INF;
        if(ql<=mid) res=min(res, query(sl, l, mid, ql, qr));
        if(mid<qr) res=min(res, query(sr, mid+1, r, ql, qr));
        return res;
    }
    int cnt[MAXN];
    int val[MAXN*2];
    int main(){
        //freopen("queue.in", "r", stdin);
        //freopen("queue.out", "w", stdout);
        n=read(),m=read();
        for(int i=1;i<=n;++i) a[i]=a_sort[i]=read();
        sort(a_sort+1, a_sort+1+n);
        for(int i=1;i<=n;++i)
            idx[i]=lower_bound(a_sort+1, a_sort+1+n, a[i])-a_sort,
            pos[idx[i]]=i;
        buildt(1, 1, n*2);
        qlast=n+1;
        for(int i=1;i<=n;++i) change(1, 1, n*2, i, a[i]);
        while(m--) {
            char opt=getchar();
            while(opt!='A'&&opt!='M') opt=getchar();
            int t=read();
            if(opt=='A'){
                int tmp=lower_bound(a_sort+1, a_sort+1+n, t)-a_sort;
                int res=query(1, 1, n*2, 1, pos[tmp]-1);
                if(res==INF) puts("-1");
                else printf("%d
    ", res);
            }else if(opt=='M'){
                int tmp=lower_bound(a_sort+1, a_sort+1+n, t)-a_sort;
                change(1, 1, n*2, qlast, t);
                change(1, 1, n*2, pos[tmp], INF);
                pos[tmp]=qlast;
                ++qlast;
            }else puts("ERRO");
        }
        for(int i=1;i<=n*2;++i) val[i]=query(1, 1, n*2, i, i);
        int cnt=0;
        int ans=0x3f3f3f3f;
        for(int i=1;i<=n;++i)
            if(val[i]!=INF) ++cnt;
        for(int i=2;i+n<=n*2;++i) {
            if(val[i-1]!=INF) --cnt;
            if(val[i+n-1]!=INF) ++cnt;
            ans=min(ans, n-cnt);
        }
        printf("%d", ans);
        return 0;
    }
    
    
  • 相关阅读:
    Centos7yum安装LNMP
    CentOS7安装和配置rsync+inotify
    SSH
    nginx https
    nginx rewrite
    nginx代理缓存
    nginx动静分离
    Centos7使用squid实现正向代理
    利用tengine的nginx_upstream_check_module来检测后端服务状态
    nginx基于tcp负载均衡
  • 原文地址:https://www.cnblogs.com/santiego/p/11824104.html
Copyright © 2011-2022 走看看