zoukankan      html  css  js  c++  java
  • FOJ 1962 新击鼓传花游戏 线段树

    维护一个sum数组,有点划分树的思想,写过划分树的应该能看出来

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<stack>
    #include<cmath>
    #include<queue>
    #include<map>
    using namespace std;
    const int maxn=500005;
    int sum[maxn<<2],is[maxn];
    void pushup(int rt)
    {
        sum[rt]=sum[rt*2]+sum[rt*2+1];
    }
    void build(int rt,int l,int r)
    {
         if(l==r)
         {
             is[l]=sum[rt]=1;
             return;
         }
         int m=(l+r)>>1;
         build(rt*2,l,m);
         build(rt*2+1,m+1,r);
         pushup(rt);
    }
    void change(int rt,int l,int r,int pos,int c)
    {
        if(l==r)
        {
            sum[rt]=c;
            return;
        }
        int m=(l+r)>>1;
        if(pos<=m)change(rt*2,l,m,pos,c);
        else change(rt*2+1,m+1,r,pos,c);
        pushup(rt);
    }
    int query(int rt,int l,int r,int k)
    {
        if(l==r)
        {
            return l;
        }
        int m=(l+r)>>1;
        if(sum[rt*2]>=k)return query(rt*2,l,m,k);
        else return query(rt*2+1,m+1,r,k-sum[rt*2]);
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        build(1,1,n);
        for(int i=0;i<m;++i)
        {
            char s[5];
            int k;
            scanf("%s%d",s,&k);
            if(s[0]=='L')
            {
                int x=query(1,1,n,k);
                is[x]=0;
                change(1,1,n,x,0);
            }
            else if(s[0]=='R')
            {
                if(is[k]==1)continue;
                is[k]=1;
                change(1,1,n,k,1);
            }
            else
            {
                int x=query(1,1,n,k);
                printf("%d
    ",x);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    TSQL 基础学习 04
    第13章 网络编程
    Oracle 第一天
    第11章 进程与多线程
    Linux 第06天
    构造Json对象串工具类
    第14章 数据库
    第07章 集合
    YARNMR 大数据第二天
    第12章 多媒体
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/4937553.html
Copyright © 2011-2022 走看看