POJ 2352(顺路讲解一下树状数组)

poj 2352 stars(树状数组,线段树) 这是一道很不错的题目,即可以用线段树做也可以用树状数组,可谓经典。不过当然了线段树是比较难搞,而树状数组是极其简洁的,构造很简单,下面就分别来介绍一下两种方法... 立即下载

接触到的第一道树状数组的题,AC之后感觉对树状数组思想的理解明显清晰了很多,入门必备呀。

先来讲讲树状数组吧。

上个图


如果要求区间和,例如求a3->a8,我们先用数组c来记录下来各个区间的和,那么就可以直接c8-c2就可以得到a3->a8的区间和了。

c[n]数组的下标是用来记录数组a[1]->a[n]的区间和。

再想,我们如果要求s->t的和可以怎么求?

是不是可以用(1->t)减去(1->s-1)?

同理,树状数组也可以用这种方式求和。比如求a[2]的话就可以用c[2]-c[1]来得到a[2]。

关于c数组的记录方法,就不得不提到x&(-x)这个表达式。

x&(-x)是用来计算每次查询或者更新时候c数组的偏移量。

通常写成函数的形式。

int lowbit(int x)
{
    return x & (-x);
}


注意:计算机中负数是用的补码表示的,正数是用的原码表示,可以自己拿张草稿纸来实现一下x&(-x)的计算


关于树状数组的求区间和,如果求区间[1,8],那么直接c[8]就好,但是如果要求区间[4,8]该怎么办?

那么可以用区间[1,8]的和减去区间[1,3]的和就得到了区间[4,8]的和。

那又如何求区间[1,3]呢?我们可以c[2]+c[3]就得到了区间[1,3]的和了。

下面是求区间[1,x]和的函数:

int sum(int x)
{
    int s = 0;
    while (x > 0)
    {
        s += c[x];
        x -= lowbit(x);
    }
    return s;
}

以求区间[1,3]为例,首先x等于3代入方程,3 > 0,则s = c[3],然后执行x-=lowbit(x);

让我们进入lowbit函数,首先3的二进制原码为0000 0011,-3为3的补码,则-3的二进制码为1111 1101,进行&运算之后为1,所以x-=1,此时x为2。由于2>0,所以s此时等于c[3] + c[2]。执行x-=lowbit(x)之后x = 0。循环结束,此时s已经是区间[1,3]的和了。

我们再来看树状数组的更新函数:

int update(int x, int num)
{
    while (x <= MAX)
    {
        c[x] += num;
        x += lowbit(x);
    }
}

和线段树一样,树状数组也是需要对节点所影响到的所有节点进行更新,采取从根到顶的方式。也就是对每个影响到的节点都加上更改信息。

树状数组时间复杂度O(log n)

————————————————————————分割线——————————————————————————————

题意:有n个星星节点,存在星星节点左下角(包括正左和正下)的其他星星节点,则该星星节点比它左下角的星星节点大,level 0表示该星星节点没有比他还小的节点,level 1表示存在一个比该星星节点小的点。输出统计好的每个level等级存在多少星星节点。




解题思路:为什么要用树状数组呢,因为如果你用for循环统计的话,由于数据很大然后又有很多组数据需要统计,那么肯定是会超时的,所以此时需要一种高效的数据结构(感觉像一句废话TAT),树状数组类似于线段树,能够很高效的解决区间问题,将这道题提炼一下其实也就是一个统计区间和的问题,线段树写起来好麻烦的=。=于是乎用了树状数组。

直接上代码:

/*因为是按照y升序输入,所以后面输入对前面输入并无影响
**前x与后x如果相同,那么肯定后x是包含前x的,因为是按照y升序
**即前后x虽是在同一列,但后x肯定在前x上面,即包含前x
**PS:树状数组下标从1开始
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int level[32001];
int c[32001];
int lowbit(int x)
{
    return x & (-x);
}
int sum(int x)
{
    int s = 0;
    while (x > 0)
    {
        s += c[x];
        x -= lowbit(x);
    }
    return s;
}
int update(int x)
{
    while (x <= 32001)
    {
        c[x]++;
        x += lowbit(x);
    }
}
int main()
{
    int n;
    int x, y;
    while(~scanf("%d", &n))
    {
        int N = n;
        memset(level, 0, sizeof(level));
        memset(c, 0, sizeof(c));
        while (n--)
        {
            scanf("%d %d", &x, &y);
            level[sum(x+1)]++;
            update(x+1);
        }
        for (int i = 0; i <= N - 1; i++)
            printf("%d\n", level[i]);
    }
    return 0;
}


华为OD机试双机位C卷:打印机队列 (C++/Py/C/Java/Js/Go) 华为OD机试双机位C卷 打印机队列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 打印机队列。 阅读详情

相关推荐

零基础玩转IndexTTS2:5分钟搭建个人语音克隆工具(支持B站同款情感语音)

本文详细介绍了如何零基础使用IndexTTS2快速搭建个人语音克隆工具,支持B站同款情感语音。IndexTTS2作为自回归零样本TTS系统,突破传统技术限制,实现精准时长控制和丰富情感表达。通过HuggingFace在线演示,用户可轻松克隆音色并调节情感参数,适用于自媒体配音、有声书朗读等场景。

purple的博客 919

POJ_2352 树状数组

这是看了白书之后做的第一道树状数组的题目,注意该题的输入是按Y升序排列的,所以在输入某一序列之前的一定在该序列的左边,故Y的值可以不用考虑 而接下来的就是记录X之前小于X的个数,如果用x[i]来表示i是否出现过,则C[X]是用来表示X[x-1] - X[0]的前缀和,C[x]记录了小于x的个数 AC代码如下: #include #include #include const int

gogntao_ 639

端侧部署与优化:让 AI 真正走进现实生活的关键技术

AI 的开发流程分为 “训练” 与 “推理” 两大阶段。在训练阶段,科研人员依托云端海量数据和高性能 GPU 算力,构建出精度优异的 AI 模型 —— 比如能识别 1000 种物体的图像分类模型、能理解人类语言的自然语言处理模型。但这些在云端 “战绩斐然” 的模型,若直接应用到现实场景中,却会面临三大 “落地困境”。从云端到端侧,从模型压缩到硬件适配,端侧部署与优化技术解决了 AI 落地的核心难题,让 AI 不再是实验室里的 “高精尖技术”,而是融入日常生活的 “实用工具”。

m0_63477749的博客 1053

poj2352_线段树

题目描述:    给出一个根据星星所处坐标位置来计算星星等级的规则。求位于每个等级的星星的个数。   解题思路:    思路一:不用线段树的话,就是直接计算x坐标序列的序号:即遍历x,计算当前x之前有几个数小于等于自己(二分找),记为当前数所处的level。最后统计一下即可。这个是个线性的查找法,所以复杂度是n平方。    思路二:用线段树的话,基本思路就是把建立区间树,然后计算的等级等于遍历x序

河洛 537

5分钟搞定Nano-Banana图片编辑API对接:从Base64编码到生成图片全流程

本文详细介绍了如何快速对接Nano-Banana图片编辑API,基于gemini-2.5-flash-image-preview模型,从环境准备、Base64编码到API调用的全流程。通过实战示例和优化技巧,帮助开发者高效集成AI图片处理能力,提升产品竞争力。

dog123的博客 260

在带有Intel Arc GPU的Windows上安装IPEX-LLM

本文将介绍在 Intel Arc GPU 环境下安装 IPEX-LLM。

wux_labs的博客 1636

【POJ No. 2352】数星星 Stars

【POJ No. 2352】数星星 Stars

代码改变世界 715

SQL Server2008详细安装步骤(超详细步骤)

https://pan.baidu.com/s/1yvolqfU-AbiuGrIzblA7pA 提取码:lzw81.下载好安装包后解压到除C盘以外的磁盘,避免系统卡顿2.使用管理员身份打开安装程序注意:使用管理员身份打开时,此时如果显示以下画面属于正常现象,下载安装即可。因为.net现在有很多软件都需要,包括SQLSERVER2008,它里面有visual studio都要有net,电脑系统没有的话安装一下好了。3.选择全新安装或向现有安装添加新功能4.点击确定5.出现以下画面之后,输入产品密钥即可(密钥在

m0_67402774的博客 4万+

POJ2352:Stars(树状数组)

Description Astronomers often examine star maps where stars are represented by points on a plane and each star has Cartesian coordinates. Let the level of a star be an amount of the stars that are

ACM!荣耀之路! 2994

f103vet6 SD卡SDIO+DMA配置避坑指南:从初始化卡死到稳定读写的全流程解析

本文详细解析STM32F103VET6芯片SD卡SDIO与DMA配置中的常见问题,从初始化卡死到读写不稳定的全流程解决方案。重点分析总线宽度配置、时钟分频调整及DMA通道管理技巧,帮助开发者避开常见陷阱,实现稳定高效的数据存储。

u0v1w2x3的博客 666

在Android中实现SIM卡的读写操作

在上述代码中,我们创建了一个PhoneStateListener的实例,并重写了onSimStateChanged方法来处理SIM卡状态改变的事件。然后,我们通过调用telephonyManager的listen方法注册了这个监听器,并指定了要监听的事件类型为SIM卡状态的改变。在上述代码中,我们调用telephonyManager的sendUssdRequest方法来发送USSD命令,并通过TelephonyManager.UssdResponseCallback来处理USSD响应和发送失败的情况。

2301_79326510的博客 926

POJ 2352 树状数组(线段树)

题意:给出n个点的坐标(n<=15000),坐标范围为[1,32000],最后让你输出ans[i],表示有ans[i]个点左下方有i个点。注意:题目输入是按照y坐标从小到大输入的。 y坐标按照从小到大输入,所以可以只用一维的树状数组,只需要记录横坐标上1到x有多少个点即可。需要离散化,一开始写的没有离散化的T掉了。 代码:#include <cstdio> #include <algorithm

Sky 290

Flowise智能调度系统设计与实现

本文深入探讨Flowise平台的智能调度系统设计与实现,包括调度模型、调度策略、调度优化、调度应用等方面。通过详细的设计方案和实现策略,帮助开发者构建智能的调度系统。本文详细介绍了Flowise平台的智能调度系统设计与实现,包括调度模型、调度策略、调度优化、调度应用等方面。通过详细的设计方案和实现策略,帮助开发者构建智能的调度系统。

加入“Super Entity”,与全能开发团队共探AI智能体与数字人项目,开启前沿技术之旅。 1018

POJ - 2352-Stars ( 树状数组 )

题目链接:点击进入 题目 题意 定义星星的等级为它左下角的星星的数量 ( 正下或者正左也算 ),给你 n 个星星的坐标 ( 按先 y 递增,再 x 递增的顺序给 ),让你求出 0 ~ ( n - 1 ) 各个等级星星的个数 思路 由于给的坐标是有序的,( 先 y 递增,再 x 递增 ),因为等级是在左下角 ( <= y , <= x ) 的 星星数量,考虑 y 是有序递增给出的,这就先天满足一个条件 <=y ,也就是说,对于第 i 个星星,前 i - 1 个的 y 都是小于 y [

Cosmic_Tree的博客 367

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

POJ - 2352 树状数组 + 思维

题目大意:给定n对x与y坐标,求[0,n-1]不同等级下的点的个数。每个点的等级取决于:位于该点下方以及左方的点的个数。 思路:利用一个树状数组维护不同区间下星星的个数;对输入的坐标对按照y排序,y相同的按照x排序(升序)。这样一来,直接使用树状数组维护[1,x]的星星的个数即可,因为每次新加入树状数组的点的等级必将大于等于上一个点的等级。题目给出的坐标可能是0,所以对x坐标进行+1处理。 ...

大魚的个人博客,如有不足,欢迎指正。 331

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

POJ-2352-Stars题解(树状数组 or 线段树)

Stars 传送门:Stars 题意 将星空看做一个平面,在平面上建立直角坐标系,这样在这个平面上的每个星星都有一个坐标。天文学家定义了一个星星的水平:一个星星的水平就是,在这个星星正左边的星星、正下方的星星以及左下方的星星数目之和,就是这个星星的水平。 输入:N代表要输入的星星的个数。接下来的 N 行,每行两个整数 x 和 y ,代表这个星星的横纵坐标。这里在输入时有一个规则,就是按照 y ...

还没有简介~ 391

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

poj 2352 树状数组

昨天看了一个大神对树状数组的讲解,讲解的feich

T_T 587

【POJ 2352】树状数组

1.题目链接。题目大意:给定n个点,对每一个点,求一下这个点左下方有多少个点。(左下方的定义就是:横纵坐标同时小于等于这个点的坐标)。 2.分析:由于题目比较良心,输入的时候y就是有序的,所以其实我们只需要统计一下横坐标小于等于这个点的数的数量即可。那么就比较简单了,我们对x轴建一颗树状数组,初始化为0,每次输入一个数据,把这个数据插入到树状数组里面,注意这里的插入其实是逻辑上的插入,也就是不是...

YG爱木木 301

codeforces 276 C. Little Girl and Maximum Sum

题意:给出一个长度为n的数列,m次询问区间合值,现在要求把数列重新排序使m次询问合值累加最大其实就是某个位置上次数越多使得乘积的数越大,贪心一下,树状数组或者线段树随便搞搞,统计每个位置的询问次数,将次数和原数列从大到小排,依次乘积相加#include<cstring> #include<string> #include<iostream> #include<queue> #include<cstd

每一次AC都是一种感动 494

poj 2352 树状数组(星星的级别)

题意:在二维平面上,每个星星有一个坐标。 思路:

dearmango 586

poj2352_树状数组+离散化

题意:给出一堆坐标点,求小于每一个坐标的坐标个数。 分析:这个题显然也不能遍历,数据太大,会超时。 从poj2299,知道树状数组可以用来求一个排列中array[i]前面小于等于array[i]的个数。 例如array[i]= 9 1 0 5 4 通过树状数组可以知道: array[1]=9--->1 即坐标小于等于1中比9小的个数为1. array[4]=5--->3...

weixin_30745641的博客 219

poj 2352 Stars

点击打开链接poj2352 思路:树状数组 分析: 1 题目是要求出每一个点的左下(正左+正下)有几个星星,那个这个点就是第几层,最后输出0~n-1层的点的个数。比如样列编号为5的星星,左下有3个星星那么5就处于第三层 2 利用树状数组,我们知道树状数组C中,C[i]表示的是原先数组A中的某一段和。题目明确指出输入的时候是按照y值增大的顺序(y相同是x增大),那么我们应该要用什么做为原先的...

我是传奇 161

POJ 2352 Stars(树状数组)

思路: (刚开始想歪了,想着先离散然后用二维BIT来做,结果内存根本hold不住QAQ) 这道题既然是按y升序给我们的序列,我们在遍历到这个序列时,查一下有多少x小于我们当前的x就ok了,区间求和、单点修改自然用树状数组最方便了~ 代码: #include<iostream> using namespace std; const int maxn=15000+5; const in...

Yuhan的博客 251

poj2352——二维偏序+树状数组

题目链接:http://poj.org/problem?id=2352 目录 Description Input Output Sample Input Sample Output Description 天文学家经常研究星图,星图上的星星由平面上的点表示,每颗星星都有笛卡尔坐标。一颗星星的等级是指该星星左下方的星星的数量. 例如,查看上图所示的地图,5号星的等级为3...

mumei的博客 972

POJ - 2352(树状数组)

2019 GDUT Winter Training V ( 算法优化) A - Stars poj传送门 专题传送门 题目大意: 给出一些星星的横坐标和纵坐标,而且星星的纵坐标按非递减排列,如果纵坐标相等,则横坐标按递增排列,任意两颗星星不会重合。如果有n颗星星的横坐标比某颗星星小而且纵坐标不大于那颗星星(即有n颗星星位于那颗星星的左下角或者左边)则此星星的等级为n,最后输出等级为0至n-1的星...

会打代码的兔斯基 630

poj2352(树状数组)

题目链接:https://vjudge.net/problem/POJ-2352 题意:在直角坐标系中给出n个点的 (x,y),(0<=x,y<=32000),定义每个点的level为(x',y')的数量,其中x'<=x,y'<=y。输出所有level的点的个数。 思路:这几天开始写树状数组的题,加油!!因为输入为按y升序排列,在y相等时按x升序排列。所以当输入点i时,...

weixin_34162695的博客 143
上一篇: 线段树入门理解
下一篇: POJ 1328(贪心)
_Phoenix
博客等级 码龄12年 27粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值