线段树

一、线段树:线段树可以用于指定区间求和,区间求最大值,区间修改,单点修改等。
1 先设立树状结构体

在这里插入代码片struct Node{
	int r,l;
int nsum;
}segTree[MAXN*4]

2 线段树初始化

void Bulid(int i,int r,int l){
	seqTree[i].l=l;
seqTree[i].r=r;
int mid = (seqTree[i].l+seqTree[i].r)>>1;
Build(i<<1,r,mid);
Build(i<<1|1,mid+1,l);
seqTree[i].nsum=seqTree[i<<1].nsum+seqTree[i<<1|1].nsum;//上一层等于其分支	之和
}	

3 求某特定区间的和 (递归型求法)

int Query(int i,int l,int r){
if(seqTree[i].r==r&&seqTree[i].l==l)
return seqTree[i].nsum;
int mid =  (seqTree[i].l+seqTree[i].r)>>1;
if(r<=mid)
Query(i<<1,l,mid);
else If(l>mid)
Query(i<<1|1,mid+1,r);
else Query(i<<1,l,mid)+Query(i<<1|1,mid+1,r);
}

4 单点修改(t为特定项b为修改值b为正则为加 反之为减)

void Add(int i,int t,int b){  
seqTree[i].nsum+=b; //该叶节点的父亲节点的值都要修改
if(seqTree[i].r==t&&seqTree[i].l==t)//找到该叶节点的时候结束
return;
int mid =  (seqTree[i].l+seqTree[i].r)>>1;
if(r<=mid)
Add(i<<1,t,b);
else 
Add(i<<1|1,t,b);
}
hud1556题
/*
 HDU 1166  敌兵布阵
 */
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
const int MAXN=50005;
struct Node
{
    int l,r;
    int nSum;
}segTree[MAXN*4];
int num[MAXN];
void Build(int i,int l,int r)
{
    segTree[i].l=l;
    segTree[i].r=r;
    if(l==r)
    {
        segTree[i].nSum=num[l];
        return;
    }
    int mid=(l+r)>>1;
    Build(i<<1,l,mid);
    Build(i<<1|1,mid+1,r);
    segTree[i].nSum=segTree[i<<1].nSum+segTree[i<<1|1].nSum;
}
void Add(int i,int t,int b)
{
    segTree[i].nSum+=b;
    if(segTree[i].l==t&&segTree[i].r==t)   return;
    int mid=(segTree[i].l+segTree[i].r)>>1;
    if(t<=mid)  Add(i<<1,t,b);
    else       Add(i<<1|1,t,b);
}
int Query(int i,int l,int r)
{
    if(l==segTree[i].l&&r==segTree[i].r)
        return segTree[i].nSum;
    int mid=(segTree[i].l+segTree[i].r)>>1;
    if(r<=mid)  return Query(i<<1,l,r);
    else if(l>mid)   return Query(i<<1|1,l,r);
    else  return Query(i<<1,l,mid)+Query(i<<1|1,mid+1,r);
}
int main()
{
    int T;
    int iCase=0;
    int n,i;
    char str[10];
    int a,b;
    scanf("%d",&T);
    while(T--)
    {
        iCase++;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
            scanf("%d",&num[i]);
        Build(1,1,n);
        printf("Case %d:\n",iCase);
        while(scanf("%s",&str))
        {
            if(strcmp(str,"End")==0) break;
            scanf("%d%d",&a,&b);
            if(strcmp(str,"Add")==0) Add(1,a,b);
            else if(strcmp(str,"Sub")==0)  Add(1,a,-b);
            else  printf("%d\n",Query(1,a,b));
        }
    }
    return 0;
}

树状数组:

二、离散化
补:
1 左移运算符 <<
有移运算符 >>
x<<1 相当于将x2
x<<1|1 相当于将x
2再+1
2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的影城管理系统,源码+数据库+论文答辩+毕业论文+视频演示 随着现在网络的快速发展,网上管理系统也逐渐快速发展起来,网上管理模式很快融入到了许多生活之中,随之就产生了“小徐影城管理系统”,这样就让小徐影城管理系统更加方便简单。 对于本小徐影城管理系统的设计来说,系统开发主要是采用java语言技术,在整个系统的设计中应用MySQL数据库来完成数据存储,具体根据小徐影城管理系统的现状来进行开发的,具体根据现实的需求来实现小徐影城管理系统网络化的管理,各类信息有序地进行存储,进入小徐影城管理系统页面之后,方可开始操作主控界面,主要功能包括管理员:首页、个人中心、用户管理、电影类型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订单管理,用户前台;首页、电影信息、电影资讯、个人中心、后台管理、在线客服等功能。 本论文主要讲述了小徐影城管理系统开发背景,该系统它主要是对需求分析和功能需求做了介绍,并且对系统做了详细的测试和总结。具体从业务流程、数据库设计和系统结构等多方面的问题。望能利用先进的计算机技术和网络技术来改变目前的小徐影城管理系统状况,提高管理效率。 关键词:小徐影城管理系统;Spring Boot框架,MySQL数据库
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值