• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
L&King
有何不可!
   首页    新随笔    联系   管理    订阅  订阅

HOJ 1640 Mobile Phone

题意:有一个n*n的矩阵,op==1时,在(x,y)增加值z,op==2时,求以(x1,y1)和(x2,y2)构成的矩阵的和。

思路:二维线段树。

代码:

 1 #include<stdio.h>
 2 #include<string.h>
 3 const int N=1111;
 4 int c[N][N],n;
 5 int lowbit(int x)
 6 {
 7     return x&-x;
 8 }
 9 void add(int x,int y,int z)
10 {
11     for(int i=x;i<=n;i=(i|(i-1))+1)
12         for(int j=y;j<=n;j=(j|(j-1))+1)
13             c[i][j]+=z;
14 }
15 int q(int x,int y)
16 {
17     int sum=0;
18     for(int i=x;i;i=i&(i-1))
19         for(int j=y;j;j=j&(j-1))
20             sum+=c[i][j];
21     return sum;
22 }
23 int main()
24 {
25     int op,x,y,z,x1,x2,y1,y2;
26     while(scanf("%d%d",&op,&n)!=EOF)
27     {
28         memset(c,0,sizeof(c));
29         while(scanf("%d",&op)&&op!=3)
30         {
31             if(op==1)
32             {
33                 scanf("%d%d%d",&x,&y,&z);
34                 add(x+1,y+1,z);
35             }
36             else
37             {
38                 scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
39                 x1++,x2++,y1++,y2++;
40                 printf("%d\n",q(x2,y2)+q(x1-1,y1-1)-q(x2,y1-1)-q(x1-1,y2));
41             }
42         }
43     }
44     return 0;
45 }
46 /*
47 i -= lowbit(i)   ==      i = i&(i-1)
48 i += lowbit(i)   ==      i = (i|(i-1))+1
49 */

参考文章:http://blog.csdn.net/hit_lingo/article/details/50845718

       http://www.cnblogs.com/yejinru/archive/2012/03/22/2412359.html

posted @ 2016-04-29 11:13  L&King  阅读(238)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3