HDU1754

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

题目分析:对于给出的一个很长的区间,对其进行单点更新值和区间求最大值的操作,由于查询的区间很大,且查询次数多,这里用线段树求解将是十分合适的

注意点:1.对于存放线段树的数组大小需要开大一些

    2.对于c语言的字符输入%c之前需要加一个空格保证输入准确

 #include<iostream>
#include<string.h>
using namespace std; const int N = ;
int grade[N];
int tree[N<<]; //这里建立的树的数组大小需要是N的4倍 否则不够用
int n, m; int max(int a, int b){
if(a > b) return a;
else return b;
} void build_tree(int start, int end, int node){ //线段树的建立
if(start == end){
tree[node] = grade[start];
}else{
int mid = (start + end) / ;
int left_node = node*;
int right_node = node*+; build_tree(start, mid, left_node);
build_tree(mid+, end, right_node);
tree[node] = max(tree[left_node], tree[right_node]);
}
} void update_tree(int start, int end, int node, int index, int value){ //单点更新值
if(start == end){
tree[node] = value;
}else{
int mid = (start + end) / ;
int left_node = node*;
int right_node = node*+; if(index <= mid)
update_tree(start, mid, left_node, index, value);
else
update_tree(mid+, end, right_node, index, value);
tree[node] = max(tree[left_node], tree[right_node]);
}
} int search_tree(int start, int end, int node, int l, int r){ //区间查询最大值
if(l > end || r < start){
return ;
}else if(l <= start && r >= end){
return tree[node];
}else if(start == end){      //这里的个递归出口放在后面是有原因的,有可能存在start==end 但是l和r根本和start end没有交集的情况,所以先判去了后者
return tree[node];
}
int mid = (start + end) / ;
int left_node = node*;
int right_node = node*+; int left_max = search_tree(start, mid, left_node, l, r);
int right_max = search_tree(mid+, end, right_node, l, r);
int ans = max(left_max, right_max);
return ans;
} int main(){
while(scanf("%d%d", &n, &m) != EOF){
for(int i = ; i <= n; i++)
scanf("%d", &grade[i]);
build_tree(, n, );
for(int i = ; i <= m; i++){
char c;
int a, b;
scanf(" %c %d %d", &c, &a, &b); //对于c语言的输入字符在%c之前需要一个空格,否则c就读取不到需要的字符了
if(c == 'U') update_tree(, n, , a, b);
else{
int ans = search_tree(, n, , a, b);
printf("%d\n", ans);
}
}
}
return ;
}

HDU1166

题目分析:

也是一题线段树的模板题,单点更新和区间查询求和(本质上和区间求最大值是一样的)

代码:

 #include<iostream>
#include<string>
#include<string.h>
using namespace std; const int N = ;
int peo[N];
int tree[N<<]; void build_tree(int start, int end, int node){
if(start == end){
tree[node] = peo[start];
}else{
int mid = (start + end) / ;
int left_node = node*;
int right_node = node*+; build_tree(start, mid, left_node);
build_tree(mid+, end, right_node);
tree[node] = tree[left_node] + tree[right_node];
}
} void update_tree(int start, int end, int node, int index, int value){
if(start == end){
tree[node] += value;
}else{
int mid = (start + end) / ;
int left_node = node*;
int right_node = node*+; if(index <= mid)
update_tree(start, mid, left_node, index, value);
else
update_tree(mid+, end, right_node, index, value);
tree[node] = tree[left_node] + tree[right_node];
}
} int query_tree(int start, int end, int node, int l, int r){
if(end < l || start > r){
return ;
}else if(start >= l && end <= r){
return tree[node];
}else if(start == end){
return tree[node];
}
int mid = (start + end) / ;
int left_node = node*;
int right_node = node*+; int left_sum = query_tree(start, mid, left_node, l, r);
int right_sum = query_tree(mid+, end, right_node, l, r);
int ans = left_sum + right_sum;
return ans;
} int main(){
int t;
scanf("%d", &t);
int cnt = ;
while(t--){
printf("Case %d:\n", cnt++);
int n;
scanf("%d", &n);
for(int i = ; i <= n; i++)
scanf("%d", &peo[i]);
build_tree(, n, );
string s;
int a, b;
while(cin>>s){
if(s == "End") break;
scanf("%d%d", &a, &b);
if(s == "Query"){
int ans = query_tree(, n, , a, b);
printf("%d\n", ans);
}
if(s == "Add"){
update_tree(, n, , a, b);
}
if(s == "Sub"){
update_tree(, n, , a, -b);
}
}
}
return ;
}

HDU1754 && HDU1166 线段树模板题的更多相关文章

  1. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  2. hdu1823(二维线段树模板题)

    hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...

  3. [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]

    可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...

  4. HDU 1698 Just a Hook (线段树模板题-区间求和)

    Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of t ...

  5. UESTC - 1057 秋实大哥与花 线段树模板题

    http://acm.uestc.edu.cn/#/problem/show/1057 题意:给你n个数,q次操作,每次在l,r上加上x并输出此区间的sum 题解:线段树模板, #define _CR ...

  6. POJ - 3264 线段树模板题 询问区间最大最小值

    这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...

  7. 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)

    思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...

  8. zkw线段树模板题

    学了zkw线段树,觉得没什么必要刷专题的吧(切不动啊).. 那先放一个模板题吧(我绝不会和你说搬了一道树状数组模板题的!!!) 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加 ...

  9. P1243~P1247 线段树模板题总结

    前言 这几天刚刚刷了5道线段树(水)题,现在来总结一下. 首先是犯的不少错误: 1.建树.更新函数没有return.这是最气的,每次最后程序错误查了半天也没查出来,最后发现是没有return.递归边界 ...

随机推荐

  1. [LeetCode] 1028. Recover a Tree From Preorder Traversal 从先序遍历还原二叉树

    We run a preorder depth first search on the rootof a binary tree. At each node in this traversal, we ...

  2. [LeetCode] 738. Monotone Increasing Digits 单调递增数字

    Given a non-negative integer N, find the largest number that is less than or equal to N with monoton ...

  3. Intellij IDEA通过Plugins导入vue.js

    最近再写vue.js的程序,刚开始使用Intellij IDEA没有导入插件,结果所有vue文件都是文本方式显示,无法使用开发工具的辅助功能,导入vue.js插件后即可. 路径是Setting-> ...

  4. 使用 Java 执行 groovy 脚本或方法

    1. 引入依赖 <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groo ...

  5. 一张思维导图辅助你深入了解 Vue | Vue-Router | Vuex 源码架构

    1.前言 本文内容讲解的内容:一张思维导图辅助你深入了解 Vue | Vue-Router | Vuex 源码架构. 项目地址:https://github.com/biaochenxuying/vu ...

  6. c# .net core + .net framework mongodb nuget 包

    FastNet.Framework.Mongo https://github.com/my-core/FastNet.Framework GH.MongoDb.GenericRepository ht ...

  7. LInux 就该这么学 笔记分享

    看了Linux就该这么学的前部分书,觉得写的还可以,就在网上找了下面这个同学写的笔记,觉得很详细,所以保存地址,供以后查阅参看.这里对作者表示感谢!!! 博客地址: https://www.cnblo ...

  8. Oracle之PL/SQL

    基础语法 [declare --定义部分] begin --执行部分 [exception --异常处理部分] end; 其中,定义部分以declare开始,该部分是可选的;执行部分以begin开始, ...

  9. mqtt数据采集器

    MQTT是一种发布(publish)/订阅(subscribe)协议,MQTT协议采用发布/订阅模式,所有的物联网终端都通过TCP连接到云端,云端通过主题的方式管理各个设备关注的通讯内容,负责将设备与 ...

  10. mybatis使用associaton进行分步查询

    Employee类 public class Employee { private Integer id; private String lastName; private String email; ...