平板电视从入门到精通

news/2024/11/17 13:32:11/文章来源:https://www.cnblogs.com/UsamiRenko/p/18550451

先来看一道大家基本都能默写出来的题目:

您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:

  1. 插入一个数 \(x\)
  2. 删除一个数 \(x\)(若有多个相同的数,应只删除一个)。
  3. 定义排名为比当前数小的数的个数 \(+1\)。查询 \(x\) 的排名。
  4. 查询数据结构中排名为 \(x\) 的数。
  5. \(x\) 的前驱(前驱定义为小于 \(x\),且最大的数)。
  6. \(x\) 的后继(后继定义为大于 \(x\),且最小的数)。

很显然,我么需要手写一个 Treap。就像这样:

//代码是盒的,别用qwq
#include<cstdio>
using namespace std;
#define MAXN 1000000
int f[MAXN],cnt[MAXN],value[MAXN],sons[MAXN][2],sub_size[MAXN],whole_size,root;                 
inline int qread(){int res=0,k=1;char c=getchar();while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}while(isdigit(c)){res=(res<<1)+(res<<3)+c-48;c=getchar();}return res*k;
}
inline void S_Clear(int x){sons[x][0]=sons[x][1]=f[x]=sub_size[x]=cnt[x]=value[x]=0; 
}
inline bool get_which(int x){return sons[f[x]][1]==x;
}
inline void update(int x){if (x){  sub_size[x]=cnt[x];  if (sons[x][0]) sub_size[x]+=sub_size[sons[x][0]];  if (sons[x][1]) sub_size[x]+=sub_size[sons[x][1]];  }  return ;
}
inline void rotate(int x){int father=f[x],g_father=f[father],which_son=get_which(x);sons[father][which_son]=sons[x][which_son^1];f[sons[father][which_son]]=father;sons[x][which_son^1]=father;f[father]=x;f[x]=g_father;if(g_father){sons[g_father][sons[g_father][1]==father]=x;}update(father);update(x);
}
inline void splay(int x){for (int fa;fa=f[x];rotate(x))  if (f[fa])  rotate((get_which(x)==get_which(fa))?fa:x);  root=x;  
}
inline void insert(int x){if(!root){whole_size++;sons[whole_size][0]=sons[whole_size][1]=f[whole_size]=0;root=whole_size;sub_size[whole_size]=cnt[whole_size]++;value[whole_size]=x;return ;} int now=root,fa=0;while(1){if(x==value[now]){cnt[now]++;update(now);update(fa);splay(now);break;}fa=now;now=sons[now][value[now]<x];if(!now){whole_size++;sons[whole_size][0]=sons[whole_size][1]=0;f[whole_size]=fa;sub_size[whole_size]=cnt[whole_size]=1;sons[fa][value[fa]<x]=whole_size;value[whole_size]=x;update(fa);splay(whole_size);break; }}}
inline int find_num(int x){ int now=root;while(1){if(sons[now][0]&&x<=sub_size[sons[now][0]])now=sons[now][0];else {int temp=(sons[now][0]?sub_size[sons[now][0]]:0)+cnt[now];if(x<=temp)return value[now];x-=temp;now=sons[now][1];}}
}inline int find_rank(int x){int now=root,ans=0;  while(1){  if (x<value[now])  now=sons[now][0];  else{  ans+=(sons[now][0]?sub_size[sons[now][0]]:0);  if (x==value[now]){  splay(now); return ans+1;  }  ans+=cnt[now];  now=sons[now][1];  }  }  
}
inline int find_pre(){int now=sons[root][0];while(sons[now][1])now=sons[now][1];return now;
}
inline int find_suffix(){int now=sons[root][1];while(sons[now][0])now=sons[now][0];return now;
}
inline void my_delete(int x){int hhh=find_rank(x);if (cnt[root]>1){cnt[root]--; update(root); return;}  if (!sons[root][0]&&!sons[root][1]) {S_Clear(root);root=0;return;}  if (!sons[root][0]){  int old_root=root; root=sons[root][1];f[root]=0; S_Clear(old_root); return;  }  else if (!sons[root][1]){  int old_root=root; root=sons[root][0]; f[root]=0; S_Clear(old_root); return;  } int left_max=find_pre(),old_root=root;  splay(left_max);  sons[root][1]=sons[old_root][1];  f[sons[old_root][1]]=root;  S_Clear(old_root);  update(root);  
}int main(){int m,num,be_dealt;cin>>m;for(int i=1;i<=m;i++){num=qread();be_dealt=qread();switch(num){case 1:insert(be_dealt);break;case 2:my_delete(be_dealt);break;case 3:printf("%d\n",find_rank(be_dealt));break;case 4:printf("%d\n",find_num(be_dealt));break;case 5:insert(be_dealt);printf("%d\n",value[find_pre()]);my_delete(be_dealt);break;case 6:insert(be_dealt);printf("%d\n",value[find_suffix()]);my_delete(be_dealt);break;}}return 0;
}

实际上写出这么多的代码需要极强的码力,而且容易出错在考场上红温
直到有一天,你学会发布了这篇文章:
image
下划线开头的函数包括__gcd等,同时还包括一个神秘的库叫做 __gnu_pbds。这个库里面包括了很多数据结构,其中甚至包括平衡树,除此之外还有类似于哈希之类的东西,很大程度上可以减轻写代码的负担,但是注意,如果背不对模板,不要尝试在考场上使用。
先上代码:

#include<bits/stdc++.h>
#include<bits/extc++.h>
using namespace __gnu_pbds;
//using namespace std;
inline int read()
{int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0' && ch<='9')x=x*10+ch-'0',ch=getchar();return x*f;
}
inline void write(int x)
{if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+'0');return;
}
const int inf = INT_MAX;
tree<std::pair<int,int>,null_type,std::less<std::pair<int,int> >,rb_tree_tag,tree_order_statistics_node_update>rbt;
int main()
{int n=read();for(int i=1;i<=n;i++){int opt=read(),val=read();if(opt==1){rbt.insert(std::make_pair(val,i));}else if(opt==2){rbt.erase(rbt.lower_bound(std::make_pair(val,0)));}else if(opt==3){write(rbt.order_of_key(std::make_pair(val,0))+1);putchar(10);}else if(opt==4){auto it=rbt.find_by_order(val-1);write((*it).first);putchar(10);}else if(opt==5){auto it=rbt.lower_bound(std::make_pair(val,0));write((*(--it)).first);putchar(10);}else{auto it=rbt.upper_bound(std::make_pair(val,inf));write((*(it)).first);putchar(10);}}return 0;
}

注意:上面的代码如果在devcpp里面打开是百分之百无法编译的,如图:
image
这个时候,如果是windows系统使用devcpp建议把devc++自带的mingw64编译器添加到系统环境变量后直接在cmd里面用这个命令编译:
g++ <yourfilename>.cpp -o <the_name_of_exe_file> -O2 -std=c++14
接着说模板的事情。
除了rb_tree之外平板电视里面还有treap和基于vector实现的平衡树,但是两种我都不建议使用,被卡过就知道为啥了。
除此之外还有哈希有关的东西,这样写,和map类似

cc_hash_table<int,bool> h;
gp_hash_table<int,bool> h;

其中下面那个稍微快一点。操作支持find操作和[]。然而这个好东西可以把 \(O(nlogn)\) 的复杂度直接拽到 \(O(n)\)。在考场上真的可以救你一命。
image
但是特别注意,使用了这个东西就不太建议引入using namespace std;了,因为可能会因为函数名称冲突见祖宗,建议实际考试或者模拟赛的时候在linux下编译一下试试再提交。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/835300.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人月神话-摘抄

由于人员的分工,大型编程项目碰到的管理问题和小项目区别很大:我相信关键需要是维持产品自身的概念完整性。 1. 焦油坑(the tar pit) 过去几十年的大型系统开发犹如这样一个焦油坑,很多大型和强壮的动物在其中剧烈地挣扎。他们中大多数开发出了可运行的系统-不过,其中只有非…

Manjaro/Arch用怎么安装天翼云电脑(Ctyun-cloud-desk)?感谢信创,感谢国家

最近微信出了linux版,用vmware装linux不过瘾,把一台闲置的笔记本装上了Manjaro KDE Plasma,经过一段时间的发展,Linux桌面可用性大大提高。 Kindle->Kindle Mate->Anki这条路在linux下 我用 Kindle ->KindleVocab ->Anki这么代替了之后, 其他软件都能凑合用,…

Prometheus 和 Grafana 监控系统搭建

Prometheus 和 Grafana 监控系统的搭建和配置。Author: ACatSmiling Since: 2024-11-11Prometheus 的架构架构理解:Prometheus 既然设计为一个维度存储模型,可以把它理解为一个 OLAP 系统。 生态圈组件:Prometheus Server:主服务器,负责收集和存储时间序列数据。 Client L…

团队作业4——项目冲刺-6

DAY(11.16) 每日站立式会议 会议照片:会议内容:成员 昨天已完成的工作 今天计划完成的工作欧可贵 Day6博客的编写,会议的组织与展开 完成任务的对接,组织第六次会议的召开,准备用户测试吴灿豪 检查代码流畅性,美化页面,交互各个界面 继续优化代码,美化界面陈东阳 用户…

STM32F103简介

自从大学毕业之后,已经很久没有接触STM32控制器了,最近打算学习一下LVGL,控制芯片计划使用STM32,因此这里我们会简单介绍有关STM32的知识。 一、STM32F103RTC6介绍 1.1 命名规则 我从网上买了一块STM32F103RTC6开发板,STM32F103RCT6 各个字段的含义:STM32(芯片系列):S…

高级语言程序设计第七次个人作业(102400106刘鑫语)

这个作业属于哪个课程: https://edu.cnblogs.com/campus/fzu/2024C 这个作业要求在哪里: https://edu.cnblogs.com/campus/fzu/2024C/homework/13304 学号:102400106 姓名:刘鑫语 作业内容: 编写并运行博客园的八道题。 1,定义一个二维数组和指向该数组的指针,分别以数组…

20222312 2024-2025-1 《网络与系统攻防技术》实验六实验报告

1.实验内容及要求 本实践目标是掌握metasploit的用法。 指导书参考Rapid7官网的指导教程。 https://docs.rapid7.com/metasploit/metasploitable-2-exploitability-guide/ 下载官方靶机Metasploitable2,完成下面实验内容。 (1)前期渗透 ①主机发现(可用Aux中的arp_sweep,s…

解决 PbootCMS 网站转移后无法打开报错提示“No input file specified”的问题

确保所有文件路径正确无误。检查 index.php 文件确保 index.php 文件存在于网站根目录中,并且路径正确。检查其他配置文件确保 config.php 和其他配置文件路径正确。查看错误日志 查看服务器日志,获取更多详细的错误信息。PHP 错误日志通常位于 /var/log/php7.x-fpm.log 或 /…

织梦dedecms无法登录后台,提示用户名或密码错误怎么办

问题描述:无法登录后台,提示用户名或密码错误。 解决方案:检查用户名和密码:确保输入的用户名和密码正确。 清除Cookie:清除浏览器的Cookie,重新尝试登录。 检查数据库:确保数据库中的管理员账户信息正确。 检查文件权限:确保后台目录和文件的权限设置正确。 检查配置文…

网站数据库如何修改config.php,如何在网站配置文件中修改数据库连接信息

修改网站的数据库连接信息可以确保网站能够正确连接到数据库。以下是具体步骤:备份文件:在修改前,备份当前的config.php文件,确保数据安全。 使用FTP工具(如FileZilla)下载config.php文件到本地。编辑文件:使用代码编辑器(如Sublime Text、Visual Studio Code)打开con…

修改公司网站 插件,如何在公司网站后台安装和管理插件

插件可以扩展网站的功能,提升用户体验。以下是具体步骤:登录后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入插件管理:登录后,点击顶部菜单栏中的“插件”或“扩展”。 选择“插件管理”或“扩展管理…

网站首页修改标题描述,如何在网站后台或代码编辑器中修改首页标题和描述

修改首页标题和描述可以提升搜索引擎优化(SEO)。以下是修改首页标题和描述的步骤:登录网站后台:打开浏览器,输入网站的后台地址,例如 http://yourdomain.com/admin。 输入管理员账号和密码,点击“登录”。进入SEO设置:登录后,点击顶部菜单栏中的“SEO”或“设置”。 选…