HDU 1754 I Hate It【线段树 单点更新】

题意:给出n个数,每次操作修改它的第s个数,询问给定区间的数的最大值

把前面两道题结合起来就可以了

自己还是敲不出来-------------

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include <cmath>
  5 #include<stack>
  6 #include<vector>
  7 #include<map>
  8 #include<set>
  9 #include<queue>
 10 #include<algorithm>
 11 using namespace std;
 12
 13 typedef long long LL;
 14 const int INF = (1<<30)-1;
 15 const int mod=1000000007;
 16 const int maxn=200005;
 17
 18 int n,m;
 19 int a[maxn];
 20 int nmax;
 21
 22 struct node{
 23     int l,r;
 24     int nmax;
 25 } tree[4*maxn];
 26
 27 char s[105];
 28
 29
 30 void build_tree(int i,int l,int r){
 31     tree[i].l=l;
 32     tree[i].r=r;
 33     if(l==r){
 34         tree[i].nmax=a[l];
 35         return;
 36     }
 37     int mid=(l+r)/2;
 38     build_tree(2*i,l,mid);
 39     build_tree(2*i+1,mid+1,r);
 40     tree[i].nmax=max(tree[2*i].nmax,tree[2*i+1].nmax);
 41 }
 42
 43 void update(int i,int s,int w){
 44     if(tree[i].l==tree[i].r){
 45         tree[i].nmax=w;
 46         return;
 47     }
 48
 49       int mid=(tree[i].l + tree[i].r)/2;
 50       if(s<=mid) update(2*i,s,w);
 51       else update(2*i+1,s,w);
 52
 53      tree[i].nmax=max(tree[2*i].nmax,tree[2*i+1].nmax);
 54 }
 55
 56 void query(int i,int l,int r){//查询
 57      if(tree[i].nmax<=nmax) return;
 58      if(tree[i].l==l&&tree[i].r==r){
 59          nmax = max(tree[i].nmax,nmax);
 60          return;
 61      }
 62      int mid=(tree[i].l+tree[i].r)/2;
 63      if(r<=mid) query(2*i,l,r);
 64      else if(l>mid) query(2*i+1,l,r);
 65      else{
 66          query(2*i,l,mid);
 67          query(2*i+1,mid+1,r);
 68      }
 69  }
 70
 71
 72 int main(){
 73     while(scanf("%d %d",&n,&m)!=EOF){
 74         memset(tree,0,sizeof(tree));
 75         for(int i=1;i<=n;i++) scanf("%d",&a[i]);
 76
 77         build_tree(1,1,n);
 78
 79         while(m--){
 80             scanf("%s",s);
 81             if(s[0]==‘Q‘){
 82                 int l,r;
 83                 scanf("%d %d",&l,&r);
 84
 85                 nmax=-INF;
 86                 query(1,l,r);
 87
 88                 printf("%d\n",nmax);
 89             }
 90             if(s[0]==‘U‘){
 91                 int u,v;
 92                 scanf("%d %d",&u,&v);
 93                 update(1,u,v);
 94             }
 95
 96         }
 97
 98     }
 99     return 0;
100 }

加油啊---gooooooooooooooooooooooo

时间: 2024-10-29 09:34:17

HDU 1754 I Hate It【线段树 单点更新】的相关文章

hdu 1754 I Hate It 线段树单点更新和区间求和

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754 参照HH大牛写的额! Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多

HDU 1754 I Hate It 线段树单点更新求最大值

题目链接 线段树入门题,线段树单点更新求最大值问题. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define N 200005 using namespace std; int data[N]; struct Tree { int l,r,ans; }tree[N*4]; void build(in

HDU 1754 I Hate It 线段树(单点更新,成段查询)

题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=1754 题解: 单点更新,成段查询. 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 #define lson o<<1 6 #define rson (o<<1)|1 7 #define M l+(r

hdu 1754 I Hate It (线段树单点更新)

http://acm.hdu.edu.cn/showproblem.php?pid=1754 照着hdu 1166 的模板稍加改动即可 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int sum[1000000]; void push(int rt) { sum[rt]=max(sum[rt<<1],s

HDU 1754 I Hate It 线段树 单点更新 区间最大值

1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 #include<cstdlib> 5 #include<cstdio> 6 #include<set> 7 #include<map> 8 #include<vector> 9 #include<cstring> 10 #include<stack> 11 #

HDU 1754 I Hate It (线段树单点更新求最大值RMQ)

I Hate It Problem Description 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少.这让很多学生很反感. 不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老师有时候需要更新某位同学的成绩. Input 本题目包含多组测试,请处理到文件结束.在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目.学生ID编号分别从1

【HDU】1754 I hate it ——线段树 单点更新 区间最值

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

HDU 1166 敌兵布阵(线段树单点更新,板子题)

敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 87684    Accepted Submission(s): 36912 Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任务

HDU - 3074 - Multiply game (线段树-单点更新,区间求积)

题目传送:Multiply game 思路:简单线段树,单点更新,区间求积,这是上次选拔赛选的题,一看题就是线段树,不过当时线段树不太熟,没敢敲,现在看来居然如此轻松,不过注意这里有大量输出,用printf,居然在这里TLE了一次... AC代码: #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> #incl

HDU 1166 敌兵布阵 线段树单点更新求和

题目链接 中文题,线段树入门题,单点更新求和,建一棵树就可以了. #include <iostream> #include <cstdio> #include <cmath> #include <cstring> #include <algorithm> #define N 50005 using namespace std; int data[N]; struct Tree { int l,r,sum; }tree[N*4]; void bui