B - I Hate It HDU - 1754 线段树区间最大值板子(单点更新,区间最大)

  第一次打 改了半天  各种小错误 难受

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int maxn=2000000+7;
 5 int a[maxn],n;
 6 struct Node{
 7     int l,r;
 8     long long Max,lazy;
 9     void update(long long  val){
10         ;//本题没用
11     }
12 }tree[maxn*5];
13 void push_up(int x){
14     tree[x].Max=max(tree[x<<1].Max,tree[x<<1|1].Max);
15 }
16
17 void push_down(int x){//本题不用
18     int lazyval=tree[x].lazy;
19     if(lazyval){
20         tree[x<<1].update(lazyval);
21         tree[x<<1|1].update(lazyval);
22         tree[x].lazy=0;
23     }
24 }
25 void build(int x,int l,int r){
26         tree[x].l=l,tree[x].r=r;
27         tree[x].Max=tree[x].lazy=0;
28         if(l==r){//建树 初始化叶子
29             tree[x].Max=a[l];
30         }
31         else {//递归建树
32             int mid=l+r>>1;
33             build(x<<1,l,mid);
34             build(x<<1|1,mid+1,r);
35             push_up(x);
36         }
37 }
38 void  update(int x,int l,int r,long long  val){
39     int L=tree[x].l,R=tree[x].r;
40     if(l==L&&R==r&&L==R){tree[x].Max=val;return ;}//单点修改值
41      if(r<L||l>R)return ;//如果这两个区间没有交集 x的区间就不用修改了
42          //int mid=L+R>>1;
43         update(x<<1,l,r,val);//分别修改左右区间
44         update(x<<1|1,l,r,val);
45         push_up(x);//更新左右区间
46 }
47
48 long long query(int x,int l,int r){
49     int L=tree[x].l,R=tree[x].r;
50     if(l<=L&&R<=r){return tree[x].Max;}//如果当前节点区间完全被要查询区间包含 直接返回该节点的最大值即可
51      if(r<L||l>R)return 0;//如果当前区间不在要查询区间里面,返回一个不影响其他查找的最小值 0 (学生分数都是正数)
52     //     int mid=L+R>>1;
53          long long ans=0;
54         ans=max(query(x<<1,l,r),query(x<<1|1,l,r));
55     return ans;
56 }
57
58 int main(){
59 int n,q;
60 while(scanf("%d%d",&n,&q)==2){
61     for(int i=1;i<=n;i++)scanf("%d",&a[i]);
62     build(1,1,n);
63     char op[10];
64         int l,r;
65     for(int i=1;i<=q;i++)
66     {
67         scanf("%s%d%d",op,&l,&r);
68         if(op[0]==‘Q‘){
69             //int l,r;
70             //scanf("%d%d",&l,&r);
71             printf("%lld\n",query(1,l,r));
72         }
73         else if(op[0]==‘U‘){
74             //int l,r;
75             //scanf("%d%d",&l,&r);
76             update(1,l,l,r);
77         }
78     }
79
80 }
81     return 0;
82 }

原文地址:https://www.cnblogs.com/ttttttttrx/p/10292995.html

时间: 2024-07-29 16:25:19

B - I Hate It HDU - 1754 线段树区间最大值板子(单点更新,区间最大)的相关文章

HDU 1754线段树基本操作,建树,更新,查询

代码线段树入门整理中有介绍. 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<cmath> 5 using namespace std; 6 const int MAXNODE=1<<19; 7 const int MAX=1000003; 8 struct NODE{ 9 int left,right; 10 int value; 11 }node[

light oj 1348 树链剖分(单点更新区间求值)

http://lightoj.com/volume_showproblem.php?problem=1348 Finally the Great Magical Lamp was in Aladdin's hand. Now he wanted to return home. But he didn't want to take any help from the Genie because he thought that it might be another adventure for hi

FZU2082 树链剖分(单点更新区间求值)

http://acm.fzu.edu.cn/problem.php?pid=2082  Problem Description 有n座城市,由n-1条路相连通,使得任意两座城市之间可达.每条路有过路费,要交过路费才能通过.每条路的过路费经常会更新,现问你,当前情况下,从城市a到城市b最少要花多少过路费.  Input 有多组样例,每组样例第一行输入两个正整数n,m(2 <= n<=50000,1<=m <= 50000),接下来n-1行,每行3个正整数a b c,(1 <=

HYSBZ 1036 树链剖分(单点更新区间求和求最大值)

http://www.lydsy.com/JudgeOnline/problem.php?id=1036 Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u v: 询问从点u到点v的路径上的节点的最大权值 III. QSUM u v: 询问从点u到点v的路径上的节点的权值和 注意:从点u到点v的路径上的节点包括u和v本身 Input 输入

HDU(1754),线段树,单点替换,区间最值

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 线段树模板题,update功能是单点替换,query是访问区间最大值. #include <stdio.h> #include <algorithm> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int maxn = 200010; int MAX

B - I Hate It HDU 1754 线段树

B - I Hate It Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1754 Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题

线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)

对于线段树的讲解此篇不再赘述,下面列出线段树应用中最常用的几种操作的代码.(具体题目未贴出,仅供有一定基础者参考代码风格) 另外,注意多组输入要写scanf("%d%d",&n,&m)!=EOF,线段树的题肯定要用c语言的输入输出,要使用字符数组,不用字符串,输入字符的时候要加getchar()吞噬空行.. (1)单点增减,区间求和: #include<iostream> #include<stdio.h> #include<string&

【线段树】线段树系列 0.2单点修改区间求和线段树

1080 线段树练习 题目描述 Description 一行N个方格,开始每个格子里都有一个整数.现在动态地提出一些问题和修改:提问的形式是求某一个特定的子区间[a,b]中所有元素的和:修改的规则是指定某一个格子x,加上或者减去一个特定的值A.现在要求你能对每个提问作出正确的回答.1≤N<100000,,提问和修改的总数m<10000条. 输入描述 Input Description 输入文件第一行为一个整数N,接下来是n行n个整数,表示格子中原来的整数.接下一个正整数m,再接下来有m行,表示

nyoj116 士兵杀敌(二)(线段树的区间查询和单点更新)

题目116 题目信息 运行结果 本题排行 讨论区 士兵杀敌(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:5 描述 南将军手下有N个士兵,分别编号1到N,这些士兵的杀敌数都是已知的. 小工是南将军手下的军师,南将军经常想知道第m号到第n号士兵的总杀敌数,请你帮助小工来回答南将军吧. 南将军的某次询问之后士兵i可能又杀敌q人,之后南将军再询问的时候,需要考虑到新增的杀敌数. 输入 只有一组测试数据 第一行是两个整数N,M,其中N表示士兵的个数(1<N<1000000)

hdu 1754 线段树 水题 单点更新 区间查询

I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 59558    Accepted Submission(s): 23201 Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要