线段树模板题:

  1 #include<iostream>
  2 #include<vector>
  3 #include<string>
  4 #include<cmath>
  5 #include<set>
  6 #include<algorithm>
  7 #include<cstdio>
  8 #include<map>
  9 #include<cstring>
 10 #include<list>
 11
 12 #define MAXSIZE 50010
 13
 14 using namespace std;
 15
 16 int tree[4*MAXSIZE];
 17 int T, N;
 18 char order[100];
 19
 20 void init()
 21 {
 22     memset(tree, 0, sizeof(tree));
 23 }
 24
 25
 26 void build(int node, int l, int r)
 27 {
 28     if(l == r)    // 到达叶子节点,赋值
 29     {
 30         scanf("%d", &tree[node]);
 31         return;
 32     }
 33
 34     int mid = (l+r)/2;
 35     build(node*2, l, mid);
 36     build(node*2+1, mid+1, r);
 37
 38     tree[node] = tree[node*2] + tree[node*2+1];
 39 }
 40
 41 // 单点更新
 42 void update(int node, int l, int r, int index, int add)
 43 {
 44     if(l == r)
 45     {
 46         tree[node] += add;    // 更新方式
 47         return;
 48     }
 49
 50     int mid = (l+r)/2;
 51     if(index <= mid)    // 进入左子树
 52         update(node*2, l, mid, index, add);
 53     else                // 进入右子树
 54         update(node*2+1, mid+1, r, index, add);
 55
 56     tree[node] = tree[node*2] + tree[node*2 + 1];
 57 }
 58
 59 // 区间查找
 60 int query_range(int node, int l, int r, int L, int R)
 61 {
 62     if(l <= L && r >= R)
 63         return tree[node];
 64     int mid = (L+R)/2;
 65     int sum = 0;
 66     if(mid >= l)
 67         sum += query_range(node*2, l, r, L, mid);
 68     if(mid < r)
 69         sum += query_range(node*2+1, l, r, mid+1, R);
 70
 71     return sum;
 72 }
 73
 74 int main()
 75 {
 76     scanf("%d", &T);
 77     for(int t = 1; t <= T; ++t)
 78     {
 79         scanf("%d", &N);
 80         init();
 81         build(1, 1, N);
 82         printf("Case %d:\n", t);
 83         while(1)
 84         {
 85             scanf("%s", order);
 86             if(strcmp(order, "End") == 0)
 87                 break;
 88
 89             int i, j;
 90             scanf("%d%d", &i, &j);
 91             switch(order[0])
 92             {
 93                 case 'A':
 94                     update(1, 1, N, i, j);
 95                     break;
 96                 case 'S':
 97                     update(1, 1, N, i, -j);
 98                     break;
 99                 case 'Q':
100                     printf("%d\n", query_range(1, i, j, 1, N));
101                     break;
102             }
103         }
104     }
105
106     return 0;
107 }

  1 #include<iostream>
  2 #include<vector>
  3 #include<string>
  4 #include<cmath>
  5 #include<set>
  6 #include<algorithm>
  7 #include<cstdio>
  8 #include<map>
  9 #include<cstring>
 10 #include<list>
 11
 12 #define MAXSIZE 50010
 13
 14 using namespace std;
 15
 16 int tree[4*MAXSIZE];
 17 int lz[4*MAXSIZE];
 18 int T, N;
 19 char order[100];
 20
 21 void init()
 22 {
 23     memset(tree, 0, sizeof(tree));
 24     memset(lz, 0, sizeof(lz));
 25 }
 26
 27
 28 void build(int node, int l, int r)
 29 {
 30     if(l == r)    // 到达叶子节点,赋值
 31     {
 32         scanf("%d", &tree[node]);
 33         return;
 34     }
 35
 36     int mid = (l+r)/2;
 37     build(node*2, l, mid);
 38     build(node*2+1, mid+1, r);
 39
 40     tree[node] = tree[node*2] + tree[node*2+1];
 41 }
 42
 43
 44 void push_down(int node, int l, int r)
 45 {
 46     if(lz[node])
 47     {
 48         int mid = (l+r)/2;
 49         lz[node*2] += lz[node];
 50         lz[node*2+1] += lz[node];
 51         tree[node*2] += (mid-l+1)*lz[node];
 52         tree[node*2+1] += (r-mid)*lz[node];
 53         lz[node] = 0;
 54     }
 55 }
 56
 57 // 区间更新,lr为更新范围,LR为线段树范围,add为更新值
 58 void update_range(int node, int l, int r, int L, int R, int add)
 59 {
 60     if(l <= L && r >= R)
 61     {
 62         lz[node] += add;
 63         tree[node] += (R-L+1)*add;    // 更新方式
 64         return;
 65     }
 66
 67     push_down(node, L, R);
 68     int mid = (L+R)/2;
 69     if(mid >= l)    // 进入左子树
 70         update_range(node*2, l, r, L, mid, add);
 71     if(r > mid)        // 进入右子树
 72         update_range(node*2+1, l, r, mid+1, R, add);
 73
 74     tree[node] = tree[node*2] + tree[node*2 + 1];
 75 }
 76
 77 // 区间查找
 78 int query_range(int node, int l, int r, int L, int R)
 79 {
 80     if(l <= L && r >= R)
 81         return tree[node];
 82     push_down(node, L, R);
 83     int mid = (L+R)/2;
 84     int sum = 0;
 85     if(mid >= l)
 86         sum += query_range(node*2, l, r, L, mid);
 87     if(mid < r)
 88         sum += query_range(node*2+1, l, r, mid+1, R);
 89
 90     return sum;
 91 }
 92
 93
 94 void Add(int i, int j)
 95 {
 96     update_range(1, i, i, 1, N, j);
 97 }
 98
 99
100 void Sub(int i, int j)
101 {
102     update_range(1, i, i, 1, N, -j);
103 }
104
105
106 int Query(int i, int j)
107 {
108     int sum = query_range(1, i, j, 1, N);
109     return sum;
110 }
111
112
113 int main()
114 {
115     scanf("%d", &T);
116     for(int t = 1; t <= T; ++t)
117     {
118         scanf("%d", &N);
119         init();
120         build(1, 1, N);
121         printf("Case %d:\n", t);
122         while(1)
123         {
124             scanf("%s", order);
125             if(strcmp(order, "End") == 0)
126                 break;
127
128             int i, j;
129             scanf("%d%d", &i, &j);
130             switch(order[0])
131             {
132                 case 'A':
133                     Add(i, j);
134                     break;
135                 case 'S':
136                     Sub(i, j);
137                     break;
138                 case 'Q':
139                     printf("%d\n", Query(i, j));
140                     break;
141             }
142         }
143     }
144
145     return 0;
146 }

转载于:https://www.cnblogs.com/FengZeng666/p/11445662.html

敌兵布阵 HDU - 1166 (线段树)相关推荐

  1. A - 敌兵布阵 - hdu 1166

    Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务就是要监视这些 ...

  2. A - 敌兵布阵 (HDU - 1166)

    - 题目大意 中文题,一共有4种命令,然后来根据命令来进行操作. - 解题思路 典型的线段树的问题,进行点的更新,然后进行区间的查询(查询的时候查的是这个区间上的点的和). - 代码 #include ...

  3. Acwing 4339 敌兵布阵 暴力 + 分块 + 线段树 + Zkw线段树 + 树状数组

    来一篇超全题解 数据结构大杂烩 原题连接 题目描述 敌人有 NNN 个工兵营地,编号 1∼N1∼N1∼N. 初始时,第 iii 个营地有 aia_iai​ 个人. 接下来有若干个命令,命令有 444 ...

  4. HDU 1166 线段树

    敌兵布阵 题目链接 大意:给你一个数列,和三个操作, Query操作为查询从i到j之间的数的和 Add操作为第i个数加j Sub操作为第i个数减j 要求每次Query操作你给他一个正确的回答 大概思路 ...

  5. HDU 1166(线段树)

    线段树 1 #include <cstdio> 2 #include <iostream> 3 using namespace std; 4 #define N 200010 ...

  6. HDU 1166 敌兵布阵(线段树:点更新,区间求和)

    HDU 1166 敌兵布阵(线段树:点更新,区间求和) http://acm.hdu.edu.cn/showproblem.php?pid=1166 题意: 给你n个整数,然后给你多条命令,每条命令如 ...

  7. hdu 1166 敌兵布阵 (线段树)

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

  8. hdu 1166 敌兵布阵(线段树之 单点更新+区间求和)

    敌兵布阵                                                                             Time Limit: 2000/10 ...

  9. HDU 1166 敌兵布阵 【线段树-点修改--计算区间和】

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

最新文章

  1. “互联网+”的时代,易佳互联也随着时代步伐前进着
  2. 使用python对比两个目录下的文件名差异
  3. sox处理mp3_SoX 音频处理工具使用方法
  4. php 上次登陆时间,php使用cookie显示用户上次访问网站日期的方法
  5. Oracle建立表空间,用户等环节
  6. Bootstrap学习笔记--常用标签和类模板
  7. Learning 3D Shape Completion from Laser Scan Data with Weak Supervision
  8. 动图,用Python追踪NBA球员的运动轨迹
  9. SQL Prompt 激活下载破解码注册码序列号,内有方法
  10. Systemd基础篇:systemd vs SysVinit
  11. Python查找中国城市、省份
  12. Android 开 发 资 源 分 享
  13. matlab画差分方程的信号流图,信号与系统教程及实验(第2版)
  14. 判断conime.exe是不是病毒!
  15. 41个机器学习面试题
  16. 熊啸锋:在线生成个人网站,如何建立个人网站教程
  17. AJAX框架简笔画风景简单,海南风景简笔画超简单
  18. 祝大家2022幸福安康
  19. Warm Audio EQP-WA 电子管均衡器中文视频
  20. 软件工程之他见——鲍周晓

热门文章

  1. 【java设计模式】迭代子模式
  2. 第2章数据库服务器的安装与卸载
  3. CNKI中银屑病、大肠菌群、内毒素LPS(调研手稿三)
  4. flink sql是否支持emit策略
  5. Flask的jinja输出json内容
  6. spark中的println失效问题解决
  7. Error Based Pruning剪枝算法、代码实现与举例
  8. y460安装的ubuntu开机时笔记本键盘失效的问题
  9. python2.7调用mysql存储过程并且返回结果
  10. datagrip中运行sql语句