hdu 5126 stars cdq分治

解法: c d q cdq c d q 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();
}
发布了302 篇原创文章 · 获赞 98 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/ccsu_cat/article/details/102938926