线段树基本操作模板 hdu1166 hdu1754

kuangbin线段树专题 写在前面的话 博主也是个新手, 最近正在写kuangbin的线段树专题, 感觉整体线段树专题的难度也是从易到难的. 但是的确在做题过程中遇到了 许多困难, 也学到了很多东西, 希望这些能帮到后来者. 当然如果您有不同的见解, 或者发现了代码中的错误, 也希望您能提出我们一同探讨. 关于个人写代码习惯: ​ ①本人没有太多宏定义使用的习惯, 只有一个for循环的宏定义, 希望不会影响到大家的代码观感. ​ ②本人写代码有压行的习惯. 因为希望自己写出的代码尽可能短以及利于自己理解. 如果这篇博客帮助到了您, 阅读详情

啥叫线段树:http://dongxicheng.org/structure/segment-tree/

自己参考,自己查,要考软考,没时间,。。。

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166


//Accepted	1166	46MS	2256K	2359 B	C	丹明扬
#include <stdio.h>
#include <string.h>
#define M  500002

struct node
{
    int left;   //左边界
    int right;  //右边界
    int mid;    //在add或sub时,是加在左子树呢还是右子树呢
    int num;    //人数
} p[M];
void init(int a,int b,int n)
{
    p[n].left = a;
    p[n].right = b;
    p[n].mid = (a+b)/2;
    p[n].num = 0;
    if(a + 1 == b)   //当分的不能再分时,例如[0,1]
    {
        return ;
    }
    init(a,(a+b)/2,2*n);  //n若从1开始,那么2*n就是左子树下标,左边界还是a,右边界取中值
    init((a+b)/2,b,2*n+1); //同理,得右子树
}
void add(int pos,int value,int n)
{
    p[n].num += value;
    if(p[n].left + 1 == p[n].right)
        return ;
    if(pos < p[n].mid)
    {
        //加在左子树
        add(pos,value,2*n);
    }
    else
    {
        add(pos,value,2*n + 1);
    }
}
void sub(int pos,int value,int n)
{
    p[n].num -= value;
    if(p[n].left + 1 == p[n].right)
        return ;
    if(pos < p[n].mid)
        sub(pos,value,2*n);
    else
        sub(pos,value,2*n + 1);
}
int query(int a,int b,int n)
{
    if(p[n].left == a && p[n].right == b)  
        return p[n].num; 
    if(a < p[n].mid )
    {
        if(b <= p[n].mid )
        {
            return query(a,b,2*n);
        }
        else
        {
            return query(a,p[n].mid,2*n) + query(p[n].mid,b,2*n + 1);
        }
    }
    else
        return query(a,b,2*n+1);
}
int main()
{
    int icase;
    int N,i,va;
    char c[10];
    int ax,ay;
    int times = 0;
    scanf("%d",&icase);
    while(icase --)
    {
        memset(c,0,sizeof(c));
        scanf("%d",&N);
        init(1,N+1,1);
        for(i = 1; i <= N; i++)
        {
            scanf("%d",&va);
            add(i,va,1);
        }
        printf("Case %d:\n",++times);
        while(1)
        {
            scanf("%s",c);
            if( !strcmp(c,"End"))
            {
                break;
            }
            scanf("%d%d",&ax,&ay);
            if( strcmp(c,"Query") == 0)
            {
                printf ("%d\n",query(ax,ay+1,1));
            }
            else if(strcmp(c,"Add") == 0)
            {
                add(ax,ay,1);
            }
            else if(strcmp(c,"Sub") == 0)
            {
                sub(ax,ay,1);
            }

        }
    }
    return 0;
}

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754


////Accepted	1754	968MS	8420K	2025 B	C	丹明扬
#include <stdio.h>
#include <string.h>
#define M  20000002

struct node
{
    int left;   //左边界
    int right;  //右边界
    int mid;    //在add或sub时,是加在左子树呢还是右子树呢
    int score;    //分数
} p[M];
int maxx(int a,int b)
{
    return (a > b) ? a:b;
}
void init(int a,int b,int n)
{
    p[n].left = a;
    p[n].right = b;
    p[n].mid = (a+b)/2;
    p[n].score = -999;
    if(a + 1 == b)   //当分的不能再分时,例如[0,1]
    {
        return ;
    }
    init(a,(a+b)/2,2*n);  //n若从1开始,那么2*n就是左子树下标,左边界还是a,右边界取中值
    init((a+b)/2,b,2*n+1); //同理,得右子树
}
void update(int pos,int value,int n)
{
    if(value > p[n].score)
        p[n].score = value;  //把pos所在位置都更新了,第一次肯定在[1,n]。。。然后,看在左还是右。。。
    if(p[n].left + 1 == p[n].right)
        return ;
    if(pos < p[n].mid)
    {
        update(pos,value,2*n);
    }
    if(pos >= p[n].mid)
    {
        update(pos,value,2*n+1);
    }
}
int query(int a,int b,int n)
{
    if(p[n].left == a && p[n].right == b) //如果[a,b]为叶子节点
        return p[n].score;
    if(a < p[n].mid )
    {
        if(b <= p[n].mid)
            return query(a,b,2*n);
        else   //a,b分在mid两侧,求最大的
            return maxx( query(a,p[n].mid,2*n),query(p[n].mid,b,2*n+1) );
    }
    else
        return query(a,b,2*n+1);
}
int main()
{
    int n,m,t,a,b,i;
    char ch;
    while(scanf("%d %d",&n,&m) != EOF)
    {
        init(1,n+1,1);
        for(i = 1; i <= n; i++)
        {
            scanf("%d",&t);
            update(i,t,1);
        }
        for(i = 1; i <= m; i++)
        {
              getchar();
              //这里用fflush(stdin);不对啊
             scanf("%c",&ch);
            //这里加个fflush(stdin);,就死机啊啊啊                                          ????这地方的问题交给你。
            scanf("%d %d",&a,&b);
            if(ch == 'Q')
                printf("%d\n",query(a,b+1,1));//注意是b+1而不是b。因为线段树是一个左开右闭的的区间。
            else
                update(a,b,1);
        }
    }
    return 0;
}

看着很像吧,基本模板是这样。先会基本思想和套路,变化和应用要考多做题!!!

Manus通用AI智能体完全使用指南(2025最新版)——从注册到高阶技巧全解析 阅读详情

相关推荐

揭秘无人机前沿领域的科技新突破

本文旨在系统性地介绍无人机技术在前沿领域的最新突破,涵盖从基础理论到实际应用的各个方面。我们将重点关注那些正在改变无人机行业面貌的关键技术创新,并分析它们对未来发展的影响。文章首先介绍无人机技术的基础概念和背景,然后深入探讨六个关键领域的技术突破,接着分析实际应用案例,最后展望未来发展趋势。自主导航系统(SLAM):同时定位与地图构建技术,使无人机能在未知环境中自主导航计算机视觉(CV):使无人机能够"看"和理解周围环境的技术5G通信:第五代移动通信技术,提供高速、低延迟的数据传输能源管理。

AI天才研究院 1490

线段树_例题(HDU1166—敌兵布阵+HDU1754—I Hate It )+板子

又是一个学习周期,今天学了线段树基础版的,早上困得一批,什么也没听进去,只能下午自己来脑补了 首先说什么是线段树,这有一篇大佬的bloghttps://blog.youkuaiyun.com/zearot/article/details/4829945线段树详解, 自我理解就是一个进阶版的分治过程,先把整个大区间拆分开来,弄成好过好多个小区间(当然拆到最后还剩一个节点)通过对小区间操作然后修改与他...

From now on...的Blogs 249

【图神经网络】从0到1使用PyG手把手创建异构图

异构图的准确定义如下:异构图(Heterogeneous Graphs):一个异构图GGG有一组节点V=v1,v2,...,vnV=v_1,v_2,...,v_nV=v1​,v2​,...,vn​和一组边E=e1,e2,...,emE=e_1,e_2,...,e_mE=e1​,e2​,...,em​组成,其中每个节点和每条边都对应着一种类型,用TvT_vTv​表示节点类型的集合,TeT_eTe​表示边类型的集合,一个异构图有两个映射函数,分别将每个节点映射到其对应的类型ϕv:V→Tv\phi_v:V\rig

小哲的博客 7833

kuangbin 线段树 - HDU - 1754 I Hate It (线段树单点修改模板题)

kuangbin 线段树 - HDU - 1754 I Hate It (线段树单点修改模板题) 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。 这让很多学生很反感。 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。 Input 本题目包含多组测试,请处理到文件结束。 在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000),分别

ACM-ICPC 现役(铜牌) Codeforces Rating: 2172 208

海康威视摄像头网线连接笔记本电脑,客户端提示:1连接设备失败。设备不在线或网络原因引起的连接超时等。(HCNetSDK.dll[7].)解决方案

1.环境 电脑:联想笔记本电脑(win10系统) 摄像头:海康威视DS-2CD3T20D-i5,4mm 连接方式:直接用网线将摄像头和摄像头连接 2.问题: 客户端出现如下提示: 3. 解决流程: 1.确认网线是否有问题:我的网线指示灯常亮,并且设备能够被搜索到,只是一直显示离线 2.按照网上教程直接配置摄像头的ip地址与电脑同一网段:登录失败。 错误码为 HCNetSDK.dll[7].(连接设备失败。设备不在【海康威视吧】_百度贴吧 失败了,没有反应 3.查看有线网卡的地

weixin_48911487的博客 3万+

学习笔记:物理信息神经网络(PINN)

PINN 的强大在于它打破了传统数值方法的限制,将神经网络的非线性拟合能力与物理方程的严谨性结合起来。它在处理高维、数据稀缺、复杂物理约束的场景下尤其出色。当然,PINN 也有收敛慢、梯度消失等挑战,比如,复杂 PDE 可能导致梯度传播困难,收敛慢(梯度消失)、于具有快速变化特征的系统,如冲击波,标准 PINN 可能精度不足,需要改进策略,比如自适应采样或多尺度特征提取。但随着研究深入,这些问题正在不断被解决。物理或化学方程为什么往往是偏微分方程?什么是物理信息神经网络(PINN)?x_%7Bi%7D。

qq_52635735的博客 1万+

线段树模板专题从入门到放弃

先附上学习线段树时做的笔记 https://blog.youkuaiyun.com/weixin_42172261/article/details/88367758 HDU 1166 敌兵布阵 线段树单点增减 注意update函数中当更新了单点信息后还要pushup #include <iostream> #include <cstdio> #include <cstring&...

H4ppyD0g的博客 229

零基础小白Coze知识普及【新手必备资料!!】

AI智能体|扣子(Coze)工作流搭建【零基础小白Coze知识普及】 1、领取100+工作流源码!复制到扣子即可直接使用 2、AI认知+9节商业智能体拆解 3、500+各行业高质量提示词 4、超低价格使用即梦文生图图生视频和banana生图

Zhima0522的博客 3250

线段树 单点修改+区间修改和查询 例题+代码

目录 【单点修改,区间查询 例题】 【hdu 1166 敌兵布阵】 【hdu 1754I Hate It 】 【区间修改,区间查询 例题】 【hdu 1698Just a Hook】 【单点修改,区间查询 例题】 1.单点修改、区间查询 - hdu 1166 敌兵布阵 2.单点修改、区间查询最值 - hdu 1754I Hate It 【hdu 1166 敌兵布阵】 ...

菜鸡成长史 1109

HTML音乐爱心3D旋转相册完整源码

HTML音乐爱心3D旋转相册完整源码

LilyCoder的博客 1380

史上最全工商银行核心系统建设历程:从“数据集中”到“ECOS”2.0,见证银行业信息科技跨时代发展征程

ECOS工程的直接成果是建成了工商银行第五代信息系统,即从单一核心银行系统到去核心化开放生态系统,率先开启了以智能化、开放化为特征,数据驱动引领经营模式变革,创新提出了一整套国际领先的分布式开放生态银行系统建设方案,在大型银行全分布式系统架构、主机下移、银行系统生态化转型、大规模交易型分布式数据库等多个领域再次实现“0到1”的突破,建成了具备国际领先水平的全分布式开放生态银行系统,继续勇立数字化转型潮头,推动高质量发展再上新台阶。工商银行的业务连续性管理水平实现了跨越式发展,有力地保障了业务发展。

银行信息系统应用架构详解 824

乐师理工acm集训-线段树

文章目录HDU1166 敌兵布阵【线段树+单点更新+区间和】解题思路AC代码HDU1754 I Hate It【线段树+单点更新+区间最值】解题思路AC代码HDU2795 Billboard题目大意解题思路AC代码HDU1698 Just a Hook题目大意解题思路AC代码ZOJ1610 Count the Colors题目大意解题思路AC代码 HDU1166 敌兵布阵【线段树+单点更新+区间和】 传送门:HDU1166 敌兵布阵 解题思路   线段树模板题 AC代码 #include<bits/s

Lucas9的博客 267

虚幻商城 蓝图汇总

虚幻引擎是一个非常强大和灵活的游戏开发工具,拥有众多的蓝图可以帮助我们更高效地工作。

一碗清深的博客 1507

线段树单点更新 - HDU 1166 敌兵布阵 1754 I Hate it

上个学期看了很多复杂的数据结构,但是由于之前对简单数据结构的了解不够深入,所以,没办法真正了解复杂数据结构的内涵,最近几天又看了一下线段树,总结一下线段树单点更新。 相信很多初学线段树的人,看了别人的模板代码都是只知其一,不知其二,只知道这道题求区间和是这么写,换一道题换一个题目背景自己就不知道要怎么修改了。 其实,可以这么理解,线段树在建树的过程中,叶子结点上储存的就是你所输入的那些数值,那

Moressette流沙的博客 532

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

vj线段树专题

vj线段树专题题解 单点更新模板 void build(int x,int l,int r){//sum[x]控制l-r区域 if(l==r){Sum[x]=num[l];return ;} int mid=l+((r-l)>>1); build(x<<1,l,mid); build(x<<1|1,mid+1,r); Su...

weixin_33709590的博客 165

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

线段树基本操作(单点更新,区间更新,区间最大最小值,区间和)poj3468&poj3264&hdu1698&&hdu1166&hdu1754

poj3468线段树区间求和 +区间更新(模板)#include &lt;iostream&gt; #include &lt;algorithm&gt; #include &lt;string.h&gt; #include &lt;stdio.h&gt; #define L o&lt;&lt;1//*2 #define R o&lt;&lt;1|1//*2+1 #define ll long lo...

keepcoral的博客 367

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

HDU1166敌兵布阵&&HDU1754I Hate It (线段树)

两道裸线段树模板题C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C国的监视。 中央情报局要研究敌人究竟...

光明~~~ 2万+

线段树简单单点更新模板+练习

HDU-1754 I Hate It http://acm.hdu.edu.cn/showproblem.php?pid=1754 Problem Description 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需...

weixin_30299539的博客 120

线段树、树状数组入门

HDU-1166 思路:更新区间,结构体内保存最大值 1 #include<stdio.h> 2 #include<string> 3 #include<iostream> 4 using namespace std; 5 const int MAXN = 5e4+5; 6 int a[MAXN]; 7 struct ...

bangni7669的博客 162

HDU - 1166敌兵布阵+HDU-1754 I Hate It (线段树单点更新——累加/最大值)

线段树单点更新,模板题 HDU1166 敌兵布阵 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了。A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些工兵营地的活动情况。由于采取了某种先进的监测手段,所以每个工兵营地的人数C国都掌握的一清二楚,每个工兵营地的人数都有可能发生变动,可能增加或减少若干人手,但这些都逃不过C...

资深罚时选手 340

线段树

线段树单点add,区间sum查询的模板 #include<cstdio> #include<cstring> using namespace std; const int maxn=50000+5; //线段树需要维护的信息 int sum[maxn*4]; #define lson i*2, l, m #define rson i*2+1, m+1, r ...

wcxyky的博客 242

线段树模板

这里写自定义目录标题新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 在这里插入代码片# 欢迎使用Markdow...

Cichard 141

kuangbin专题线段树

HDU 1166 敌兵布阵 思路 线段树单点修改模板 代码 #include<iostream> #include<cstring> #include<algorithm> #include<cstdio> using namespace std; const int N = 50010; struct Node { int l, r; int sum; } tr[N * 4]; int w[N]; void pushup(int u

exercise_smile的博客 291

zkw线段树 模板整理与例题

zkw线段树 目录 zkw线段树 基本知识 单点修改+区间查询 分析与代码 例题 敌兵布阵 HDU1166 例题 I Hate It HDU1754 区间加减+单点查询 分析与代码 例题A Simple Problem with Integers HDU4267 区间最大子段和 分析与代码 例题 Can you answer these queries III H...

qcwlmqy的博客 845

2019年秋季学期第六周周任务——YCG

(为啥没有第五周?去问国庆。) 周任务: 算法任务: 朴素线段树 具体任务: 线段树就是一种比较超乎萌新(我)想象的数据结构吧,初识就觉得“哇,好难,好厉害的亚子”,用多了就觉得还好。它的关键在于一种区间的思想,lazy标记的使用的那种延迟下传的思想,能活用这种思想才是学习线段树的作用吧。 好用的板子千篇一律,有趣的bug万行难求。为了不影响各位的“找bug”或者“找我的板子到底和别人的板子有啥...

weixin_43751631的博客 230

线段树 —— 模板习题

HDU 1166 &amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;nbsp;敌兵布阵 PS:线段树维护区间和 #include&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;bits/stdc++.h&amp;amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; using namesp

Scar_Halo 329
上一篇: poj 1950
下一篇: java大数类
i丹明扬
博客等级 码龄15年 331粉丝 115原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值