题目简述: 有N个整数,Q次操作,每次操作为询问一个区间[a, b]内数的和(0号操作)或者把一个区间内的数全部加上v(1号操作)

线段树求解即可。

#include <cstdio>
#include <algorithm>
using std::min;
using std::max;
#define L(no) ((no) << 1)
#define R(no) (L(no) | 1)
#define PLUSTAG(no, val) plustag[no] += val, query[no] += val*(rb[no]-lb[no]+1)
const int MAXN = 400001;
int lb[MAXN], rb[MAXN], query[MAXN], ans, plustag[MAXN];
int sum(int a, int b) {return a + b;}
void build(int no, int l, int r) {int mid = l + r >> 1;lb[no] = l;rb[no] = r;if(l == r) scanf("%d", &query[no]);else {build(L(no), l, mid);build(R(no), mid + 1, r);query[no] = query[L(no)] + query[R(no)];}
}
void getval(int no, int l, int r, int(*func)(int, int), int* key) {int mid = lb[no] + rb[no] >> 1;if(l <= r && (lb[no] <= r&& rb[no] >= r || rb[no] >= l && lb[no] <= l)) {if(lb[no] == l && rb[no] == r) ans = func(ans, key[no]);else {if(plustag[no]) {PLUSTAG(L(no), plustag[no]);PLUSTAG(R(no), plustag[no]);plustag[no] = 0;}getval(L(no), l, min(mid, r), func, key);getval(R(no), max(l, mid + 1), r, func, key);}}
}
void plus(int no, int l, int r, int val) {int mid = lb[no] + rb[no] >> 1;if(l <= r && (lb[no] <= r&& rb[no] >= r || rb[no] >= l && lb[no] <= l)) {if(lb[no] == l && rb[no] == r) {PLUSTAG(no, val);}else {if(plustag[no]) {PLUSTAG(L(no), plustag[no]);PLUSTAG(R(no), plustag[no]);plustag[no] = 0;}query[no] += (r - l + 1) * val;plus(L(no), max(l, lb[no]), min(mid, r), val);plus(R(no), max(l, mid + 1), min(r, rb[no]), val);}}
}
int main() {int n, q, i, op, a, b, v;scanf("%d%d", &n, &q);build(1, 1, n);for(i = 1; i <= q; i++) {scanf("%d%d%d", &op, &a, &b);if(op == 0) {ans = 0;getval(1, a, b, sum, query);printf("%d\n", ans);}else {scanf("%d", &v);if(v != 0) plus(1, a, b, v);}}return 0;
}

解释一下:query[]表示一个区间里面的和……然后左右半区间分别搞……1操作时Lazy优化是必须要加的(就是好像老师布置的作业等要交了再补……),然后,便过之。

问我为什么getval写函数指针?因为这是百搭函数……要求最大值传入max最小值传min求和传sum……

然后:就没有然后了。过之。

转载于:https://www.cnblogs.com/nealchen/p/4290085.html

这是我第一题AC的线段树相关推荐

  1. 小清的线段树25题日志01 线段树下你和我 欢乐多又多

    前言 难度大致会按排序来 就不写总结啦 嘻嘻 适合刚学线段树的人(和我一样 练手 /*if you can't see the repayWhy not just work step by stepr ...

  2. 华为7.31笔试(第一题AC、第二题AC、第三题超纲)

    第一题 题目:小明是个强迫症卖家,有10000台设备,卖的均价要求最接近D元,输出卖出的台数N,总售价M 输入 0<D<10,精确到小数点后12位   :   输出 M N 思路: 均价与 ...

  3. 2018CCPC吉林赛区(重现赛)补题部分——F线段树待补

    A - The Fool 数论分块暴力求和 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC optim ...

  4. [CSP-S模拟测试]:模板(ac)(线段树启发式合并)

    题目描述 辣鸡$ljh\ NOI$之后就退役了,然后就滚去学文化课了. 他每天都被$katarina$大神虐,仗着自己学过一些姿势就给$katarina$大神出了一道题. 有一棵$n$个节点的以$1$ ...

  5. 2019牛客暑期多校训练营(第一场场)_I题Points Division(线段树+DP维护区间最大值)

    题目链接: https://ac.nowcoder.com/acm/contest/881/I 题意: 给你n个点,每个点的坐标为(xi,yi),有两个权值ai,bi. 现在要你将它分成A,B两部分, ...

  6. P7456 [CERC2018] The ABCD Murderer (ac自动机+线段树优化dp/反向st)

    做法 ac自动机预处理出最长后缀 f[i]=max(f[i-1],f[i-2],-,f[i-最长后缀])+1; 转移即可 下面有一种反向st维护的学到了 #include <bits/stdc+ ...

  7. [CQOI 2006]线段树之简单题

    Description 有一个n个元素的数组,每个元素初始均为0.有m条指令,要么让其中一段连续序列数字反转--0变1,1变0(操作1),要么询问某个元素的值(操作2).例如当n=20时,10条指令如 ...

  8. 线段树(假)练习题一(学校OJ的题)

    Description 桌子上零散地放着若干个盒子,桌子的后方是一堵墙.如右图所示.现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上.问影子的总宽度是多少? Sample Input 20 ...

  9. POJ Mayor's posters——线段树+离散化

    原文:http://blog.163.com/cuiqiongjie@126/blog/static/85642734201261151553308/ 大致题意: 有一面墙,被等分为1QW份,一份的宽 ...

最新文章

  1. linux差分备份,完全和差分备份的自动化模型
  2. 剑指offer_第18题_二叉树的镜像_Python
  3. TensorRT和PyTorch模型的故事
  4. 微生物领域SCIE期刊分析(英美各40本,中国大陆0本)
  5. 删除linux系统中的ifcfg-eth0.bak
  6. c++thread里暂停线程_多线程技术
  7. PIN码 Adsense在线身份验证
  8. python os 常用方法_【Python 库】os 模块常用方法简介
  9. 【NodeJs-5天学习】第一天篇② —— 安装NodeJs环境以及VsCode开发工具
  10. vibe的matlab实现,Matlab調用VIBE算法
  11. Spring Security入门教程
  12. Charles 手机https抓包
  13. 超级实用的软著申请源代码材料格式文档生成辅助工具——软著源代码工具
  14. 51CTO学院优惠版
  15. 26_摘录的一些精彩语句2
  16. 60个Vue常见问题汇总及解决方案
  17. Echarts真正态分布图
  18. Tensorflow API 讲解——tf.estimator.Estimator
  19. filezilla源码安装教程(含错误信息解决方案)
  20. 如何把IP-GUARD发布到公网IP来管理全国分公司的终端

热门文章

  1. ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★...
  2. 免费WiFi,仅仅为好久没联系的你们
  3. 中文(英译) 爱情一句话哲理
  4. 快速获取csv数量_【数量技术宅|数据爬虫系列分享】如何获取免费的数字货币历史数据...
  5. MFC中打开文件对话框:CFileDlg
  6. 机器学习高级篇:解密微信视频号推荐机制
  7. 龙芯2h芯片不能进入pmon_“龙芯”18年:这个团队,终结了中国计算机产业的“无芯”历史...
  8. 只会python怎么挣钱_业余学python有用吗
  9. 48道C语言上机题参考答案,二级C语言上机题库参考答案(已修改).doc
  10. javaScript入门基础说明