답안 #681804

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
681804 2023-01-14T12:51:50 Z finn__ Pairs (IOI07_pairs) C++17
30 / 100
142 ms 27296 KB
#include <bits/stdc++.h>
using namespace std;

struct point2d
{
    int x, y;

    bool operator<(point2d const &q) const
    {
        return x < q.x;
    }

    void rotate45()
    {
        x = x - y;
        y = x + y;
    }
};

int d;

bool event2d_compare(pair<point2d, bool> const &a, pair<point2d, bool> const &b)
{
    int xa = a.second ? a.first.x : a.first.x + 2 * d,
        xb = b.second ? b.first.x : b.first.x + 2 * d;
    if (xa == xb)
        return a.second && !b.second;
    return xa < xb;
}

struct FenwickTree
{
    vector<unsigned> t;

    FenwickTree(size_t n)
    {
        t = vector<unsigned>(1 << (32 - __builtin_clz(n)), 0);
    }

    void increment(ptrdiff_t i)
    {
        i++;
        while (i <= t.size())
        {
            t[i - 1]++;
            i += i & -i;
        }
    }

    void decrement(ptrdiff_t i)
    {
        i++;
        while (i <= t.size())
        {
            t[i - 1]--;
            i += i & -i;
        }
    }

    unsigned prefix_sum(ptrdiff_t i)
    {
        i++;
        unsigned x = 0;
        while (i)
        {
            x += t[i - 1];
            i -= i & -i;
        }
        return x;
    }

    unsigned range_sum(ptrdiff_t i, ptrdiff_t j)
    {
        if (j >= t.size())
            j = t.size() - 1;
        if (!i)
            return prefix_sum(j);
        return prefix_sum(j) - prefix_sum(i - 1);
    }
};

struct quaternion
{
    int r, i, j, k;

    quaternion(int x, int y, int z)
    {
        r = x + y + z;
        i = x + y - z;
        j = x - y + z;
        k = x - y - z;
    }
};

bool event3d_cmp(pair<quaternion, bool> const &a, pair<quaternion, bool> const &b)
{
    int xa = a.second ? a.first.r : a.first.r + 2 * d,
        xb = b.second ? b.first.r : b.first.r + 2 * d;
    return xa == xb ? (a.second && !b.second) : xa < xb;
}

struct FenwickTree3d
{
    vector<vector<vector<unsigned>>> t;

    FenwickTree3d(size_t n, size_t m, size_t l)
    {
        t = vector<vector<vector<unsigned>>>(
            1 << (32 - __builtin_clz(n)), vector<vector<unsigned>>(
                                              1 << (32 - __builtin_clz(m)), vector<unsigned>(1 << (32 - __builtin_clz(l)), 0)));
    }

    void increment(ptrdiff_t i, ptrdiff_t j, ptrdiff_t k)
    {
        i++, j++, k++;
        while (i <= t.size())
        {
            ptrdiff_t u = j;
            while (u <= t[i - 1].size())
            {
                ptrdiff_t v = k;
                while (v <= t[i - 1][u - 1].size())
                {
                    t[i - 1][u - 1][v - 1]++;
                    v += v & -v;
                }
                u += u & -u;
            }
            i += i & -i;
        }
    }

    void decrement(ptrdiff_t i, ptrdiff_t j, ptrdiff_t k)
    {
        i++, j++, k++;
        while (i <= t.size())
        {
            ptrdiff_t u = j;
            while (u <= t[i - 1].size())
            {
                ptrdiff_t v = k;
                while (v <= t[i - 1][u - 1].size())
                {
                    t[i - 1][u - 1][v - 1]--;
                    v += v & -v;
                }
                u += u & -u;
            }
            i += i & -i;
        }
    }

    unsigned prefix_sum(ptrdiff_t i, ptrdiff_t j, ptrdiff_t k)
    {
        i++, j++, k++;
        unsigned x = 0;
        while (i)
        {
            ptrdiff_t u = j;
            while (u)
            {
                ptrdiff_t v = k;
                while (v)
                {
                    x += t[i - 1][u - 1][v - 1];
                    v -= v & -v;
                }
                u -= u & -u;
            }
            i -= i & -i;
        }

        return x;
    }

    unsigned range_sum(
        ptrdiff_t i1, ptrdiff_t j1, ptrdiff_t k1,
        ptrdiff_t i2, ptrdiff_t j2, ptrdiff_t k2)
    {
        i2 = min<ptrdiff_t>(i2, t.size() - 1);
        j2 = min<ptrdiff_t>(j2, t[0].size() - 1);
        k2 = min<ptrdiff_t>(k2, t[0][0].size() - 1);

        unsigned x = prefix_sum(i2, j2, k2);
        if (i1)
            x -= prefix_sum(i1 - 1, j2, k2);
        if (j1)
            x -= prefix_sum(i2, j1 - 1, k2);
        if (k1)
            x -= prefix_sum(i2, j2, k1 - 1);
        if (i1 && j1)
            x += prefix_sum(i1 - 1, j1 - 1, k2);
        if (i1 && k1)
            x += prefix_sum(i1 - 1, j2, k1 - 1);
        if (j1 && k1)
            x += prefix_sum(i2, j1 - 1, k1 - 1);
        if (i1 && j1 && k1)
            x -= prefix_sum(i1 - 1, j1 - 1, k1 - 1);
        return x;
    }
};

int main()
{
    int b;
    size_t n, m;
    cin >> b >> n >> d >> m;

    switch (b)
    {
    case 1:
    {
        vector<int> animals(n);
        for (int &x : animals)
            cin >> x;
        sort(animals.begin(), animals.end());
        auto it = animals.begin();
        auto jt = upper_bound(animals.begin(), animals.end(), *it + d);

        size_t total = jt - it - 1;
        while (++it != animals.end())
        {
            while (jt != animals.end() && *it + d >= *jt)
                jt++;
            total += jt - it - 1;
        }

        cout << total << '\n';
        break;
    }
    case 2:
    {
        vector<pair<point2d, bool>> animals;
        int min_y = INT_MAX, max_y = INT_MIN;
        for (size_t i = 0; i < n; i++)
        {
            point2d p;
            cin >> p.x >> p.y;
            p.rotate45();
            animals.push_back({p, 1});
            animals.push_back({p, 0});
            min_y = min(min_y, p.y);
            max_y = max(max_y, p.y);
        }
        for (auto &[p, b] : animals)
            p.y -= min_y;
        max_y -= min_y;
        sort(animals.begin(), animals.end(), event2d_compare);
        size_t total = 0;

        FenwickTree tree(max_y + 1);
        for (auto const &[p, b] : animals)
        {
            if (b)
                tree.increment(p.y);
            else
            {
                tree.decrement(p.y);
                total += tree.range_sum(p.y, p.y + 2 * d);
            }
        }

        cout << total << '\n';
        break;
    }
    case 3:
    {
        vector<pair<quaternion, bool>> animals;
        int min_i = INT_MAX, min_j = INT_MAX, min_k = INT_MAX;
        for (size_t i = 0; i < n; i++)
        {
            int x, y, z;
            cin >> x >> y >> z;
            animals.emplace_back(quaternion(x, y, z), 1);
            animals.emplace_back(quaternion(x, y, z), 0);
            min_i = min(min_i, animals.back().first.i);
            min_j = min(min_j, animals.back().first.j);
            min_k = min(min_k, animals.back().first.k);
        }

        for (auto &[q, b] : animals)
        {
            q.i -= min_i;
            q.j -= min_j;
            q.k -= min_k;
        }

        FenwickTree3d tree(76, 76, 76);
        sort(animals.begin(), animals.end(), event3d_cmp);

        size_t total = 0;

        for (auto const &[q, b] : animals)
        {
            if (b)
            {
                tree.increment(q.i, q.j, q.k);
            }
            else
            {
                tree.decrement(q.i, q.j, q.k);
                total += tree.range_sum(q.i, q.j, q.k, q.i + 2 * d, q.j + 2 * d, q.k + 2 * d);
            }
        }

        cout << total << '\n';
        break;
    }
    }
}

Compilation message

pairs.cpp: In member function 'void FenwickTree::increment(ptrdiff_t)':
pairs.cpp:43:18: warning: comparison of integer expressions of different signedness: 'ptrdiff_t' {aka 'long int'} and 'std::vector<unsigned int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |         while (i <= t.size())
      |                ~~^~~~~~~~~~~
pairs.cpp: In member function 'void FenwickTree::decrement(ptrdiff_t)':
pairs.cpp:53:18: warning: comparison of integer expressions of different signedness: 'ptrdiff_t' {aka 'long int'} and 'std::vector<unsigned int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   53 |         while (i <= t.size())
      |                ~~^~~~~~~~~~~
pairs.cpp: In member function 'unsigned int FenwickTree::range_sum(ptrdiff_t, ptrdiff_t)':
pairs.cpp:74:15: warning: comparison of integer expressions of different signedness: 'ptrdiff_t' {aka 'long int'} and 'std::vector<unsigned int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   74 |         if (j >= t.size())
      |             ~~^~~~~~~~~~~
pairs.cpp: In member function 'void FenwickTree3d::increment(ptrdiff_t, ptrdiff_t, ptrdiff_t)':
pairs.cpp:116:18: warning: comparison of integer expressions of different signedness: 'ptrdiff_t' {aka 'long int'} and 'std::vector<std::vector<std::vector<unsigned int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  116 |         while (i <= t.size())
      |                ~~^~~~~~~~~~~
pairs.cpp:119:22: warning: comparison of integer expressions of different signedness: 'ptrdiff_t' {aka 'long int'} and 'std::vector<std::vector<unsigned int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  119 |             while (u <= t[i - 1].size())
      |                    ~~^~~~~~~~~~~~~~~~~~
pairs.cpp:122:26: warning: comparison of integer expressions of different signedness: 'ptrdiff_t' {aka 'long int'} and 'std::vector<unsigned int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |                 while (v <= t[i - 1][u - 1].size())
      |                        ~~^~~~~~~~~~~~~~~~~~~~~~~~~
pairs.cpp: In member function 'void FenwickTree3d::decrement(ptrdiff_t, ptrdiff_t, ptrdiff_t)':
pairs.cpp:136:18: warning: comparison of integer expressions of different signedness: 'ptrdiff_t' {aka 'long int'} and 'std::vector<std::vector<std::vector<unsigned int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  136 |         while (i <= t.size())
      |                ~~^~~~~~~~~~~
pairs.cpp:139:22: warning: comparison of integer expressions of different signedness: 'ptrdiff_t' {aka 'long int'} and 'std::vector<std::vector<unsigned int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  139 |             while (u <= t[i - 1].size())
      |                    ~~^~~~~~~~~~~~~~~~~~
pairs.cpp:142:26: warning: comparison of integer expressions of different signedness: 'ptrdiff_t' {aka 'long int'} and 'std::vector<unsigned int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  142 |                 while (v <= t[i - 1][u - 1].size())
      |                        ~~^~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 308 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 1068 KB Output is correct
2 Correct 24 ms 1068 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 42 ms 1448 KB Output is correct
2 Correct 49 ms 1436 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 1464 KB Output is correct
2 Correct 46 ms 1484 KB Output is correct
3 Correct 42 ms 1612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 856 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 63 ms 4032 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 76 ms 4260 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 100 ms 4296 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 15 ms 18516 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 142 ms 13672 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 137 ms 27280 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 98 ms 27296 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -