问题 D: 【模板】线段树1

时间限制: 1 Sec  内存限制: 512 MB
提交: 80  解决: 40
[提交][状态][讨论版]

题目描述

给定一个无序数列,有四种操作:

1.令数列中的某个数加上某个数

2.求一个区间的和

3.查询一段区间内的最大值;

4.查询一段区间内的最小值;

输入

输入的第1行,共有两个数n和q,表示数列长度和操作次数

输入的第2行,共有n个数,表示该数列

接下来共有q行,每行有三个数

第1个数为操作类型,具体如下

若是第1种操作,接下来两个数x,y分别表示将第x个数加y

若是第2~4种操作,接下来两个数x,y表示闭区间的左右端点

输出

输出共有若干行,对于每一个询问输出一个整数结果

样例输入

5 4
1 2 3 4 5
2 1 4
1 3 -2
3 1 5
4 2 3

样例输出

10
5
1

提示

1<=n,q<=200000

保证所有数据在c/c++语言的INT范围内,pascal语言的longint范围内。

题解:线段树模板题,这个模板可支持区间加减。
代码如下:
 1 #include<cstdio>
 2 #include<iostream>
 3 #define Max 200000
 4 using namespace std;
 5 int n,q;
 6 struct node{
 7     int maxn,minn,sum,mark;
 8 }tree[Max*3];
 9 void pushdown(int k,int l,int r){
10     tree[2*k].mark+=tree[k].mark;
11     tree[2*k+1].mark+=tree[k].mark;
12     int len=r-l+1;
13     tree[2*k].sum+=tree[k].mark*(len-len/2);
14     tree[2*k+1].sum+=tree[k].mark*(len/2);
15     tree[k].mark=0;
16 }
17 void update(int l,int r,int a,int b,int k,int add){
18     if(a<=l&&b>=r){
19         tree[k].maxn+=add; tree[k].minn+=add;
20         tree[k].sum+=(r-l+1)*add; return;
21     }
22     if(l!=r&&tree[k].mark) pushdown(k,l,r);
23     int mid=(l+r)/2;
24     if(a<=mid) update(l,mid,a,b,2*k,add);
25     if(b>mid) update(mid+1,r,a,b,2*k+1,add);
26     tree[k].maxn=max(tree[2*k].maxn,tree[2*k+1].maxn);
27     tree[k].minn=min(tree[2*k].minn,tree[2*k+1].minn);
28     tree[k].sum=tree[2*k].sum+tree[2*k+1].sum;
29 }
30 int query(int l,int r,int a,int b,int k,int num){
31     if(a==l&&b==r){
32         if(num==3) return tree[k].maxn;
33         if(num==4) return tree[k].minn;
34         if(num==2) return tree[k].sum;
35     }
36     if(l!=r&&tree[k].mark) pushdown(k,l,r);
37     int mid=(l+r)/2;
38     if(b<=mid) return query(l,mid,a,b,2*k,num);
39     else if(a>mid) return query(mid+1,r,a,b,2*k+1,num);
40     else{
41         if(num==3) return max(query(l,mid,a,mid,2*k,num),query(mid+1,r,mid+1,b,2*k+1,num));
42         if(num==4) return min(query(l,mid,a,mid,2*k,num),query(mid+1,r,mid+1,b,2*k+1,num));
43         if(num==2) return query(l,mid,a,mid,2*k,num)+query(mid+1,r,mid+1,b,2*k+1,num);
44     }
45 }
46 int main()
47 {
48     scanf("%d%d",&n,&q);
49     for(int i=1;i<=n;i++){
50         int a; scanf("%d",&a); update(1,n,i,i,1,a);
51     }
52     for(int i=1;i<=q;i++){
53         int num,x,y; scanf("%d%d%d",&num,&x,&y);
54         if(num==1) update(1,n,x,x,1,y);
55         if(num==2) printf("%d\n",query(1,n,x,y,1,2));
56         if(num==3) printf("%d\n",query(1,n,x,y,1,3));
57         if(num==4) printf("%d\n",query(1,n,x,y,1,4));
58     }
59     return 0;
60 }

转载于:https://www.cnblogs.com/Beginner-/p/7467737.html

【9018:1956】线段树1相关推荐

  1. 【9018:2208】可持久化线段树2

    2208: [模板]可持久化线段树2 时间限制: 3 Sec 内存限制: 256 MB 提交: 30 解决: 12 [提交][状态][讨论版] 题目描述 静态区间第K小问题是典型的主席树模板. 在这个 ...

  2. 二逼平衡树——树套树(线段树套Splay平衡树)

    题面 Bzoj3196 解析 线段树和Splay两棵树套在一起,常数直逼inf,但最终侥幸过了 思路还是比较简单, 在原数组维护一个下标线段树,再在每一个线段树节点,维护一个对应区间的权值Splay. ...

  3. 线段树——HDU - 1698

    题目含义 就是初始化一堆数为1 可以经过操作把一个区间的数都改变 并求这堆数的总大小 题目分析 有一个 #include<iostream> #include<stdio.h> ...

  4. BZOJ.1558.[JSOI2009]等差数列(线段树 差分)

    BZOJ 洛谷 首先可以把原序列\(A_i\)转化成差分序列\(B_i\)去做. 这样对于区间加一个等差数列\((l,r,a_0,d)\),就可以转化为\(B_{l-1}\)+=\(a_0\),\(B ...

  5. 【线段树分治 线性基】luoguP3733 [HAOI2017]八纵八横

    不知道为什么bzoj没有HAOI2017 题目描述 Anihc国有n个城市,这n个城市从1~n编号,1号城市为首都.城市间初始时有m条高速公路,每条高速公路都有一个非负整数的经济影响因子,每条高速公路 ...

  6. [bzoj1582][Usaco2009 Hol]Holiday Painting 节日画画_线段树

    Holiday Painting 节日画画 bzoj-1582 Usaco-2009 Hol 题目大意:给定两个n*m的01网格图.q次操作,每次将第二个网格图的子矩阵全部变成0或1,问每一次操作后两 ...

  7. codefores 786B. Legacy(最短路,线段树优化拆点,好题)

    题目链接 B. Legacy time limit per test2 seconds memory limit per test256 megabytes inputstandard input o ...

  8. 【题解】BZOJ 3065: 带插入区间K小值——替罪羊树套线段树

    题目传送门 题解 orz vfk的题解 3065: 带插入区间K小值 系列题解 一 二 三 四 惨 一开始用了一种空间常数很大的方法,每次重构的时候merge两颗线段树,然后无限RE(其实是MLE). ...

  9. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

最新文章

  1. Lync 2013 与 Elastix 2.40 语音通信设置全过程(1)
  2. 阿里云移动研发平台EMAS,是如何连续5年安全护航双11的?
  3. 百度SEO资源吧emlog模版全套源码
  4. php 获取上周日期_php 获取上一周下一周的日期列表
  5. 如何把MySql数据库中的数据导入到MyCat集群中_---Linux运维工作笔记050
  6. Jquery页面跳转
  7. 左传 —— 春秋左氏传
  8. android wifi智能车,STM32智能WiFi视频小车全套资料(带安卓app与stm32源码等)
  9. 系统地介绍计算材料科学的发展现状、主要理论框架和设计实践方法,汪林望博士作序《计算材料学——设计与实践方法(第2版)》
  10. GB2312/GBK编码规则及单片机汉显字库算法
  11. win10 加快开机速度
  12. python爬取网站视频保存到本地
  13. Windows安装TortoiseSVN
  14. 看刘未鹏先生的博客的一些摘记
  15. openwrt路由器挂载sdcard为overlay
  16. React官方状态管理库—— Recoil
  17. mac vue 代理失效
  18. 中国科研人员开发出“蚁群”微型机器人
  19. Windows计算器切换模式
  20. YYModel 简介与使用

热门文章

  1. c语言绝对循环,c语言之循环
  2. php获取随机图片,PHP 随机显示某张图片
  3. python相关工作岗位_西安掌握Python有哪些工作岗位能够选择
  4. 4路组相连cache设计_浅谈 Cache
  5. 深度学习之生成对抗网络(6)GAN训练难题
  6. php java 单点登录_php实现多站点共用session实现单点登录的方法详解
  7. 互斥事件的概念和公式_IGCSE数学5月大考冲刺A*?必备公式与技巧
  8. [机器学习] XGBoost 自定义损失函数-FocalLoss
  9. B 树、B+ 树、B* 树
  10. 如何从零开始开发一款嵌入式产品(20年的嵌入式经验分享学习)