POJ-1195 Mobile phones
题目链接:https://vjudge.net/problem/POJ-1195#author=muchen1026
思路
二维树状数组的模板题
代码
#include <iostream>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <set>
#include <stack>
#include <deque>
#include <queue>
#include <vector>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define ios ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define debug freopen("in.txt","r",stdin),freopen("out.txt","w",stdout);
#define PI acos(-1)
#define fs first
#define sc second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int maxn = 1e6+10;
using namespace std;
int N,S;
int tr[1111][1111];
int lowbit(int x){
return x&-x;
}
void add(int x,int y,int v){
for(int i = x;i<=S;i += lowbit(i)){
for(int j = y;j<=S;j += lowbit(j)){
tr[i][j] += v;
}
}
}
ll pre_sum(int x,int y){
ll sum = 0;
for(int i = x;i>=1;i -= lowbit(i)){
for(int j = y;j>=1;j -= lowbit(j)){
sum += tr[i][j];
}
}
return sum;
}
ll query(int x1,int y1,int x2,int y2){
return pre_sum(x2,y2) - pre_sum(x1-1,y2) - pre_sum(x2,y1-1) + pre_sum(x1-1,y1-1);
}
int main(){
// debug;
ios;
int op,x1,y1,x2,y2,v;
cin>>N;
do{
if(N == 3) break;
if(N == 0) {
memset(tr,0,sizeof tr);
cin>>S;
}else{
if(N == 1) {
cin>>x1>>y1>>v; x1++,y1++;
add(x1,y1,v);
}else{
cin>>x1>>y1>>x2>>y2; x1++,y1++,x2++,y2++;
cout<<query(x1,y1,x2,y2)<<'\n';
}
}
}while(cin>>N);
return 0;
}
京公网安备 11010502036488号