树状数组套树状数组的问题
  • 板块学术版
  • 楼主封禁用户
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/2/5 11:41
  • 上次更新2023/10/24 01:39:06
查看原帖
树状数组套树状数组的问题
346332
封禁用户楼主2023/2/5 11:41
//这是用来断点调试的
#include<iostream>
#include<unordered_map>
using namespace std;
const int maxn=9;
inline int lowbit(int x){
	return x&-x;
}
struct Int{
	int val[maxn+1];
	void upd(int id,int v){
		val[id]+=v;
	}
	int summ(int id){
		return val[id];
	}
};
template<typename T>
struct Tree{
	T cc=T();
	void upd(int id,int v){
		while(id<=maxn){
//			cout << "id=" << id << ",now cc[id].value=" << cc.summ(id) << ".\n";
			cc.upd(id,v);
//			cout << "now cc[id].value=" <<cc.summ(id) << ".\n";
			id+=lowbit(id);
		}
	}
	int summ(int id){
		int sum=0;
		while(id){
			sum+=cc.summ(id);
			id-=lowbit(id);
		}
		return sum;
	}
};
Tree<Tree<Int>> c; 
Tree<Int> a;            
int main(){
	int m,p;
	cin >> m >> p;
	for(int i=1;i<=m;i++){
		int id,x,y,l;
		cin >> id >> x >> y >> l;
		if(i+l<=m){
			x-=y;
		}
		a.upd(id,x);
		c.upd(id,x);
	}
	for(int i=1;i<=p;i++){
		int x,y;
		cin >> x >> y;
		cout << c.summ(y)-c.summ(x-1) << endl;
	}
	// for(int i=1;i<=3;i++){
	// 	cout << c.cc.cc.summ(i) << ' ';
	// }
	// cout << '\n';
	// for(int i=1;i<=3;i++){
	// 	cout << c.cc.summ(i) << ' ';
	// }
	// cout << '\n';
	// for(int i=1;i<=3;i++){
	// 	cout << c.summ(i) << ' ';
	// }
	// cout << '\n';
	// for(int i=1;i<=3;i++){
	// 	cout << a.summ(i) << ' ';
	// }
	// cout << '\n';
	return 0;
}

(我把maxn改小了,方便调试)对于数据

9 3
1 2 0 0
2 1 0 0
3 2 0 0
1 5 4 2
3 1 0 5
1 9 100 10
2 0 2 1
2 1 0 1
2 2 3 2
1 2
2 3
1 3

出错的原因:程序中a.cc对象和c.cc.cc理应是一样的(都是原始数组),但实际数据却是不一样的(a.cc对象是正确的,c.cc.cc对象在id=3时返回了错误的结果),详情可以见后面注释掉的输出。但是我不知道为什么这里会出错,以及怎么改错。

注:树状数组套树状数组应该是计算前缀和的前缀和用的。

2023/2/5 11:41
加载中...