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 ;
}

最新文章

  1. rails 常用的验证方法 validates (转)
  2. Linux下搭建VPN服务器(CentOS、pptp)转
  3. poj 1811 Pallor Rho +Miller Rabin
  4. iOS 9之分屏多任务(Split View)
  5. 第十七周oj刷题——Problem B: 分数类的四则运算【C++】
  6. ftk学习记录(形成全屏幕套件)
  7. Comparable和Comparator的差别
  8. js match函数注意
  9. IntelliJ IDEA LicenseServer激活及使用
  10. 爬虫(三)之scrapy核心组件
  11. 全国人口 信息(NCIIC)接口开发纪要
  12. CF1073E Segment Sum 解题报告
  13. 学习windows编程 day4 之 绘制随机矩形和peekMessage
  14. swift - 闭包 -定义和使用
  15. jQuery设置下拉框select 默认选中第一个option
  16. vue组件讲解(is属性的用法)
  17. 给出a的定义 -- 指针 和 数组
  18. 【BZOJ】1625: [Usaco2007 Dec]宝石手镯(01背包)
  19. Python 有什么奇技淫巧?
  20. Xilinx中解决高扇出的方法

热门文章

  1. 日常笔记5C/C++快速入门一些基础细节
  2. [LeetCode] 910. Smallest Range II 最小区间之二
  3. [LeetCode] 767. Reorganize String 重构字符串
  4. redis持久化方式与优缺点
  5. Linux挖矿程序kworkerds分析
  6. ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现
  7. 微软 Azure DevOps Server 2019 Update 1 (TFS 2019.1)
  8. Python处理数据集-2
  9. nginx 安装ab小工具方法
  10. Econ 493 A1 - Fall 2019