fhq_treap || BZOJ1861: [Zjoi2006]Book 书架 || Luogu P2596 [ZJOI2006]书架

题面:P2596 [ZJOI2006]书架

题解:记录每本书对应的节点编号

普通fhq_treap无法查询一个权值的排名,所以在普通fhq_treap上多记录每个节点的父亲(可加在pushup函数中),

查询时从该节点开始逐步往上跳,记录答案。

其他操作都依附在该排名上。

代码:

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<iostream>
  4 #include<cstdlib>
  5 using namespace std;
  6 inline int rd(){
  7     int x=0,f=1;char c=getchar();
  8     while(c<'0'||c>'9'){if(c=='-')f=-1; c=getchar();}
  9     while(c>='0'&&c<='9'){x=x*10+c-'0'; c=getchar();}
 10     return f*x;
 11 }
 12 const int maxn=(8e4)+50;
 13 int N,M,lc[maxn],rc[maxn],val[maxn],pr[maxn],tot=0,siz[maxn];
 14 int u,rt=0,s,t,x,y,z,id[maxn],fa[maxn],k;
 15 //id[i]表示编号为i的书所在的节点编号 
 16 char o[15];
 17 inline int New_node(int x){
 18     val[++tot]=x;
 19     siz[tot]=1;
 20     pr[tot]=rand();
 21     return tot;
 22 }
 23 inline void Pushup(int x){
 24     siz[x]=siz[lc[x]]+siz[rc[x]]+1;
 25     fa[lc[x]]=fa[rc[x]]=x;
 26     return;
 27 }
 28 inline void Split(int now,int k,int &x,int &y){
 29     if(!now){
 30         x=y=fa[x]=fa[y]=0;
 31         return;
 32     }
 33     if(siz[lc[now]]+1<=k){
 34         x=now;
 35         Split(rc[now],k-siz[lc[now]]-1,rc[now],y);
 36     }
 37     else {        
 38         y=now;
 39         Split(lc[now],k,x,lc[now]);
 40     }
 41     Pushup(now);
 42     return;
 43 }
 44 inline int Merge(int x,int y){
 45     if(!x||!y){
 46         fa[x]=fa[y]=x+y;
 47         return x+y;
 48     }
 49     if(pr[x]<pr[y]){
 50         rc[x]=Merge(rc[x],y);
 51         Pushup(x);
 52         return x;
 53     }
 54     else{
 55         lc[y]=Merge(x,lc[y]);
 56         Pushup(y);
 57         return y;
 58     }
 59 }
 60 inline int Find(int x){//寻找x节点上有多少书
 61     int sum=0;
 62     sum+=siz[lc[x]];
 63     while(x!=rt){
 64         if(rc[fa[x]]==x)sum+=siz[lc[fa[x]]]+1;
 65         x=fa[x];
 66     }
 67     return sum;
 68 }
 69 inline int Query(int k){
 70     int now=rt;
 71     while(now){
 72         if(k<=siz[lc[now]])now=lc[now];
 73         else if(k==siz[lc[now]]+1)return now;
 74         else k-=siz[lc[now]]+1,now=rc[now];
 75     }
 76     return 0;
 77 }
 78 int main(){
 79     srand(20030304);
 80     N=rd();M=rd();
 81     for(int i=1;i<=N;i++){
 82         u=rd();
 83         rt=Merge(rt,id[u]=New_node(u));
 84     }
 85     while(M--){
 86         scanf("%s",o); s=rd();
 87         if(o[0]=='T'){
 88             k=Find(id[s]);
 89             Split(rt,k+1,x,z);
 90             Split(x,k,x,y);
 91             rt=Merge(Merge(x,Merge(lc[y],rc[y])),z);
 92             rt=Merge(id[s],rt);
 93         }
 94         else if(o[0]=='B'){
 95             k=Find(id[s]);
 96             Split(rt,k+1,x,z);
 97             Split(x,k,x,y);
 98             rt=Merge(Merge(x,Merge(lc[y],rc[y])),z);
 99             rt=Merge(rt,id[s]);
100         }
101         else if(o[0]=='I'){
102             t=rd();
103             k=Find(id[s]);
104             Split(rt,k+1,x,z);
105             Split(x,k,x,y);
106             rt=Merge(Merge(x,Merge(lc[y],rc[y])),z);
107             Split(rt,k+t,x,y);
108             rt=Merge(Merge(x,id[s]),y);
109         }
110         else if(o[0]=='A'){
111             printf("%d\n",Find(id[s]));    
112         }
113         else {//Q
114             printf("%d\n",val[Query(s)]);    
115         }
116     }
117     return 0;
118 }

By:AlenaNuna

转载于:https://www.cnblogs.com/AlenaNuna/p/10940201.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
GeoPandas是一个开源的Python库,旨在简化地理空间数据的处理和分析。它结合了Pandas和Shapely的能力,为Python用户提供了一个强大而灵活的工具来处理地理空间数据。以下是关于GeoPandas的详细介绍: 一、GeoPandas的基本概念 1. 定义 GeoPandas是建立在Pandas和Shapely之上的一个Python库,用于处理和分析地理空间数据。 它扩展了Pandas的DataFrame和Series数据结构,允许在其中存储和操作地理空间几何图形。 2. 核心数据结构 GeoDataFrame:GeoPandas的核心数据结构,是Pandas DataFrame的扩展。它包含一个或多个列,其中至少一列是几何列(geometry column),用于存储地理空间几何图形(如点、线、多边形等)。 GeoSeries:GeoPandas中的另一个重要数据结构,类似于Pandas的Series,但用于存储几何图形序列。 二、GeoPandas的功能特性 1. 读取和写入多种地理空间数据格式 GeoPandas支持读取和写入多种常见的地理空间数据格式,包括Shapefile、GeoJSON、PostGIS、KML等。这使得用户可以轻松地从各种数据源中加载地理空间数据,并将处理后的数据保存为所需的格式。 2. 地理空间几何图形的创建、编辑和分析 GeoPandas允许用户创建、编辑和分析地理空间几何图形,包括点、线、多边形等。它提供了丰富的空间操作函数,如缓冲区分析、交集、并集、差集等,使得用户可以方便地进行地理空间数据分析。 3. 数据可视化 GeoPandas内置了数据可视化功能,可以绘制地理空间数据的地图。用户可以使用matplotlib等库来进一步定制地图的样式和布局。 4. 空间连接和空间索引 GeoPandas支持空间连接操作,可以将两个GeoDataFrame按照空间关系(如相交、包含等)进行连接。此外,它还支持空间索引,可以提高地理空间数据查询的效率。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值