求助二维树状数组板子
  • 板块学术版
  • 楼主Maysoul
  • 当前回复12
  • 已保存回复12
  • 发布时间2023/6/25 17:20
  • 上次更新2023/11/3 12:26:46
查看原帖
求助二维树状数组板子
409774
Maysoul楼主2023/6/25 17:20

原题

样例没问题,但是交上去之后9个超时

求大佬调一下

//2023/6/25
//别着急,先通读一遍题目
//别忘了开long long
//写完先看一遍怎么降复杂度
//要么开全局变量要么给定初值
//想想看,有什么情况需要特判
//看看数组开的够不够大
//std::ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN=5e3+10;
int num,ans;
int ta[MAXN][MAXN];
int n,m;
int lowbit(int x){return x&(-x);}
int read()
{
	int s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-'){w=-1;}ch=getchar();}
	while(ch>='0'&&ch<='9'){s=s*10+ch-'0';ch=getchar();}
	return s*w;
}
void update(int idx,int ydx,int val)
{
	for (;idx<=n;idx+=lowbit(idx)){
		for (int udx=ydx;udx<=m;udx+=lowbit(udx)){
			ta[idx][udx]+=val;			
		}
	}
}
int qzh(int didx,int done)
{
	int sum=0; 
	for (;didx>0;didx-=lowbit(didx)){
		for (int dos=done;dos>0;dos-=lowbit(dos)){
			sum+=ta[didx][dos];			
		} 
	}
	return sum;
}
int qjh(int x1,int y1,int x2,int y2)
{
	return qzh(x2,y2)-qzh(x1-1,x2)-qzh(x2,y1-1)+qzh(x1-1,y1-1);
}
signed main()
{
	n=read();m=read();
	int opt;
	while(cin>>opt){
		if(opt==1){
			int x,y,k;
			x=read();y=read();k=read();
			update(x,y,k);
		}
		else{
			int a,b,c,d;
			a=read();b=read();c=read();d=read();
			cout<<qjh(a,b,c,d)<<'\n';
		}
	}
	return 0;
}

2023/6/25 17:20
加载中...