zoukankan      html  css  js  c++  java
  • hdu 1892【二维树状数组】

    O(∩_∩)O哈哈~二维树状数组被我搞出来了,太开心了,第一道二维树状数组,(~ o ~)~zZ

    虽然中途还是出问题了,就是S询问的时候我没有考虑坐标的大小问题,还是搜了别人的代码才知道的,看来自己考虑问题不周到,~~~~(>_<)~~~~

    View Code
     1 #include <cstdio>
    2 #include <cstring>
    3 #include <algorithm>
    4
    5 int book[1005][1005];
    6 int size = 1002;
    7 void insert(int x,int y,int num)
    8 {
    9 for(int i = x;i <= size;i += (i&(-i)))
    10 {
    11 for(int j = y;j <= size;j += (j&(-j)))
    12 {
    13 book[i][j] += num;
    14 }
    15 }
    16 }
    17
    18 int getsum(int x,int y)
    19 {
    20 int sum = 0;
    21 for(int i = x;i > 0;i -= (i&(-i)))
    22 {
    23 for(int j = y;j > 0;j -= (j&(-j)))
    24 {
    25 sum += book[i][j];
    26 }
    27 }
    28 return sum;
    29 }
    30 void init()
    31 {
    32 for(int i = 1;i <= size;i ++)
    33 {
    34 for(int j = 1;j <= size;j ++)
    35 {
    36 insert(i,j,1);
    37 }
    38 }
    39 }
    40 int main()
    41 {
    42 int T,cas = 1;
    43 scanf("%d",&T);
    44 while(T -- )
    45 {
    46 printf("Case %d:\n",cas ++);
    47 int n;
    48 scanf("%d",&n);
    49 memset(book,0,sizeof(book));
    50 init();
    51 char s[3];
    52 while( n --)
    53 {
    54 scanf("%s",s);
    55 if(s[0] == 'S')
    56 {
    57 int a,b,c,d;
    58 scanf("%d%d%d%d",&a,&b,&c,&d);
    59 if(a > c) std::swap(a,c);//!
    60 if(b > d) std::swap(b,d);
    61 printf("%d\n",getsum(c+1,d+1)+getsum(a,b)-getsum(c+1,b)-getsum(a,d+1));
    62 }
    63 else if(s[0] == 'A')
    64 {
    65 int a,b,c;
    66 scanf("%d%d%d",&a,&b,&c);
    67 insert(a+1,b+1,c);
    68 }
    69 else if(s[0] == 'D')
    70 {
    71 int a,b,c;
    72 scanf("%d%d%d",&a,&b,&c);
    73 int num = getsum(a+1,b+1) + getsum(a,b) - getsum(a,b+1) - getsum(a+1,b);
    74 if(num < c)
    75 insert(a+1,b+1,-num);
    76 else
    77 insert(a+1,b+1,-c);
    78 }
    79 else if(s[0] == 'M')
    80 {
    81 int a,b,c,d,e;
    82 scanf("%d%d%d%d%d",&a,&b,&c,&d,&e);
    83 int num = getsum(a+1,b+1) + getsum(a,b) - getsum(a,b+1) - getsum(a+1,b);
    84 if(num < e)
    85 {
    86 insert(a+1,b+1,-num);
    87 insert(c+1,d+1,num);
    88 }
    89 else
    90 {
    91 insert(a+1,b+1,-e);
    92 insert(c+1,d+1,e);
    93 }
    94 }
    95 }
    96 }
    97 return 0;
    98 }

    还有就是坐标从0,0开始的,要记得加1……细节~~~

  • 相关阅读:
    c++ 中的substr
    c++ 中将数字字符串转换成int输出的stoi() 和 atoi()
    c++ 四舍五入函数 round
    stddef.h----常用函数
    local.h-----地区函数
    errno.h-----定义出错代码
    signal.h-----信号函数
    stdio.h----标准的输入输出函数
    time.h-------日期与时间函数
    math.h--------数学函数
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2414339.html
Copyright © 2011-2022 走看看