首页 > 其他分享 >【模板】线段树1(洛谷P3372)

【模板】线段树1(洛谷P3372)

时间:2023-11-21 22:56:30浏览次数:34  
标签:ch 洛谷 int void mid tag inline P3372 模板

  1 #include <iostream>
  2 #include <cstdio>
  3 
  4 using namespace std;
  5 
  6 template <class T>
  7 inline void read(T &s)
  8 {
  9     s = 0;
 10     int w = 1;
 11     char ch = getchar();
 12     while (ch < '0' || ch > '9')
 13     {
 14         if (ch == '-')
 15             w = -1;
 16         ch = getchar();
 17     }
 18     while (ch >= '0' && ch <= '9')
 19     {
 20         s = s * 10 + (ch ^ '0');
 21         ch = getchar();
 22     }
 23     s *= w;
 24 }
 25 
 26 template <class T>
 27 inline void write(T x)
 28 {
 29     if (x < 0)
 30     {
 31         putchar('-');
 32         x = -x;
 33     }
 34     if (x > 9)
 35         write(x / 10);
 36     putchar(x % 10 + '0');
 37 }
 38 #define int long long
 39 const int N = 1e5 + 7;
 40 int n, m, a[N], ans[N << 2], tag[N << 2];
 41 inline int ls(int x) { return x << 1; }     // 返回左儿子下标 2*i
 42 inline int rs(int x) { return x << 1 | 1; } // 返回右儿子下标 2*i+1
 43 inline void push_up(int pos)                // 计算当前结点的值
 44 {
 45     ans[pos] = ans[ls(pos)] + ans[rs(pos)];
 46 }
 47 void build(int p, int l, int r)
 48 {
 49     tag[p] = 0;
 50     if (l == r) // 到达叶节点
 51     {
 52         ans[p] = a[l];
 53         return;
 54     }
 55     int mid = l + r >> 1;
 56     build(ls(p), l, mid);     // 建立左子树
 57     build(rs(p), mid + 1, r); // 建立右子树
 58     push_up(p);               // 更新当前结点的值
 59 }
 60 inline void f(int p, int l, int r, int k) // 区间修改 + 打lazy标记
 61 {
 62     tag[p] = tag[p] + k;
 63     ans[p] = ans[p] + k * (r - l + 1);
 64 }
 65 inline void push_down(int p, int l, int r) // 将当前结点的lazy标记下传
 66 {
 67     int mid = l + r >> 1;
 68     f(ls(p), l, mid, tag[p]);
 69     f(rs(p), mid + 1, r, tag[p]);
 70     tag[p] = 0;
 71 }
 72 inline void update(int nl, int nr, int l, int r, int p, int k) // 更新区间
 73 {
 74     if (nl <= l && r <= nr) // [nl,l,r,nr] 当前区间被完全覆盖
 75     {
 76         ans[p] += k * (r - l + 1);
 77         tag[p] += k;
 78         return;
 79     }
 80     push_down(p, l, r);
 81     int mid = l + r >> 1;
 82     if (nl <= mid) // 若与左儿子有交集
 83         update(nl, nr, l, mid, ls(p), k);
 84     if (nr > mid)
 85         update(nl, nr, mid + 1, r, rs(p), k);
 86     push_up(p);
 87 }
 88 int query(int q_x, int q_y, int l, int r, int p) // 返回区间和
 89 {
 90     int res = 0;
 91     if (q_x <= l && r <= q_y)
 92         return ans[p];
 93     int mid = l + r >> 1;
 94     push_down(p, l, r);
 95     if (q_x <= mid)
 96         res += query(q_x, q_y, l, mid, ls(p));
 97     if (q_y > mid)
 98         res += query(q_x, q_y, mid + 1, r, rs(p));
 99     return res;
100 }
101 
102 signed main()
103 {
104     // 输入
105     read(n), read(m);
106     for (int i = 1; i <= n; ++i)
107         read(a[i]);
108     build(1, 1, n);
109     while (m--)
110     {
111         int opt, x, y, k;
112         read(opt), read(x), read(y);
113         switch (opt)
114         {
115         case 1:
116             read(k);
117             update(x, y, 1, n, 1, k);
118             break;
119         case 2:
120             printf("%lld\n", query(x, y, 1, n, 1));
121             break;
122         }
123     }
124     // system("pause");
125     return 0;
126 }

 

标签:ch,洛谷,int,void,mid,tag,inline,P3372,模板
From: https://www.cnblogs.com/nijigasaki14/p/17847827.html

相关文章

  • 组合数模板(省赛)
    组合数+快速幂#include<bits/stdc++.h>//#pragmaGCCoptimize("Ofast")#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#include<cmath>//#definedoublelongdou......
  • 【树链剖分】P3401 洛谷树 题解
    P3401考虑先将路径权值进行转化,因为很难对路径直接进行统计。考虑如何表示出这条路径的权值。记\(s_i=\oplus_{j\in\text{path}(1,i)}w_j\),其中\(\text{path}(i,j)\)表示\(i\)到\(j\)的路径上的边集。则\(u\tov\)的路径的权值为\(s_u\opluss_v\)。现在转变为......
  • KMP模板
    #include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constintN=1e3+10,inf=0x3f3f3f3f;intnex[N];//nex[j]的意思是当子串的第j个字符和主串的第i个字符不匹配时,我们应该从子串的nex[j]字符开始重新匹配stringa,b;/*kmp指针回退j=nex[j-1]......
  • 行为型模式-模板方法模式
    1什么是模板方法模式模板方法模式是一种行为设计模式,它定义了一个算法的骨架,将一些步骤的具体实现延迟到子类中。这样可以在不改变算法结构的情况下,允许子类根据自身的需求来实现特定的步骤。模板方法模式通常由一个抽象基类提供一个模板方法,该方法定义了算法的骨架,并调用一系......
  • 【AD域控】组策略模板的导入与使用
    接到了leader的需求,希望能够设置浏览器的主页,由于我们是运维岗,负责AD域控,脑海中第一时间就跳出了舍近求远的域控设置。当然最后也是没有成功,但总结出了在Windows设备上配置MicrosoftEdge策略设置,血泪总结!【AD域控】组策略模板的导入与使用 1.下载MicrosoftEdgeforBusiness......
  • pp_orange的多项式模板
    /*Codebypp_orange*/#include<bits/stdc++.h>#definem_p(a,b)make_pair(a,b)#definepbpush_back#definelllonglong#defineullunsignedlonglong#definelldlongdouble#defineinf0x7FFFFFFF#defineinff9223372036854775807#definerep(i,l,......
  • wpf 自定义按钮模板
    <ButtonWidth="300"Height="100"Content="自定义按钮"Background="Bisque"FontSize="23"Foreground="Orchid"><Button.Template><ControlTemplateTargetType=&qu......
  • GUI-Guider 生成打印机模板并在 ESP32-S3 上面运行
    原文:https://www.jianshu.com/p/51fc4c1d1e66目录目录ESP32-S3移植GUI-Guider的打印机例程前提准备1.GUIGuider生成工程根据屏幕参数新建工程2.移植代码到lvgl例程里将生成的代码作为组件使用与参考链接中的不同调用生成的代码ESP32-S3移植GUI-Guid......
  • 洛谷P8612 取宝
    经典的记忆化搜索,一开始因为最后的答案忘记加取模卡了半天,真是愚蠢至极。#include<iostream>#include<algorithm>#include<stdio.h>#include<stdlib.h>#include<cstring>usingnamespacestd;constintN=55,mod=1e9+7;intf[N][N][15][15];//横坐标纵......
  • 洛谷P8602 大臣的旅费
    这道题既可以用图论多次求单源最短路暴力来做,也可以用正解:求树的直径来做。#include<stdio.h>#include<stdlib.h>#include<algorithm>#include<iostream>#include<vector>usingnamespacestd;typedeflonglongll;constintN=1e5+5,M=N<<1;in......