平板电视食用教程

news/2024/11/17 13:35:12/文章来源: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/835302.html

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

相关文章

企业集成模式-第十二章

十二、中场演练:系统管理示例管理控制台:显式所有组件的工作状态(下图一) 贷款中介的服务质量:监视请求响应时间 验证信用机构的操作:周期性地发送测试消息,希望确信该服务在正常运行(下图二) 信仰机构的故障恢复:如果信仰机构出现故障,希望把信用请求消息临时重定向…

平板电视从入门到精通

先来看一道大家基本都能默写出来的题目: 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作:插入一个数 \(x\)。 删除一个数 \(x\)(若有多个相同的数,应只删除一个)。 定义排名为比当前数小的数的个数 \(+1\)。查询 \(x\) 的排名。 查询数据结…

人月神话-摘抄

由于人员的分工,大型编程项目碰到的管理问题和小项目区别很大:我相信关键需要是维持产品自身的概念完整性。 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…