• hdu 1166 线段树 单点更新 区间查询


    很久没写线段树了,这段时间打算刷个线段树专题。这道题应该算是线段树的模版题了。

     1 #include<iostream>
     2 #define MAX_N 50005
     3 
     4 using namespace std;
     5 
     6 struct node
     7 {
     8     int peo;
     9     int l,r;
    10 }num[MAX_N*4];
    11 int pp[MAX_N];
    12 
    13 void built_tree(int l,int r,int count)
    14 {
    15     num[count].l=l;
    16     num[count].r=r;
    17     if(l==r)
    18     {
    19         num[count].peo = pp[l];
    20         return ;
    21     }
    22     int mid = (l+r)/2;
    23     built_tree(l, mid, count*2);
    24     built_tree(mid+1, r, count*2+1);
    25     num[count].peo=num[count*2].peo+num[count*2+1].peo;
    26 }
    27 int query_peo(int l,int r,int count)
    28 {
    29     if(num[count].l==l && num[count].r==r)
    30         return num[count].peo;
    31     int mid = (num[count].l+num[count].r)/2;
    32     if(r<=mid)
    33         return query_peo(l,r, count*2);
    34     else
    35         if(l>mid)
    36             return query_peo(l, r, count*2+1);
    37     else
    38         return query_peo(l, mid,count*2)+query_peo(mid+1, r, count*2+1);
    39 }
    40  
    41 void update_peo(int a,int b,int count)
    42 {
    43     if(num[count].l==num[count].r && num[count].l==a)
    44     {
    45         num[count].peo+=b;
    46         return ;
    47     }
    48     int mid = (num[count].l+num[count].r)/2;
    49     if(a<=mid)
    50         update_peo(a, b, count*2);
    51     else
    52         if(a>mid)
    53             update_peo(a, b, count*2+1);
    54     num[count].peo=num[count*2].peo+num[count*2+1].peo;
    55 }
    56 int main()
    57 {
    58     cin.sync_with_stdio(false);
    59     int t,con=1;
    60     cin>>t;
    61     while(t--)
    62     {
    63         int n;
    64         cin>>n;
    65         for(int i = 1; i <= n; i++)
    66         {
    67             cin>>pp[i];
    68         }
    69         built_tree(1, n, 1);
    70         string s;
    71         int a,b;
    72         cout<<"Case "<<con++<<":"<<endl;
    73         while(1)
    74         {
    75             cin>>s;
    76             if(s=="End")
    77                 break;
    78             cin>>a>>b;
    79             if(s=="Query")
    80             {
    81                 cout<<query_peo(a, b, 1)<<endl;
    82             }
    83             else
    84                 if(s=="Add")
    85                 {
    86                     update_peo(a, b, 1);
    87                 }
    88             else
    89                 if(s=="Sub")
    90                 {
    91                     b*=-1;
    92                     update_peo(a, b, 1);
    93                 }
    94         }
    95     }
    96     return 0;
    97 }
  • 相关阅读:
    Java基础课程---将一个字符串反转,将字符串中指定部分进行反转,比如,"abcdefg", 反转为"abfedcg"
    在Centon64位中卸载安装时系统自带的--openjdk,并且安装自己需要的jdk
    Java基础课程---sleep()方法 和 wait()方法的异同(面试题)
    Java基础课程---权限修饰符
    Java基础课程---
    MySQL 创建库
    brew
    android webview load 本地文件需要注意的地方
    android下隐藏标题栏
    android webview无法加载网页
  • 原文地址:https://www.cnblogs.com/Xycdada/p/7308340.html
Copyright © 2020-2023  润新知