解法:
cdq套
cdq模板题,没啥好讲的…留着当个板子吧
#include <bits/stdc++.h>
using namespace std;
#define low(x) x & -x
const int maxn = 5e4 + 10;
struct node
{
int x, y, z, opt, k, id;
} a[maxn * 8];
vector<node> jie, cat;
int ans[maxn], c[maxn * 8], N, z[maxn * 8];
bool cmp1(node A, node B)
{
return A.x < B.x || (A.x == B.x && A.k < B.k);
}
bool cmp2(node A, node B)
{
return A.y < B.y || (A.y == B.y && A.k < B.k);
}
void up(int x, int v)
{
for (; x <= N; x += low(x))
c[x] += v;
}
int qu(int x)
{
int res = 0;
for (; x; x -= low(x))
res += c[x];
return res;
}
void cdq2(int l, int r)
{
if (l == r)
return;
int mid = (l + r) / 2;
cdq2(l, mid);
cdq2(mid + 1, r);
jie.clear();
for (int i = l; i <= mid; i++)
if (cat[i].opt == 0)
jie.push_back(cat[i]);
for (int i = mid + 1; i <= r; i++)
if (cat[i].opt != 0)
jie.push_back(cat[i]);
sort(jie.begin(), jie.end(), cmp2);
for (auto nvshen : jie)
if (nvshen.opt == 0)
up(nvshen.z, 1);
else
ans[nvshen.id] += nvshen.opt * qu(nvshen.z);
for (auto nvshen : jie)
if (nvshen.opt == 0)
up(nvshen.z, -1);
}
void cdq(int l, int r)
{
if (l == r)
return;
int mid = (l + r) / 2;
cdq(l, mid);
cdq(mid + 1, r);
cat.clear();
for (int i = l; i <= mid; i++)
if (a[i].opt == 0)
cat.push_back(a[i]);
for (int i = mid + 1; i <= r; i++)
if (a[i].opt != 0)
cat.push_back(a[i]);
sort(cat.begin(), cat.end(), cmp1);
if (cat.size() > 0)
cdq2(0, cat.size() - 1);
}
void solve()
{
int n, opt, cnt = 0, id = 0, x1, y1, z1, x2, y2, z2;
N = 0;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
{
scanf("%d%d%d%d", &opt, &x1, &y1, &z1);
if (opt == 1)
{
a[++cnt] = node{x1, y1, z1, 0, i, 0};
z[++N] = z1;
}
else
{
ans[++id] = 0;
scanf("%d%d%d", &x2, &y2, &z2);
--x1, --y1, --z1;
a[++cnt] = node{x2, y2, z2, 1, i, id};
a[++cnt] = node{x1, y2, z2, -1, i, id};
a[++cnt] = node{x2, y1, z2, -1, i, id};
a[++cnt] = node{x2, y2, z1, -1, i, id};
a[++cnt] = node{x1, y1, z2, 1, i, id};
a[++cnt] = node{x1, y2, z1, 1, i, id};
a[++cnt] = node{x2, y1, z1, 1, i, id};
a[++cnt] = node{x1, y1, z1, -1, i, id};
z[++N] = z1;
z[++N] = z2;
}
}
sort(z + 1, z + 1 + N);
N = unique(z + 1, z + 1 + N) - z - 1;
for (int i = 1; i <= cnt; i++)
{
int tmp = a[i].z;
a[i].z = lower_bound(z + 1, z + 1 + N, a[i].z) - z;
}
cdq(1, cnt);
for (int i = 1; i <= id; i++)
printf("%d\n", ans[i]);
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
solve();
}