hdu4288 线段树+离线化+离散化

2024-06-14 19:32
文章标签 离线 hdu4288 线段 离散

本文主要是介绍hdu4288 线段树+离线化+离散化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目看起来很麻烦,其实不难。

题意是个坑,以为输入是有序的,结果居然不是,WA了好多遍。

维护五颗记录和的线段树,分别对应对5取余的值,这个题简单的地方就在于查询时每次都查整个区间,所以只需要输出根节点即可,目测如果进一步改成子区间会难很多。

维护时,相当于将每个点都作为一个区间,然后两个区间合并时,左孩子的记录可直接用,右孩子的记录需要参考左区间元素个数才能判断在整个区间的位置,公式很好推理。

千万注意,要排序,因为输入可能是无序的,如果不排序,新加入的节点不能保证整个序列有序,所以要排序之后才能获得元素在线段树中的位置,进而执行操作。

另外,离线化不会影响结果,因为处理到某个操作时,后续操作均未执行,故无论新加入的元素在什么位置,将空的位置去掉,不会影响结果。

代码:

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define delf int m=(l+r)>>1
long long sum[5][N*4];
int cnt[N*4];struct op
{string s;int v;
}q[N];void build(int l,int r,int rt)
{for (int i=0;i<5;i++)sum[i][rt]=0;cnt[rt]=0;if (l==r)return ;delf;build(lson);build(rson);
}void pushup(int rt)
{cnt[rt]=cnt[rt<<1]+cnt[rt<<1|1];for (int i=0;i<5;i++)sum[i][rt]=sum[i][rt<<1]+sum[(i-(cnt[rt<<1]%5)+5)%5][rt<<1|1];return ;
}void update(int k,long long v,int l,int r,int rt)
{if (l==r){sum[1][rt]=v;cnt[rt]=1;return ;}delf;if (k<=m)update(k,v,lson);elseupdate(k,v,rson);pushup(rt);return ;
}void del(int k,int l,int r,int rt)
{if (l==r){sum[1][rt]=0;cnt[rt]=0;return ;}delf;if (m>=k)del(k,lson);elsedel(k,rson);pushup(rt);return ;
}int main()
{int n;while (cin>>n){string s;long long v;build(1,n,1);int c=1;int a[N];for (int i=0;i<n;i++){cin>>q[i].s;if (q[i].s[0]!='s'){cin>>q[i].v;a[c++]=q[i].v;}elseq[i].v=0;}sort(a+1,a+c);              //必须排序,输入居然不是有序的,尼玛WA了一晚上int m=unique(a+1,a+c)-(a+1);            //第一次用,该函数将这一序列的所有值中重复的元素放在后面,并返回数组中不重复的最后一个元素的位置,减去数组开头刚好是元素个数for (int i=0;i<n;i++){if (q[i].s[0]=='s')cout<<sum[3][1]<<endl;if (q[i].s[0]=='a'){int v=q[i].v;int k=upper_bound(a+1,a+c,v)-(a+1);         //第一次用,二分查找v在数组中第一个大于v的元素的位置,同样要减去初始位置update(k,v,1,n,1);}if (q[i].s[0]=='d'){int v=q[i].v;int k=upper_bound(a+1,a+c,v)-(a+1);del(k,1,n,1);}}}return 0;
}


这篇关于hdu4288 线段树+离线化+离散化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061321

相关文章

【服务器运维】CentOS6 minimal 离线安装MySQL5.7

1.准备安装包(版本因人而异,所以下面的命令中版本省略,实际操作中用Tab自动补全就好了) cloog-ppl-0.15.7-1.2.el6.x86_64.rpmcpp-4.4.7-23.el6.x86_64.rpmgcc-4.4.7-23.el6.x86_64.rpmgcc-c++-4.4.7-23.el6.x86_64.rpmglibc-2.12-1.212.el6.x86_64.r

【服务器运维】CentOS7 minimal 离线安装 gcc perl vmware-tools

0. 本机在有网的情况下,下载CentOS镜像 https://www.centos.org/download/ 1. 取出rpm 有的情况可能不需要net-tools,但是如果出现跟ifconfig相关的错误,就把它安装上。另外如果不想升级内核版本的话,就找对应内核版本的rpm版本安装 perl-Time-Local-1.2300-2.el7.noarch.rpmperl-Tim

Ubuntu20.04离线安装Docker

1.下载3个docker离线安装包,下载网址: https://download.docker.com/linux/ubuntu/dists/xenial/pool/stable/amd64/ 2.把3个离线安装包拷贝到ubuntu本地执行以下命令 sudo dpkg -i containerd.io_1.4.6-1_amd64.deb sudo dpkg -i docker-ce-c

AI学习指南机器学习篇-朴素贝叶斯处理连续特征和离散特征

AI学习指南机器学习篇-朴素贝叶斯处理连续特征和离散特征 在机器学习领域,朴素贝叶斯是一种常用的分类算法,它的简单性和高效性使得它在实际应用中得到了广泛的应用。然而,在使用朴素贝叶斯算法进行分类时,我们通常会面临一个重要的问题,就是如何处理连续特征和离散特征。因为朴素贝叶斯算法基于特征的条件独立性假设,所以对于不同类型的特征,我们需要采取不同的处理方式。 在本篇博客中,我们将探讨如何有效地处理

离线linux通过USB连接并使用手机网络

离线linux通过USB连接并使用手机网络 引场景 引 离线环境要安装一些软件特别麻烦,要自己去官网下载对应的包,然后上传到服务器上,再解压,编译,执行,配置变量等等,错一步都可能安装失败。有网络的话使用yum或者是docker镜像来安装就非常方便。这里记录一下之前在centos上通过USB连接手机并使用手机网络来做这些基础工作时所遇到的网络问题。 场景 首先手机连上服务器主

本地离线模型搭建指南-LLaMA-Factory训练框架及工具

搭建一个本地中文大语言模型(LLM)涉及多个关键步骤,从选择模型底座,到运行机器和框架,再到具体的架构实现和训练方式。以下是一个详细的指南,帮助你从零开始构建和运行一个中文大语言模型。 本地离线模型搭建指南将按照以下四个部分展开 中文大语言模型底座选择依据本地运行显卡选择RAG架构实现LLaMA-Factory训练框架及工具 4 训练架构及工具 4.1 为什么要使用LLaMA-Factor

线段树单点修改的应用

思路:对初始状态进行建树,然后这题就相当于查询第一个合法的位置,并且对其值进行修改,整个题目要求维护的是区间最大值,很显然可以使用线段树。 #include <bits/stdc++.h>using namespace std;const int N = 2e6 + 5;typedef long long ll;typedef pair<ll, ll> pll;typedef arra

TestNG离线安装步骤

1.下载testNG 离线安装包【eclipse-testng离线包】,并解压。资源可以在下载:http://download.csdn.net/detail/u012100968/9623613;(官方把下载积分调的出乎意料的高,还不能改,大家另外找资源吧) 2.将解压后的文件..\eclipse-testng离线包\features\目录下的文件夹org.testng.eclipse_6.9

读线圈和离散状态寄存器信息

一.功能码操作类型 二.读线圈状态 需求实例 读取设备地址为 3 的从设备的线圈状态寄存器,线圈地址为 19 到 55(从 0 开始计算)共 37 个状态。 分析:由需求可知读取地址,则功能码是0x01,地址为3即为0x03,线圈地址为19到55则起始地址为19,即0x13,数量为37,即是0x25,查询报表如下所示: 假设从设备的状态值如下: 对应的响应包如下: 使

【机器学习】基于Softmax松弛技术的离散数据采样

1.引言 1.1.离散数据采样的意义 离散数据采样在深度学习中起着至关重要的作用,它直接影响到模型的性能、泛化能力、训练效率、鲁棒性和解释性。 首先,采样方法能够有效地平衡数据集中不同类别的样本数量,使得模型在训练时能够更均衡地学习各个类别的特征,从而避免因数据不平衡导致的偏差。 其次,合理的采样策略可以确保模型在训练过程中能够接触到足够多的样本,避免过拟合和欠拟合问题,提高模型的泛化能力