首页 > 其他分享 >【线段树入门】P3353 在你窗外闪耀的星星(区间求和)

【线段树入门】P3353 在你窗外闪耀的星星(区间求和)

时间:2023-12-12 12:55:43浏览次数:28  
标签:P3353 int 线段 mid long build 闪耀 sum define

这题正解是前缀和,我用线段树练练手><

 1  1 //笔记-自用
 2  2 //#pragma GCC optimize("Ofast")
 3  3 //#pragma GCC optimize("unroll-loops")
 4  4 #define _CRT_SECURE_NO_WARNINGS
 5  5 #define All(a) a.begin(),a.end()
 6  6 #define INF 2147483647
 7  7 #include<bits/stdc++.h>
 8  8 #include<numeric>
 9  9 using namespace std;
10 10 typedef unsigned long long ull;
11 11 #define int long long//再也不用担心开longlong了><
12 12 typedef pair<int, int>PII;
13 13 const int N = 1e5 + 5;
14 14 #define lc p<<1
15 15 #define rc p<<1|1
16 16 struct node {
17 17     int l, r, sum, add;
18 18 }tr[N * 4];
19 19 int w[N];
20 20 void pushup(int p) {
21 21     tr[p].sum = tr[lc].sum + tr[rc].sum;
22 22 }
23 23 void pushdown(int p) {
24 24     if (tr[p].add) {
25 25         tr[lc].sum += tr[p].add * (tr[lc].r - tr[lc].l + 1);
26 26         tr[rc].sum += tr[p].add * (tr[rc].r - tr[rc].l + 1);
27 27         tr[lc].add += tr[p].add;
28 28         tr[rc].add += tr[p].add;
29 29         tr[p].add = 0;
30 30     }
31 31 }
32 32 void build(int p, int l, int r) {
33 33     tr[p] = { l,r,w[l],0 };
34 34     if (l == r)return;
35 35     int mid = tr[p].l + tr[p].r >> 1;
36 36     build(lc, l, mid);
37 37     build(rc, mid + 1, r);
38 38     pushup(p);
39 39 }
40 40 void update(int p, int x, int y, int k) {
41 41     if (x <= tr[p].l && tr[p].r <= y) {
42 42         tr[p].sum += k * (tr[p].r - tr[p].l + 1);
43 43         tr[p].add += k;
44 44         return;
45 45     }
46 46     pushdown(p);
47 47     int mid = tr[p].l + tr[p].r >> 1;
48 48     if (x <= mid)update(lc, x, y, k);
49 49     if (y > mid)update(rc, x, y, k);
50 50     pushup(p);
51 51 }
52 52 int query(int p, int x, int y) {
53 53     if (x <= tr[p].l && tr[p].r <= y) {
54 54         return tr[p].sum;
55 55     }
56 56     int mid = tr[p].l + tr[p].r >> 1;
57 57     pushdown(p);
58 58     int sum = 0;
59 59     if (x <= mid)sum += query(lc, x, y);
60 60     if (y > mid)sum += query(rc, x, y);
61 61     return sum;
62 62 }
63 63 signed main() {
64 64     ios::sync_with_stdio(false);
65 65     cin.tie(nullptr);
66 66     cout.tie(nullptr);
67 67     int n, m;
68 68     cin >> n >> m;
69 69     while (n--) {
70 70         int a, b;
71 71         cin >> a >> b;
72 72         w[a] += b;
73 73     }
74 74     build(1, 1, 100000);
75 75     int MAX = 0;
76 76     for (int i = 1; i <= 100000; i++) {
77 77         MAX = max(MAX, query(1, i, i + m - 1));
78 78     }
79 79     cout << MAX;
80 80 }

 

标签:P3353,int,线段,mid,long,build,闪耀,sum,define
From: https://www.cnblogs.com/iscr/p/17896534.html

相关文章

  • 【线段树入门】 P1198 最大数(区间最大值+无懒标记+末尾插入)
    1//笔记-自用2//#pragmaGCCoptimize("Ofast")3//#pragmaGCCoptimize("unroll-loops")4#define_CRT_SECURE_NO_WARNINGS5#defineAll(a)a.begin(),a.end()6#defineINF21474836477#include<bits/stdc++.h>8#include<nu......
  • 【线段树入门】P3373 线段树 2(区间乘加)
    //笔记-自用//#pragmaGCCoptimize("Ofast")//#pragmaGCCoptimize("unroll-loops")#define_CRT_SECURE_NO_WARNINGS#defineAll(a)a.begin(),a.end()#defineINF2147483647#include<bits/stdc++.h>#include<numeric>usingnamespac......
  • 2020年初一初二集训队(线段树) 基本操作
    其他线段树详解与实现-知乎⁤(zhihu.com)线段树-OIWiki(oi-wiki.org) 线段树学习笔记-xujindong的博客-洛谷博客(luogu.com.cn)  简介线段树(segmenttree)是一种二叉搜索树,也是平衡二叉树,它的每一个结点对应一个区间[L,R],叶子结点对应的区间只有一个......
  • 线段树模板区间加(含懒标记)
    constintN=1e5+10;intn,m;inta[N];structTree{ intl,r; llsum,add; }tr[4*N];voidbuild(intu,intl,intr){ //l=tr[u].l;r=tr[u].r; //注释掉的部分是典型的错误,对于build过程中我们是初始化编号对应区间节点,上面赋值逻辑反了 tr[u]={l,r}; if(l==r)t......
  • 线段树
    首先是建树我们先构建整棵树的框架 structnode{intl,r;stringdata;}g[N*4];//不一定非要构建结构体,看题目需求,如果不涉及左右范围的话就可以直接构造数组 //n表示的是树上每个结点的数值,比如说第一个结点为1,那莫第一个结点的左子树为2,右子树为3//l(是......
  • 【数据结构】线段树 (二) 学习笔记
    线段树(二)点击查看:线段树(一)学习笔记本文介绍权值线段树与动态开点线段树,(可能后面还会加线段树合并等等)。权值线段树线段树的动态开点线段树合并推荐题目&&参考资料&&拓展阅读《算法竞赛进阶指南》0x43线段树P3870 [TJOI2009]开关P1438 无聊的数列P1253 扶苏的问......
  • 李超线段树
    问题:洛谷P4097在平面直角坐标系维护两个操作:1.加入一条线段。2.求目前平面直角坐标系中截一条直线\(x=k\)中与线段交点\(y\)最大的是那一条线段。解决:李超线段树模板。首先建一个以\(x\)为区间的线段树。和普通线段树的主要区别是在对懒标记的处理上,这里是是没有单独的下......
  • 线段树优化建图
    问题:CF786B给定一个\(n\)个点,\(m\)次连边的有向图,有三种连边(均有边权)方式:1.\(u\tov\),一条\(u\)指向\(v\)的连边。2.\(u\to[l,r]\),\(u\)向在区间\([l,r]\)的点分别连一条边。3.\([l,r]\tov\),在区间\([l,r]\)的点向\(v\)分别连一条边。问从\(1\)点出发,到各个点的最短路。......
  • 像使用stl一样使用线段树 ——AtCoder Library(转载https://zhuanlan.zhihu.com/p/459
    地址:https://zhuanlan.zhihu.com/p/459579152 我这里翻译一下官方的文档。首先需要满足几个性质。(注意 ∗ 是个操作,不是单纯的一个乘号)1)操作满足结合律即 (a∗b)∗c=a∗(b∗c)2)操作需要有个幺元(基本元/单位元)a∗e=e∗a=a如果你有这个一个序列S,长度为N ,接下......
  • 【2024省选冲刺计划】数据结构相关-线段树进阶
    线段树进阶0x01李超线段树FZPJ4519[2021冬令营模拟]上古遗迹【题目背景】“沙……沙……沙……”独行者的脚步一次次被刻进沙漠中,干冷的风携沙尘在男子的四围穿过。“该死……这沙尘什么时候才能消停会儿……”男子止不住地咳嗽,随即停了下来,开始查看便携式投影设备上的信......