社区讨论
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 条回复,欢迎继续交流。
正在加载回复...