首页 > 其他分享 >线段树

线段树

时间:2023-03-25 11:55:37浏览次数:24  
标签:return int 线段 tree mid input make

#include<cstdio>
#pragma warning (disable:4996)
using namespace std;
int a[10001];

//结构体,存线段树
struct node
{
    int l, r, v;
}tree[40001];

//建树
void make_tree(int p, int x, int y)
{
    tree[p].l = x;
    tree[p].r = y;
    if (x < y)
    {
        int mid = (x + y) / 2;
        make_tree(p * 2, x, mid);
        make_tree(p * 2 + 1, mid, y);
    }
    if (x == y) return;
}

//储值
int input(int p)
{
    if (tree[p].l == tree[p].r)
    {
        tree[p].v = a[tree[p].l];
        return tree[p].v;
    }
    tree[p].v = input(tree[p * 2].v) + input(tree[p * 2 + 1].v);
    return tree[p].v;
}

//单点修改
void change(int p, int x, int V)
{
    tree[p].v += V;
    if (tree[p].l == tree[p].r) return;
    if (x <= tree[p * 2].r)
        change(p * 2, x, V);
    if (x >= tree[p * 2 + 1].r)
        change(p * 2 + 1, x, V);
}

//查询*(计算xy区间内数的和)
int total = 0;
int find(int x, int y, int p)
{
    if (tree[p].l >= x && tree[p].r <= y)
    {
        total += tree[p].v;
        return total;
    }
    if (x <= tree[p * 2].r)
        find(x, y, p * 2);
    if (x >= tree[p * 2 + 1].l)
        find(x, y, p * 2 + 1);
}

int main()
{
    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
    }
    make_tree(1, 1, n);//建立线段树
    for (int i = 1; i <= m; i++)
    {
        int A, x, y, k;
        scanf("%d", &A);
        if (A == 1)
        {
            scanf("%d %d %d", &x, &y, &k);
            for (int j = x; j <= y; j++)
                change(1, j, k);
        }
        else if (A == 2)
        {
            scanf("%d %d", &x, &y);
            printf("%d", find(x, y, 1));
        }
    }
}

 

标签:return,int,线段,tree,mid,input,make
From: https://www.cnblogs.com/Phantomhive/p/17254467.html

相关文章

  • 黑暗爆炸OJ #4695. 最假女选手 吉司机线段树
      传送门  题解还是这篇博客。PS:现在不挂梯子好像上不去了。  由于这篇博客只是讲的比较详细但是没有代码。贴一贴代码并且稍微讲讲每个函数的作用。  这题和......
  • 吉司机线段树
    吉司机线段树线段树3https://www.luogu.com.cn/problem/P6242Q1.对于所有的i∈[l,r],将Ai加上k(k可以为负数)对于k的值,我们分类讨论,讨论其对区间最大值的影响 1)k=......
  • bzoj 2006 [NOI2010] 超级钢琴 线段树求区间极值+优先队列
    挺神奇的一道题,唯一想不通的是为什么放在主席树的题单里..首先暴力找出所有的合法区间显然是不可能的。考虑怎么贪心,假如固定每个L作为左端点,那么合法的区间就是[L+l-1,L......
  • 2023年中国传媒大学程序设计大赛 G.跳台滑雪 线段树
    传送门#include<iostream>#include<cstring>#include<iomanip>#include<algorithm>#include<stack>#include<queue>#include<numeric>#include<cassert>#......
  • Vue+Openlayers实现绘制线段并测量距离显示
    场景在上面已经实现交互式绘制线段基础上,怎样实现测量距离。注:关注公众号霸道的程序猿获取编程相关电子书、教程推送与免费下载。实现1、页面上添加按钮与map<template>......
  • CAD如何检查线是否连接?CAD线段连接检查技巧
    在CAD制图过程中,当需要生成填充、计算面积和生成面域时,偶尔会遇到区域未封闭的情况。此时便需要检查图纸中的CAD线段连接状态,那CAD如何检查线是否连接呢?本文小编就来给大家......
  • 【Unity3D】使用GL绘制线段
    1前言​线段渲染器LineRenderer、拖尾TrailRenderer、绘制物体表面三角形网格从不同角度介绍了绘制线段的方法,本文再介绍一种新的绘制线段的方法:使用GL绘制线段。......
  • [DS记录] 线段树 Beats
    0.前言所谓线段树Beats,就是吉老师打出来的线段树。1.基本操作P6242线段树3区间加区间取min区间最大值区间和区间历史最大值首先考虑134咋做。就......
  • [浅谈] 线段树优化建边
    \(\color{purple}\text{P6348[PA2011]Journeys}\)\(\color{green}\text{2023.1.1010:58}\)线段树优化建边。题意:给定一个图,每次对区间\([a,b]\)至区间\([c,d]\)建......
  • 线段树模板
    扫描线#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;constintN=4e5+10;intread(){ intx=0,f=1;charc=getchar(); while(c>'9'||c<'0')......