답안 #292169

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
292169 2020-09-06T13:18:23 Z Kastanda Pairs (IOI07_pairs) C++11
100 / 100
2644 ms 100052 KB
// M
#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef long long ll;
template < typename T >
using ordered_set = tree < T , null_type , less < T > , rb_tree_tag, tree_order_statistics_node_update >;
const int N = 100005, MX2D = 75005, MX3D = 79;
int n, m, d, Mxd, ts, B[N], F[MX3D][MX3D][MX3D * 3];
vector < int > A[N];
ordered_set < ll > S2D[MX2D];
inline void Add2D(int a, int val)
{
        ll vl = val * (ll)(1e6) + ts; ts ++;
        for (a ++; a < MX2D; a += a & - a)
                S2D[a].insert(vl);
}
inline int Count2D(int a, int val)
{
        int rt = 0;
        ll vl = val * (ll)(1e6) - 1;
        for (; a; a -= a & - a)
                rt += (int)S2D[a].size() - S2D[a].order_of_key(vl);
        return rt;
}
inline void Add3D(int a, int b, int val)
{
        val = MX3D * 3 - val - 3;
        for (; a < MX3D; a += a & - a)
                for (int d = b; d < MX3D; d += d & - d)
                        for (int i = val; i < MX3D * 3; i += i & - i)
                                F[a][d][i] ++;
}
inline int Count3D(int a, int b, int val)
{
        int rt = 0;
        val = MX3D * 3 - val - 3;
        val = min(val, MX3D * 3 - 1);
        for (; a; a -= a & - a)
                for (int d = b; d; d -= d & - d)
                        for (int i = val; i; i -= i & - i)
                                rt += F[a][d][i];
        return rt;
}
int main()
{
        scanf("%d%d%d%d", &d, &n, &Mxd, &m);
        if (d == 1)
        {
                ll tot = 0;
                for (int i = 1; i <= n; i ++)
                        scanf("%d", &B[i]);
                sort(B + 1, B + n + 1);
                for (int i = 1; i <= n; i ++)
                        tot += (int)(upper_bound(B + 1, B + n + 1, B[i] + Mxd) - B) - i - 1;
                return !printf("%lld\n", tot);
        }
        for (int i = 1; i <= n; i ++)
        {
                A[i] = vector < int > (d, 0);
                for (int j = 0; j < d; j ++)
                        scanf("%d", &A[i][j]);
        }
        sort(A + 1, A + n + 1);
        if (d == 2)
        {
                ll tot = 0;
                for (int wy = 0; wy < 2; wy ++)
                {
                        for (int i = 1; i <= n; i ++)
                        {
                                int vl = A[i][0] + A[i][1];
                                tot += Count2D(A[i][1] + wy, vl - Mxd);
                                Add2D(A[i][1], vl);
                        }
                        for (int i = 1; i <= n; i ++)
                                A[i][1] = MX2D - A[i][1] - 1;
                        for (int i = 0; i < MX2D; i ++)
                                S2D[i].clear();
                }
                return !printf("%lld\n", tot);
        }
        ll tot = 0;
        for (int wy = 0; wy < 2; wy ++)
        {
                for (int wz = 0; wz < 2; wz ++)
                {
                        for (int i = 1; i <= n; i ++)
                        {
                                int vl = A[i][0] + A[i][1] + A[i][2];
                                tot += Count3D(A[i][1] - wy, A[i][2] - wz, vl - Mxd);
                                Add3D(A[i][1], A[i][2], vl);
                        }
                        for (int i = 1; i <= n; i ++)
                                A[i][2] = 76 - A[i][2];
                        memset(F, 0, sizeof(F));
                }
                for (int i = 1; i <= n; i ++)
                        A[i][1] = 76 - A[i][1];
        }
        return !printf("%lld\n", tot);
}

Compilation message

pairs.cpp: In function 'int main()':
pairs.cpp:49:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   49 |         scanf("%d%d%d%d", &d, &n, &Mxd, &m);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
pairs.cpp:54:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   54 |                         scanf("%d", &B[i]);
      |                         ~~~~~^~~~~~~~~~~~~
pairs.cpp:64:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   64 |                         scanf("%d", &A[i][j]);
      |                         ~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 9728 KB Output is correct
2 Correct 9 ms 9728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 9 ms 9728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 32 ms 10504 KB Output is correct
2 Correct 31 ms 10488 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 43 ms 11020 KB Output is correct
2 Correct 39 ms 11020 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 41 ms 11008 KB Output is correct
2 Correct 40 ms 11000 KB Output is correct
3 Correct 37 ms 11008 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 10240 KB Output is correct
2 Correct 15 ms 10368 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1326 ms 99996 KB Output is correct
2 Correct 1256 ms 100052 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2263 ms 89348 KB Output is correct
2 Correct 2324 ms 89464 KB Output is correct
3 Correct 1851 ms 90828 KB Output is correct
4 Correct 1941 ms 89620 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2644 ms 69880 KB Output is correct
2 Correct 2460 ms 70008 KB Output is correct
3 Correct 1282 ms 72168 KB Output is correct
4 Correct 1796 ms 77816 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 15488 KB Output is correct
2 Correct 16 ms 15488 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 140 ms 19320 KB Output is correct
2 Correct 151 ms 19192 KB Output is correct
3 Correct 144 ms 19264 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 216 ms 19520 KB Output is correct
2 Correct 209 ms 19448 KB Output is correct
3 Correct 230 ms 19500 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 243 ms 19576 KB Output is correct
2 Correct 241 ms 19448 KB Output is correct
3 Correct 246 ms 19576 KB Output is correct