• HDU 1754线段树基本操作,建树,更新,查询


    代码线段树入门整理中有介绍、

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cmath>
     5 using namespace std;
     6 const int MAXNODE=1<<19;
     7 const int MAX=1000003;
     8 struct NODE{
     9     int left,right;
    10     int value;
    11 }node[MAXNODE];
    12 int father[MAX];
    13 void buildtree(int i,int left,int right)
    14 {
    15     node[i].left=left;
    16     node[i].right=right;
    17     node[i].value=0;
    18     if(left==right){
    19         father[left]=i;
    20         return;
    21     }
    22     buildtree(i<<1, left, (int)floor( (right+left) / 2.0));  
    23     buildtree((i<<1) + 1, (int)floor( (right+left) / 2.0) + 1, right);  
    24 
    25 }
    26 void updatatree(int ri)
    27 {
    28     if(ri==1)    return;
    29     int fi=ri/2;
    30     int a=node[fi<<1].value;
    31     int b=node[(fi<<1)+1].value;
    32     node[fi].value=a>b?a:b;
    33     updatatree(ri/2);
    34 }
    35 int maxn;
    36 void query(int i,int l,int r)
    37 {
    38     if(node[i].left==l&&node[i].right==r){
    39         maxn=(maxn<node[i].value)?node[i].value:maxn;
    40         return;
    41     }
    42     i=i<<1;
    43     if(l<=node[i].right)
    44         if(r<=node[i].right)
    45             query(i,l,r);
    46         else
    47             query(i,l,node[i].right);
    48     i+=1;
    49     if(r>=node[i].left)
    50         if(l>=node[i].left)
    51             query(i,l,r);
    52         else
    53             query(i,node[i].left,r);
    54 }
    55 int main()
    56 {
    57     int n,m;
    58     while(~scanf("%d %d",&n,&m)){
    59         buildtree(1,1,n);
    60         int grade;
    61         for(int i=1;i<=n;++i){
    62             scanf("%d",&grade);
    63             node[father[i]].value=grade;
    64             updatatree(father[i]);
    65         }
    66         while(m--){
    67             int x,y;char str[5];
    68             scanf("%s %d %d",str,&x,&y);
    69             if(str[0]=='U'){
    70                 node[father[x]].value=y;
    71                 updatatree(father[x]);
    72             }
    73             else{
    74                 maxn=0;
    75                 query(1,x,y);
    76                 printf("%d
    ",maxn);
    77             }
    78         }
    79     }
    80 }
  • 相关阅读:
    JavaScript数组去重(12种方法,史上最全转载)
    数组从大到小排序的两种方式
    jquery.inArray()和splice()使用小记
    HbuilderX 线上打包Android9.0版本无法更新
    常见的移动端H5页面开发遇到的坑和解决办法
    监听点击物理返回键及mui.fire父子页面传参
    深入理解DOM事件类型系列第三篇——变动事件
    jquery监听div等元素的内容变化
    寒假进度3
    寒假进度2
  • 原文地址:https://www.cnblogs.com/sasuke-/p/5189952.html
Copyright © 2020-2023  润新知