`
Coco_young
  • 浏览: 125788 次
  • 性别: Icon_minigender_1
  • 来自: 湖南长沙
社区版块
存档分类
最新评论

[SBT]POJ 2761 Feed the dogs

 
阅读更多

题目链接:http://poj.org/problem?id=2761

题意:给定一个序列,有N个数,给定M个询问,询问的形式为 a b c ,询问区间[a,b]内第c小的数。

解题方法:一次性读入所有的询问,然后把询问进行排序,排序的顺序为终点小的在前,终点一样,起点大的在前,然后对排序后的每个询问进行处理,每次保证SBT中只有区间[a,b]的数(用插入和删除操作来保证),然后查询第K小。

总结:注意旋转操作调整size域的顺序。 不能搞反。

代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct KEY
{
   int wgt,num;
   KEY(int w=0,int n=0):wgt(w),num(n){}
   bool operator < (const KEY &k) const
   {
        if(wgt!=k.wgt)return wgt<k.wgt;
        return num<k.num;
   }
   bool operator == (const KEY &k) const
   {
        return wgt==k.wgt&&num==k.num;
   }
};
const int MAXN = 100010;
struct SBT
{
    int l[MAXN],r[MAXN],pool[MAXN],size[MAXN],TOP,NODE,ROOT;
    KEY Key[MAXN];
    void init()
    {
         TOP = NODE = ROOT = 0;
         size[0] = l[0] = r[0] = 0;
    }
    int newnode(KEY k)
   {
        int node;
        if(TOP)node = pool[TOP--];
        else node = ++NODE;
        Key[node] = k;
        size[node] = 1;
        l[node] = r[node] = 0;
        return node;
   }
   void delnode(int x)
   {
        pool[++TOP] = x;
        Key[x].wgt = Key[x].num = size[x] = l[x] = r[x] = 0;
   }
    void left_rotate(int &p)
    {
         int x = r[p];
         r[p] = l[x];
         l[x] = p;
         size[x] = size[p];
         size[p] = size[l[p]]+size[r[p]]+1;
         p = x;
    }
    void right_rotate(int &p)
    {
         int x = l[p];
         l[p] = r[x];
         r[x] = p;
         size[x] = size[p];
         size[p] = size[l[p]]+size[r[p]]+1;
         p = x;
    }
    void Maintain(int &p,bool flag)
    {
         if(flag==0)
         {
             if(size[l[l[p]]]>size[r[p]])right_rotate(p);
             else if(size[r[l[p]]]>size[r[p]])
             {
                 left_rotate(l[p]);
                 right_rotate(p);
             }
             else return;
         }
         else
         {
             if(size[r[r[p]]]>size[l[p]])left_rotate(p);
             else if(size[l[r[p]]]>size[l[p]])
             {
                  right_rotate(r[p]);
                  left_rotate(p);
             }
             else return;
         }
         Maintain(l[p],0);
         Maintain(r[p],1);
         Maintain(p,1);
         Maintain(p,0);
    }
    void insert(int &p,KEY k)
    {
         if(!p)
         {
             p = newnode(k);
             return;
         }
         if(k<Key[p])insert(l[p],k);
         else insert(r[p],k);
         size[p] = size[l[p]]+size[r[p]]+1;
         Maintain(p,!(k<Key[p]));
    }
    int findmin(int p)
    {
        if(l[p])return findmin(l[p]);
        else return p;
    }
    void remove(int &p,KEY k)
    {
         if(p)
         {
             if(k==Key[p])
             {
                 if(!l[p])
                 {
                     int x = p;
                     p = r[p];
                     delnode(x);
                 }
                 else if(!r[p])
                 {
                     int x = p;
                     p = l[p];
                     delnode(x);
                 }
                 else 
                 {
                     int x = findmin(r[p]);
                     Key[p] = Key[x];
                     remove(r[p],Key[x]);
                 }
             }
             else if(k<Key[p])remove(l[p],k);
             else remove(r[p],k);
             if(p)
             {
                  size[p] = size[l[p]]+size[r[p]]+1;
             }
         }
    }
    int Select(int p,int k)
    {
        int rank = size[l[p]]+1;
        if(k==rank)return p;
        else if(k<rank)return Select(l[p],k);
        return Select(r[p],k-rank);
    }
    void print(int p)
    {
        if(!p)return ;
        print(l[p]);
        cout<<size[p]<<" "<<Key[p].wgt<<" "<<l[p]<<" "<<r[p]<<" "<<p<<" "<<(size[l[p]]+size[r[p]]+1)<<endl;
        print(r[p]);
    }
}sbt;
int arr[MAXN],res[50010];
struct Range
{
    int a,b,c,num;
    bool operator < (const Range &r) const
    {
         if(b!=r.b)return b<r.b;
         else return a>r.a;
    }
}R[50010];

int main()
{
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
         int a,b;sbt.init();
         for(int i=1;i<=n;i++)
         {
             scanf("%d",&arr[i]);
         }
         for(int i=1;i<=m;i++)
         {
             scanf("%d%d%d",&R[i].a,&R[i].b,&R[i].c);
             R[i].num = i;
         }
         sort(R+1,R+m+1);a = R[1].a; b = R[1].b;
         for(int i=a;i<=b;i++)
         {
             sbt.insert(sbt.ROOT,KEY(arr[i],i));
         }
         res[R[1].num] = sbt.Key[sbt.Select(sbt.ROOT,R[1].c)].wgt;
         for(int i=2;i<=m;i++)
         {
             if(R[i].a<a)
             {
                 for(int j=R[i].a;j<a;j++)
                 {
                     sbt.insert(sbt.ROOT,KEY(arr[j],j));
                 }
                 for(int j=b+1;j<=R[i].b;j++)
                 {
                     sbt.insert(sbt.ROOT,KEY(arr[j],j));
                 }
             }
             else if(R[i].a<b)
             {
                 for(int j=a;j<R[i].a;j++){
                     sbt.remove(sbt.ROOT,KEY(arr[j],j));
                 }
                 for(int j=b+1;j<=R[i].b;j++){
                     sbt.insert(sbt.ROOT,KEY(arr[j],j));
                 }
             }
             else 
             {
                 for(int j=a;j<=b;j++){
                     sbt.remove(sbt.ROOT,KEY(arr[j],j));
                 }
                 for(int j=R[i].a;j<=R[i].b;j++){
                     sbt.insert(sbt.ROOT,KEY(arr[j],j)); 
                 }
             }
             a = R[i].a, b = R[i].b;
             res[R[i].num] = sbt.Key[sbt.Select(sbt.ROOT,R[i].c)].wgt;
         }
         for(int i=1;i<=m;i++)printf("%d\n",res[i]);
    }
    return 0;
}


分享到:
评论

相关推荐

    sbt资源包,全平台版本sbt-platform

    **Sbt资源包详解——全平台版本Sbt-Platform** Sbt(Simple Build Tool)是Scala项目的主要构建工具,它以其高效、灵活和强大的特性深受开发者喜爱。在 Scala 开发环境中,Sbt 起到了核心作用,它负责编译、测试、...

    sbt-1.9.0.tgz

    SBT,全称为Scala Build Tool,是用于构建和管理Scala及Java项目的强大工具。它以其高效、灵活和可扩展性而受到开发者的广泛欢迎。在本文中,我们将深入探讨SBT的基本概念、功能以及如何使用它来管理项目。 首先,...

    sbt in Action(Manning,2015)

    A tutorial about effectively building Scala projects, sbt in Action introduces the sbt tool with a simple project that establishes the fundamentals of running commands and tasks. Next, it shows you ...

    sbt-1.3.8.tar.gz

    【sbt-1.3.8.tar.gz】是一款基于Scala的构建工具,它在Java开发领域,特别是处理Scala项目时,扮演着至关重要的角色。这个压缩包文件包含了sbt(Simple Build Tool)版本1.3.8的所有必要组件,允许开发者高效地构建...

    sbt-1.2.1.zip 最新版 下载

    **Sbt-1.2.1.zip:Scala项目构建工具的最新版本** Sbt(Simple Build Tool)是Scala编程语言的主流构建工具,它提供了一种高效、灵活的方式来管理、构建和运行Scala和Java项目。Sbt-1.2.1.zip是截至2018年8月13日的...

    sbt-0.13.17

    **sbt-0.13.17:Scala构建工具详解** `sbt-0.13.17` 是一个重要的版本更新,它是Scala Build Tool(sbt)的一个发行版,用于管理、构建和打包Scala及Java项目。sbt是基于Apache 2.0许可的开源工具,它为开发人员...

    SBT 1.2.3最新版

    SBT(Scala Build Tool)是Scala、Java以及更多项目的构建工具,它以其高效、灵活的构建配置和强大的依赖管理而闻名。SBT 1.2.3是该工具的一个特定版本,它要求Java 1.8或更高版本才能运行。在深入探讨SBT 1.2.3之前...

    sbt 1.0.3.zip

    SBT,全称为Scala Build Tool,是用于构建Scala和Java项目的工具,同样也适用于管理Java项目。它基于Apache Ivy库,提供了高效的依赖管理和构建流程。Sbt 1.0.3是该工具的一个版本,发布于2017年,为开发者提供了...

    windows 10 系统Scala和sbt环境配置教程方法.docx

    Windows 10 系统 Scala 和 SBT 环境配置教程方法 摘要:本文档提供了在 Windows 10 系统上配置 Scala 和 SBT 环境的详细教程,涵盖了 Scala 和 SBT 的安装、配置和测试等步骤。 一、 Scala 安装和配置 Scala 是一...

    sbt-launch.jar

    【sbt-launch.jar】是Scala构建工具SBT(Scala Build Tool)的核心组件,它是一个用于启动SBT的可执行JAR文件。这个压缩包包含了不同版本的sbt-launch.jar,分别是0.11.0、0.11.2、0.11.3以及0.13.9。这些版本的差异...

    scala-sbt_API

    Scala-SBT API 是一个强大的构建工具,用于管理 Scala 和 Java 项目。SBT,全称为 Simple Build Tool,它以其灵活性和高效性在 Scala 开发者社区中广泛应用。在这个API文档中,开发者可以找到关于如何使用SBT进行...

    sbt-1.3.13.zip

    `sbt-1.3.13.zip` 是Scala开发环境中不可或缺的构建工具——Scala Build Tool(SBT)的1.3.13版本的压缩包。SBT是基于Java平台的一个开源构建工具,它为Scala和Java项目提供了高度可配置的、功能强大的构建机制。这...

    sbt-1.0.2.zip

    【sbt】全称为Scala Build Tool,是一款基于Java和Scala的构建工具,广泛应用于Scala项目的构建、管理和打包工作。它提供了命令行界面,允许开发者通过简单的命令执行各种任务,如编译、测试、打包和发布应用程序。...

    sbt 0.13 API (source)

    **Sbt 0.13 API 源代码详解** Sbt(Simple Build Tool)是Scala项目的主要构建工具,以其高效、灵活和强大的特性而受到广大开发者喜爱。sbt 0.13 版本是该工具的一个稳定版本,发布于2016年11月13日。本文将深入...

    sbt-1.5.5.tgz

    SBT(Simple Build Tool)是Scala项目的主要构建工具,它为Scala和Java应用程序提供了一种高效、灵活的构建方式。标题中的"sbt-1.5.5.tgz"表明这是一个包含SBT版本1.5.5的压缩包,通常这种压缩包会包括SBT的可执行...

    sbt-1.5.3.zip

    SBT,全称为Scala Build Tool,是用于构建和管理Scala及Java项目的工具。它是一个强大的构建系统,由Hudson和Maven的开发者Jason van Zyl所创建,旨在为Scala项目提供更加灵活和高效的构建解决方案。SBT利用Scala...

    sbt+scala+idea安装配置创建导入sbt项目

    ### sbt + Scala + IDEA 安装配置及创建导入 sbt 项目的详细步骤 #### 一、环境搭建 本文档将详细介绍如何在 Windows 10 和 JDK 1.8 的环境下,搭建完整的 Scala + sbt + IntelliJ IDEA 开发环境。这对于初学者来...

    sbt-0.13.15

    【sbt-0.13.15】是Scala构建工具Simple Build Tool(简称sbt)的一个特定版本,主要用于管理Scala和Java项目。这个版本号0.13.15表明了该软件在发布时的成熟度和修复的已知问题。在本案例中,提供的压缩包文件是一个...

    sbteclipse

    `sbt eclipse` 是 sbt 的一个插件,它的主要作用是将 sbt 项目转换成 Eclipse 可识别的格式,使得开发人员可以在 Eclipse 这样的集成开发环境中(IDE)无缝地进行 Scala 或 Java 开发。Eclipse 是一款功能丰富的开源...

Global site tag (gtag.js) - Google Analytics