题目:

题目描述 Description

给你N个数,有两种操作

1:给区间[a,b]的所有数都增加X

2:询问第i个数是什么?

输入描述 Input Description

第一行一个正整数n,接下来n行n个整数,再接下来一个正整数Q,表示操作的个数. 接下来Q行每行若干个整数。如果第一个数是1,后接3个正整数a,b,X,表示在区间[a,b]内每个数增加X,如果是2,后面跟1个整数i, 表示询问第i个位置的数是多少。

输出描述 Output Description

对于每个询问输出一行一个答案

样例输入 Sample Input

3

1

2

3

2

1 2 3 2

2 3

样例输出 Sample Output

5

数据范围及提示 Data Size & Hint

数据范围

1<=n<=100000

1<=q<=100000


思路:

区间修改 单点查询 线段树模板题


代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cmath>
  5. #include <string>
  6. #include <cstring>
  7. #include <algorithm>
  8.  
  9. using namespace std;
  10. typedef long long ll;
  11. typedef unsigned long long ull;
  12. const int inf=0x3f3f3f3f;
  13. const int maxn=1e5+;
  14. int n,m,x,y,v,res,ans,op;
  15. int a[maxn];
  16.  
  17. struct node{
  18. int l,r,w,mark;
  19. }tree[maxn<<];
  20.  
  21. void build(int l,int r,int rt){
  22. tree[rt].l=l;
  23. tree[rt].r=r;
  24. if(l==r){
  25. tree[rt].w=a[l];
  26. return;
  27. }
  28. int mid=(l+r)/;
  29. build(l,mid,rt*);
  30. build(mid+,r,rt*+);
  31. tree[rt].w=tree[rt*].w+tree[rt*+].w;
  32. }
  33.  
  34. void pushdown(int rt){
  35. tree[rt*].mark+=tree[rt].mark;
  36. tree[rt*+].mark+=tree[rt].mark;
  37. tree[rt*].w+=tree[rt].mark*(tree[rt*].r-tree[rt*].l+);
  38. tree[rt*+].w+=tree[rt].mark*(tree[rt*+].r-tree[rt*+].l+);
  39. tree[rt].mark=;
  40. }
  41.  
  42. void update(int rt){
  43. if(tree[rt].l>=x && tree[rt].r<=y){
  44. tree[rt].w+=v*(tree[rt].r-tree[rt].l+);
  45. tree[rt].mark+=v;
  46. return;
  47. }
  48. if(tree[rt].mark) pushdown(rt);
  49. int mid=(tree[rt].l+tree[rt].r)/;
  50. if(x<=mid) update(rt*);
  51. if(y>mid) update(rt*+);
  52. tree[rt].w=tree[rt*].w+tree[rt*+].w;
  53. }
  54.  
  55. void query(int rt){
  56. if(tree[rt].l==tree[rt].r){
  57. ans=tree[rt].w;
  58. return;
  59. }
  60. if(tree[rt].mark) pushdown(rt);
  61. int mid=(tree[rt].l+tree[rt].r)/;
  62. if(res<=mid) query(rt*);
  63. else query(rt*+);
  64. }
  65.  
  66. int main(){
  67. scanf("%d",&n);
  68. for(int i=;i<=n;i++){
  69. scanf("%d",&a[i]);
  70. }
  71. build(,n,);
  72. scanf("%d",&m);
  73. for(int i=;i<=m;i++){
  74. scanf("%d",&op);
  75. if(op==){
  76. scanf("%d%d%d",&x,&y,&v);
  77. update();
  78. }
  79. if(op==){
  80. ans=;
  81. scanf("%d",&res);
  82. query();
  83. printf("%d\n",ans);
  84. }
  85. }
  86.  
  87. return ;
  88. }

codevs 1081 线段树练习2 (线段树)的更多相关文章

  1. 【BZOJ-3589】动态树 树链剖分 + 线段树 + 线段覆盖(特殊的技巧)

    3589: 动态树 Time Limit: 30 Sec  Memory Limit: 1024 MBSubmit: 405  Solved: 137[Submit][Status][Discuss] ...

  2. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  3. 【BZOJ-3196】二逼平衡树 线段树 + Splay (线段树套平衡树)

    3196: Tyvj 1730 二逼平衡树 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2271  Solved: 935[Submit][Stat ...

  4. 【BZOJ2243】[SDOI2011]染色 树链剖分+线段树

    [BZOJ2243][SDOI2011]染色 Description 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成颜色c: 2.询问节点a到节点b路径上的 ...

  5. NOIP 2013 货车运输【Kruskal + 树链剖分 + 线段树 】【倍增】

    NOIP 2013 货车运输[树链剖分] 树链剖分 题目描述 Description A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在 ...

  6. hdu 1166:敌兵布阵(树状数组 / 线段树,入门练习题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  8. POJ3237 (树链剖分+线段树)

    Problem Tree (POJ3237) 题目大意 给定一颗树,有边权. 要求支持三种操作: 操作一:更改某条边的权值. 操作二:将某条路径上的边权取反. 操作三:询问某条路径上的最大权值. 解题 ...

  9. bzoj4034 (树链剖分+线段树)

    Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...

  10. HDU4897 (树链剖分+线段树)

    Problem Little Devil I (HDU4897) 题目大意 给定一棵树,每条边的颜色为黑或白,起始时均为白. 支持3种操作: 操作1:将a->b的路径中的所有边的颜色翻转. 操作 ...

随机推荐

  1. zend studio报错

    Problems encountered while setting project description. Cannot create linked resource '/.org.eclipse ...

  2. Tornado基于MiddleWare做中间件

    详细代码如下: 在app.py里添加 # -*- coding:utf-8 -*- from tornado.ioloop import IOLoop from tornado.web import ...

  3. 20165232 预备作业3 Linux安装及学习

    java第三次预作业--Linux安装及命令入门(学习记录) 通过老师给的学习基于VirtualBox虚拟机安装Ubuntu图文教程,我在自己笔记本上安装Linux操作系统,在安装过程中我遇到一些问题 ...

  4. 13.模板方法(Template Method)

    无处不在的Template Method     如果你只想掌握一种设计模式,那么它就是Template Method!动机(Motivate):    变化 -----是软件设计的永恒主题,如何管理 ...

  5. python 线程(其他方法,队列,线程池,协程 greenlet模块 gevent模块)

    1.线程的其他方法 from threading import Thread,current_thread import time import threading def f1(n): time.s ...

  6. linux安装Subversion版本控制工具(Subversion + Apache + jsvnadmin)

    操作系统:Centos 6.7 集成环境服务器:10.0.210.112 操作用户:root 建议安装前更新操作系统 # yum update 更新完成后重启 # reboot 1: 安装 Apach ...

  7. 【leetcode-73】 矩阵置零

    给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   [1,0,1],   [1,1,1] ] 输 ...

  8. 【Unity3d游戏开发】Unity中的Time.timeScale

    马三最近在做一款游戏的时候涉及到了“加速”和“暂停”这两个功能,我第一时间就想到了应该用 Time.timeScale.当暂停的时候,设置timeScale = 0,当需要加速的时候,将 timeSc ...

  9. SQL Server Management Studio 使用技巧

    Ø  前言 本文主要介绍 SQL Server Management Studio 工具的使用,相信很多开发人员都比较熟悉此工具,特别是做 C# 开发的程序员,基本上都会经常使用该工具,当然也可以使用 ...

  10. 四十一、Linux 线程——线程同步之条件变量

    41.1 概念 41.1.1 条件变量的介绍 互斥锁的缺点是它只有两种状态:锁定和非锁定 条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足 条件变量内部是一个等待队列,放置等待 ...