站外题求救
  • 板块学术版
  • 楼主Tommyshizichen
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/8/5 09:47
  • 上次更新2024/8/5 10:41:18
查看原帖
站外题求救
1124466
Tommyshizichen楼主2024/8/5 09:47

就是一道树状数组二维区间修改,单点查询的板子题。

#include<bits/stdc++.h>
using namespace std;
long long tree[5000][5000];
int n,m;
void add(int x, int y, int z){ 
    int memo_y = y;
    while(x <= n){
        y = memo_y;
        while(y <= n)
            tree[x][y] += z, y += y & -y;
        x += x & -x;
    }
}
void range_add(int xa, int ya, int xb, int yb, int z){
    add(xa, ya, z);
    add(xa, yb + 1, -z);
    add(xb + 1, ya, -z);
    add(xb + 1, yb + 1, z);
}
long long ask(int x, int y){
    long long res = 0, memo_y = y;
    while(x){
        y = memo_y;
        while(y)
            res += tree[x][y], y -= y & -y;
        x -= x & -x;
    }
    return res;
}
int main()
{
	int op;
	cin>>n>>m;
	while(cin>>op){
		if(op==1){
			int x,y,a,b,k;
			cin>>x>>y>>a>>b>>k;
			range_add(x,y,a,b,k);
		}
		else if(op==2){
			int x,y;
			cin>>x>>y;
			cout<<ask(x,y)<<'\n';
		} 
	}
}
2024/8/5 09:47
加载中...