zoukankan      html  css  js  c++  java
  • HDU 1166(线段树)

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

    区间求和问题~~~

    代码如下:

      1 #include <stdio.h>
      2 #include <string.h>
      3 #define N 50002
      4 #define L(x) ((x)<<1)
      5 #define R(x) ((x)<<1|1)
      6 
      7 typedef struct
      8 {
      9     int lson, rson;
     10     int val;
     11 } seg_tree;
     12 
     13 seg_tree s[N<<2];
     14 int a[N];
     15 
     16 int build(int left, int right, int idx)
     17 {
     18     s[idx].lson = left;
     19     s[idx].rson = right;
     20     if(left == right)
     21     {
     22         s[idx].val = a[left];
     23         return a[left];
     24     }
     25     int mid = (left + right) / 2;
     26     return s[idx].val = (build(left, mid, L(idx)) + build(mid + 1, right, R(idx)));
     27 }
     28 
     29 void update(int id, int idx, int val)
     30 {
     31     s[idx].val += val;
     32     if(s[idx].lson == s[idx].rson)
     33     {
     34         return;
     35     }
     36     int mid = (s[idx].lson + s[idx].rson) / 2;
     37     if(id <= mid)
     38     {
     39         update(id, L(idx), val);
     40     }
     41     else
     42     {
     43         update(id, R(idx), val);
     44     }
     45 }
     46 
     47 int query(int left, int right, int idx)
     48 {
     49     if(left == s[idx].lson && s[idx].rson == right)
     50     {
     51         return s[idx].val;
     52     }
     53     int mid = (s[idx].lson + s[idx].rson) / 2;
     54     if(right <= mid)
     55     {
     56         return query(left, right, L(idx));
     57     }
     58     else if(left > mid)
     59     {
     60         return query(left, right, R(idx));
     61     }
     62     else
     63     {
     64         return query(left, mid, L(idx)) + query(mid + 1, right, R(idx));
     65     }
     66 }
     67 
     68 int main()
     69 {
     70     int t;
     71     int n;
     72     int i, j;
     73     char str[10];
     74     scanf("%d", &t);
     75     for(i = 1; i <= t; i++)
     76     {
     77         scanf("%d", &n);
     78         for(j = 1; j <= n; j++)
     79         {
     80             scanf("%d", &a[j]);
     81         }
     82         build(1, n, 1);
     83         printf("Case %d:\n", i);
     84         while(scanf("%s", str) != EOF)
     85         {
     86             if(!strcmp(str, "End"))
     87             {
     88                 break;
     89             }
     90             int c, d;
     91             scanf("%d%d", &c, &d);
     92             switch(str[0])
     93             {
     94                 case 'A':
     95                     update(c, 1, d);
     96                     break;
     97                 case 'S':
     98                     update(c, 1, -d);
     99                     break;
    100                 case 'Q':
    101                     printf("%d\n", query(c, d, 1));
    102                     break;
    103             }
    104         }
    105     }
    106 }
  • 相关阅读:
    委托demo
    事件demo
    数据结构与算法分析表ADT
    数据结构与算法分析栈ADT
    Access的“自动编号”问题
    C#获取时间函数
    在load事件中关闭窗体
    panel里面显示form的问题
    将RichTextBox 的内容直接写入数据库
    利用反射来创建一个Form.
  • 原文地址:https://www.cnblogs.com/10jschen/p/2669308.html
Copyright © 2011-2022 走看看