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 }