社区讨论

60pts树状数组TLE求条

P3755[CQOI2017] 老C的任务参与者 7已保存回复 27

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
27 条
当前快照
1 份
快照标识符
@mlj32nt2
此快照首次捕获于
2026/02/12 14:34
7 天前
此快照最后确认于
2026/02/14 21:40
5 天前
查看原帖
树状数组第二维用哈希是因为之前是 TLE & MLE。
CPP
#include<bits/stdc++.h>
#define int long long
#define px(x) xs.push_back(x)
#define py(x) ys.push_back(x)
using namespace std;
	vector<int> xs;
	vector<int> ys;
//Linux 评测机是xxx_unlocked
//Windows 要去掉_unlocked
inline void read(int& x)
{
	x=0;
	char ch=getchar_unlocked();
	bool flag=false;
	while(ch<'0' || ch>'9')
	{
		if(ch=='-') flag=1;
		ch=getchar_unlocked();
	}
	while(ch>='0' && ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar_unlocked();
	}
	if(flag) x=-x;
}
inline void write(int x)
{
	if(x<0)
	{
		putchar_unlocked('-');
		x=-x;
	}
	if(x>9) write(x/10);
	putchar_unlocked(x%10+'0');
}

int gx(int x)
{
	return lower_bound(xs.begin(),xs.end(),x)-xs.begin()+1;
}
int gy(int y)
{
	return lower_bound(ys.begin(),ys.end(),y)-ys.begin()+1;
}
class BIT2D
{
	private:
		int n,m;
		    vector<unordered_map<int, int>> tree;

		int lowbit(int x)
		{
			return x&-x;
		}
	public:
		BIT2D(){}
		BIT2D(int _n,int _m)
		{
			tree.resize(_n+4);
			n=_n,m=_m;
		}

		void add(int x,int y,int k) //增加数
		{
			x=gx(x);y=gy(y);
			for(int i=x;i<=n;i+=lowbit(i))
			{
				for(int j=y;j<=m;j+=lowbit(j))
				{
					tree[i][j]+=k;
				}
			}
		}
		int query(int x,int y) //前缀和
		{
			x=gx(x);y=gy(y);
			int ans=0;
			for(int i=x;i>=1;i-=lowbit(i))
			{
				for(int j=y;j>=1;j-=lowbit(j))
				{
					ans+=tree[i][j];
				}
			}
			return ans;
		}
};
int q[100005][4];
int a[100005][3];

signed main()
{
	int n,m;
	read(n);read(m);

	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<3;j++)
		{
			read(a[i][j]);
		}
		px(a[i][0]);
		py(a[i][1]);
	}
	for(int i=1;i<=m;i++)
	{
		read(q[i][0]);read(q[i][1]);
		read(q[i][2]);read(q[i][3]);
		px(q[i][0]-1);
		py(q[i][1]-1);
		px(q[i][2]);
		py(q[i][3]);
	}
	sort(xs.begin(),xs.end());
	//xs.erase(unique(xs.begin(),xs.end()),xs.end());
	sort(ys.begin(),ys.end());
	//ys.erase(unique(ys.begin(),ys.end()),ys.end());
	BIT2D b(xs.size(),ys.size());
	for(int i=1;i<=n;i++)
	{
		b.add(a[i][0],a[i][1],a[i][2]);
	}
	for(int i=1;i<=m;i++)
	{
		int ans=(b.query(q[i][2],q[i][3])-b.query(q[i][0]-1,q[i][3])-b.query(q[i][2],q[i][1]-1)+b.query(q[i][0]-1,q[i][1]-1));
		write(ans);
		putchar('\n');
	}
	return 0;
}

回复

27 条回复,欢迎继续交流。

正在加载回复...