题目链接: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(Simple Build Tool)是Scala项目的主要构建工具,它以其高效、灵活和强大的特性深受开发者喜爱。在 Scala 开发环境中,Sbt 起到了核心作用,它负责编译、测试、...
SBT,全称为Scala Build Tool,是用于构建和管理Scala及Java项目的强大工具。它以其高效、灵活和可扩展性而受到开发者的广泛欢迎。在本文中,我们将深入探讨SBT的基本概念、功能以及如何使用它来管理项目。 首先,...
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】是一款基于Scala的构建工具,它在Java开发领域,特别是处理Scala项目时,扮演着至关重要的角色。这个压缩包文件包含了sbt(Simple Build Tool)版本1.3.8的所有必要组件,允许开发者高效地构建...
**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:Scala构建工具详解** `sbt-0.13.17` 是一个重要的版本更新,它是Scala Build Tool(sbt)的一个发行版,用于管理、构建和打包Scala及Java项目。sbt是基于Apache 2.0许可的开源工具,它为开发人员...
SBT(Scala Build Tool)是Scala、Java以及更多项目的构建工具,它以其高效、灵活的构建配置和强大的依赖管理而闻名。SBT 1.2.3是该工具的一个特定版本,它要求Java 1.8或更高版本才能运行。在深入探讨SBT 1.2.3之前...
SBT,全称为Scala Build Tool,是用于构建Scala和Java项目的工具,同样也适用于管理Java项目。它基于Apache Ivy库,提供了高效的依赖管理和构建流程。Sbt 1.0.3是该工具的一个版本,发布于2017年,为开发者提供了...
Windows 10 系统 Scala 和 SBT 环境配置教程方法 摘要:本文档提供了在 Windows 10 系统上配置 Scala 和 SBT 环境的详细教程,涵盖了 Scala 和 SBT 的安装、配置和测试等步骤。 一、 Scala 安装和配置 Scala 是一...
【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 和 Java 项目。SBT,全称为 Simple Build Tool,它以其灵活性和高效性在 Scala 开发者社区中广泛应用。在这个API文档中,开发者可以找到关于如何使用SBT进行...
`sbt-1.3.13.zip` 是Scala开发环境中不可或缺的构建工具——Scala Build Tool(SBT)的1.3.13版本的压缩包。SBT是基于Java平台的一个开源构建工具,它为Scala和Java项目提供了高度可配置的、功能强大的构建机制。这...
【sbt】全称为Scala Build Tool,是一款基于Java和Scala的构建工具,广泛应用于Scala项目的构建、管理和打包工作。它提供了命令行界面,允许开发者通过简单的命令执行各种任务,如编译、测试、打包和发布应用程序。...
**Sbt 0.13 API 源代码详解** Sbt(Simple Build Tool)是Scala项目的主要构建工具,以其高效、灵活和强大的特性而受到广大开发者喜爱。sbt 0.13 版本是该工具的一个稳定版本,发布于2016年11月13日。本文将深入...
SBT(Simple Build Tool)是Scala项目的主要构建工具,它为Scala和Java应用程序提供了一种高效、灵活的构建方式。标题中的"sbt-1.5.5.tgz"表明这是一个包含SBT版本1.5.5的压缩包,通常这种压缩包会包括SBT的可执行...
SBT,全称为Scala Build Tool,是用于构建和管理Scala及Java项目的工具。它是一个强大的构建系统,由Hudson和Maven的开发者Jason van Zyl所创建,旨在为Scala项目提供更加灵活和高效的构建解决方案。SBT利用Scala...
### sbt + Scala + IDEA 安装配置及创建导入 sbt 项目的详细步骤 #### 一、环境搭建 本文档将详细介绍如何在 Windows 10 和 JDK 1.8 的环境下,搭建完整的 Scala + sbt + IntelliJ IDEA 开发环境。这对于初学者来...
【sbt-0.13.15】是Scala构建工具Simple Build Tool(简称sbt)的一个特定版本,主要用于管理Scala和Java项目。这个版本号0.13.15表明了该软件在发布时的成熟度和修复的已知问题。在本案例中,提供的压缩包文件是一个...
`sbt eclipse` 是 sbt 的一个插件,它的主要作用是将 sbt 项目转换成 Eclipse 可识别的格式,使得开发人员可以在 Eclipse 这样的集成开发环境中(IDE)无缝地进行 Scala 或 Java 开发。Eclipse 是一款功能丰富的开源...