程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> POJ 1195 Mobile phones 二維樹狀數組

POJ 1195 Mobile phones 二維樹狀數組

編輯:C++入門知識

題意:有一個N * N廣場,廣場裡面有一些手機,某個格子是可以改變的,增加或者減少,問一個小矩陣內有多少個手機。
思路 :裸的二維樹狀數組。
代碼:
[cpp]
#include <iostream> 
#include <cstdio> 
#include <string.h> 
using namespace std; 
 
typedef long long LL; 
const int N = 1030; 
int num[N][N]; 
int lowbit(int x){ 
    return x & (-x); 

void update(int x,int y,int add){ 
    int t = y; 
    while(x < N){ 
       y = t; 
       while(y < N){ 
         num[x][y] += add; 
         if(num[x][y] < 0) 
             num[x][y] = 0; 
         y += lowbit(y); 
       } 
       x += lowbit(x); 
    } 

LL sum(int x,int y){ 
    int t = y; 
    LL s = 0; 
    while(x > 0){ 
       y = t; 
       while(y > 0){ 
         s += num[x][y]; 
         y -= lowbit(y); 
       } 
       x -= lowbit(x); 
    } 
    return s; 

int main(){ 
    //freopen("1.txt","r",stdin); 
    int id,n; 
    while(scanf("%d%d",&id,&n) != EOF){ 
        memset(num,0,sizeof(num)); 
        int x1,y1,x2,y2,value; 
        while(1){ 
          scanf("%d",&id); 
          if(id == 3) 
              break; 
          else if(id == 1){ 
             scanf("%d%d%d",&x1,&y1,&value); 
             update(x1+1,y1+1,value); 
          } 
          else if(id == 2){ 
            scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 
            printf("%lld\n",sum(x2+1,y2+1) - sum(x1,y2+1) - sum(x2+1,y1) + sum(x1,y1)); 
          } 
        } 
    } 
    return 0; 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved