zoukankan      html  css  js  c++  java
  • HDU

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1754

    Sample Input
    5 6
    1 2 3 4 5
    Q 1 5
    U 3 6
    Q 3 4
    Q 4 5
    U 2 9
    Q 1 5
     
    
    Sample Output
    5
    6
    5

    分析:与上一道敌兵布阵差不多不过节点信息保存区间成绩最好的那个同学就可以了,注意本题是多实例题。

      1 #include<stdio.h>
      2 #include<string.h>
      3 #include<math.h>
      4 #include<queue>
      5 #include<algorithm>
      6 #include<time.h>
      7 using namespace std;
      8 
      9 const int maxn = 2005;
     10 const int N=1000007;
     11 
     12 #define lson rt<<1///rt*2
     13 #define rson rt<<1|1///rt*2+1
     14 
     15 int A[N];
     16 
     17 struct node
     18 {
     19     int l,r,s;
     20 } tree[N<<2];
     21 
     22 void build(int l,int r,int rt)
     23 {
     24     tree[rt].l=l;
     25     tree[rt].r=r;
     26 
     27     if(l==r)
     28     {
     29         tree[rt].s=A[l];
     30         return ;
     31     }
     32 
     33     int mid=(l+r)/2;
     34 
     35     build(l,mid,lson);
     36     build(mid+1,r,rson);
     37 
     38     tree[rt].s=max(tree[lson].s,tree[rson].s);///找大的那个
     39 }
     40 
     41 void update(int pos,int val, int rt)
     42 {
     43     tree[rt].s=max(tree[rt].s,val);
     44 
     45     if(tree[rt].l==tree[rt].r)
     46         return ;
     47 
     48     int mid = (tree[rt].l+tree[rt].r)/2;
     49 
     50     if(pos<=mid)
     51         update(pos,val,lson);
     52     else
     53         update(pos,val,rson);
     54 }
     55 
     56 int query(int l,int r,int rt)
     57 {
     58     if(tree[rt].l==l&&tree[rt].r==r)
     59         return tree[rt].s;
     60 
     61     int mid = (tree[rt].l+tree[rt].r)/2;
     62 
     63     if(r<=mid)
     64         return query(l,r,lson);
     65     else if(l>mid)
     66         return query(l,r,rson);
     67     else
     68     {
     69         int lsum,rsum;
     70         lsum=query(l,mid,lson);
     71         rsum=query(mid+1,r,rson);
     72         return max(lsum,rsum);///最大的那个
     73     }
     74 }
     75 
     76 int main()
     77 {
     78     int n,m,i,a,b;
     79     char s[100];
     80 
     81     while(scanf("%d %d", &n,&m) != EOF)
     82     {
     83         for(i=1; i<=n; i++)
     84             scanf("%d", &A[i]);
     85 
     86         build(1,n,1);
     87 
     88         while(m--)
     89         {
     90             scanf("%s", s);
     91             if(s[0]=='Q')
     92             {
     93                 scanf("%d%d", &a,&b);
     94                 printf("%d
    ",query(a,b,1));
     95                 continue;
     96             }
     97 
     98             scanf("%d%d", &a,&b);
     99             update(a,b,1);
    100         }
    101     }
    102     return 0;
    103 }
  • 相关阅读:
    合并区间
    编译与运行
    传递信息
    划分字母区间
    无重叠区间
    用最少数量的箭引爆气球
    根据身高重建队列
    二叉树展开为链表
    动态添加按钮
    基础知识
  • 原文地址:https://www.cnblogs.com/weiyuan/p/5706427.html
Copyright © 2011-2022 走看看