码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2019-01-19 21:14:15      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:单点   完全   lld   turn   oid   std   最大   scanf   return   

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

 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 }

 

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

标签:单点   完全   lld   turn   oid   std   最大   scanf   return   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!