1. 程式人生 > >B - I Hate It HDU - 1754 線段樹區間最大值板子(單點更新,區間最大)

B - I Hate It HDU - 1754 線段樹區間最大值板子(單點更新,區間最大)

struct pac 都是 else space ostream stream for 初始

  第一次打 改了半天 各種小錯誤 難受

 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 線段樹區間最大值板子(單點更新,區間最大)