답안 #262618

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
262618 2020-08-13T05:31:53 Z 문홍윤(#5091) Pairs (IOI07_pairs) C++17
100 / 100
397 ms 51468 KB
#include <bits/stdc++.h>
#define eb emplace_back
#define mp make_pair
#define F first
#define S second
#define svec(x) sort(x.begin(), x.end());
using namespace std;
typedef long long LL;
typedef pair<int, int> pii;

int n, d, m;

void solve_1d(){
    vector<int> out, qu;
    for(int i=1; i<=n; i++){
        int p;
        scanf("%d", &p);
        out.eb(min(p+d+1, m+1));
        qu.eb(p);
    }
    svec(qu); svec(out);
    LL num=0, ans=0;
    int pv=0;
    for(auto i:qu){
        for(; pv<out.size(); pv++){
            if(out[pv]>i)break;
            num--;
        }
        ans+=num;
        num++;
    }
    printf("%lld", ans);
}

struct FENWICK{
    LL tree[150010];
    LL sum(int i){
        LL ans=0;
        while(i){
            ans+=tree[i];
            i-=(i&-i);
        }
        return ans;
    }
    void update(int i, LL num){
        while(i<=150000){
            tree[i]+=num;
            i+=(i&-i);
        }
    }
}fen;

void solve_2d(){
    vector<pii> out, qu;
    m*=2;
    for(int i=1; i<=n; i++){
        int p1, p2;
        scanf("%d %d", &p1, &p2);
        out.eb(min(p1+p2+d+1, m+1), p1-p2+m/2);
        qu.eb(p1+p2, p1-p2+m/2);
    }
    svec(qu); svec(out);
    LL ans=0;
    int pv=0;
    for(auto i:qu){
        for(; pv<out.size(); pv++){
            if(out[pv].F>i.F)break;
            fen.update(out[pv].S, -1);
        }
        ans+=fen.sum(min(i.S+d, m))-fen.sum(max(i.S-d-1, 0));
        fen.update(i.S, 1);
    }
    printf("%lld", ans);
}

struct FENWICK_3D{
    LL tree[250][250][250];
    LL sum(int i, int j, int k){
        LL ans=0;
        while(i){
            int tj=j, tk=k;
            while(j){
                int tk2=k;
                while(k){
                    ans+=tree[i][j][k];
                    k-=(k&-k);
                }
                k=tk2;
                j-=(j&-j);
            }
            j=tj, k=tk;
            i-=(i&-i);
        }
        return ans;
    }
    void update(int i, int j, int k, LL num){
        while(i<=225){
            int tj=j, tk=k;
            while(j<=225){
                int tk2=k;
                while(k<=225){
                    tree[i][j][k]+=num;
                    k+=(k&-k);
                }
                k=tk2;
                j+=(j&-j);
            }
            j=tj, k=tk;
            i+=(i&-i);
        }
    }
}fen3d;

void solve_3d(){
    vector<pair<pii, pii> > out, qu;
    m*=3;
    for(int i=1; i<=n; i++){
        int p1, p2, p3;
        scanf("%d %d %d", &p1, &p2, &p3);
        out.eb(mp(min(p1+p2+p3+d+1, m+1), p1+p2-p3+m/3), mp(p1-p2+p3+m/3, p1-p2-p3+m/3*2));
        qu.eb(mp(p1+p2+p3, p1+p2-p3+m/3), mp(p1-p2+p3+m/3, p1-p2-p3+m/3*2));
    }
    svec(qu); svec(out);
    LL ans=0;
    int pv=0;
    for(auto i:qu){
        for(; pv<out.size(); pv++){
            if(out[pv].F.F>i.F.F)break;
            fen3d.update(out[pv].F.S, out[pv].S.F, out[pv].S.S, -1);
        }
        ans+=fen3d.sum(min(i.F.S+d, m), min(i.S.F+d, m), min(i.S.S+d, m));
        ans-=fen3d.sum(max(i.F.S-d-1, 0), min(i.S.F+d, m), min(i.S.S+d, m));
        ans-=fen3d.sum(min(i.F.S+d, m), max(i.S.F-d-1, 0), min(i.S.S+d, m));
        ans-=fen3d.sum(min(i.F.S+d, m), min(i.S.F+d, m), max(i.S.S-d-1, 0));
        ans+=fen3d.sum(max(i.F.S-d-1, 0), max(i.S.F-d-1, 0), min(i.S.S+d, m));
        ans+=fen3d.sum(max(i.F.S-d-1, 0), min(i.S.F+d, m), max(i.S.S-d-1, 0));
        ans+=fen3d.sum(min(i.F.S+d, m), max(i.S.F-d-1, 0), max(i.S.S-d-1, 0));
        ans-=fen3d.sum(max(i.F.S-d-1, 0), max(i.S.F-d-1, 0), max(i.S.S-d-1, 0));
        fen3d.update(i.F.S, i.S.F, i.S.S, 1);
    }
    printf("%lld", ans);
}

int main(){
    int dim;
    scanf("%d", &dim);
    scanf("%d %d %d", &n, &d, &m);
    if(dim==1)solve_1d();
    if(dim==2)solve_2d();
    if(dim==3)solve_3d();
}

/*
3 8 10 20
10 10 10
10 10 20
10 20 10
10 20 20
20 10 10
20 10 20
20 20 10
20 20 20
*/

Compilation message

pairs.cpp: In function 'void solve_1d()':
pairs.cpp:25:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   25 |         for(; pv<out.size(); pv++){
      |               ~~^~~~~~~~~~~
pairs.cpp: In function 'void solve_2d()':
pairs.cpp:66:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |         for(; pv<out.size(); pv++){
      |               ~~^~~~~~~~~~~
pairs.cpp: In function 'void solve_3d()':
pairs.cpp:127:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<std::pair<int, int>, std::pair<int, int> > >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |         for(; pv<out.size(); pv++){
      |               ~~^~~~~~~~~~~
pairs.cpp: In function 'void solve_1d()':
pairs.cpp:17:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   17 |         scanf("%d", &p);
      |         ~~~~~^~~~~~~~~~
pairs.cpp: In function 'void solve_2d()':
pairs.cpp:58:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   58 |         scanf("%d %d", &p1, &p2);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~
pairs.cpp: In function 'void solve_3d()':
pairs.cpp:119:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  119 |         scanf("%d %d %d", &p1, &p2, &p3);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
pairs.cpp: In function 'int main()':
pairs.cpp:146:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  146 |     scanf("%d", &dim);
      |     ~~~~~^~~~~~~~~~~~
pairs.cpp:147:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  147 |     scanf("%d %d %d", &n, &d, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 256 KB Output is correct
2 Correct 0 ms 256 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 384 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 26 ms 1404 KB Output is correct
2 Correct 24 ms 1404 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 37 ms 1536 KB Output is correct
2 Correct 30 ms 1532 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 1524 KB Output is correct
2 Correct 40 ms 1532 KB Output is correct
3 Correct 34 ms 1532 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 1408 KB Output is correct
2 Correct 2 ms 1408 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 53 ms 2292 KB Output is correct
2 Correct 48 ms 2784 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 60 ms 2488 KB Output is correct
2 Correct 56 ms 2916 KB Output is correct
3 Correct 55 ms 2916 KB Output is correct
4 Correct 61 ms 2916 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 60 ms 3416 KB Output is correct
2 Correct 59 ms 4324 KB Output is correct
3 Correct 62 ms 4324 KB Output is correct
4 Correct 56 ms 4324 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 18304 KB Output is correct
2 Correct 10 ms 18304 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 139 ms 5564 KB Output is correct
2 Correct 127 ms 5968 KB Output is correct
3 Correct 98 ms 5968 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 297 ms 35096 KB Output is correct
2 Correct 262 ms 35540 KB Output is correct
3 Correct 123 ms 35540 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 397 ms 50772 KB Output is correct
2 Correct 316 ms 51468 KB Output is correct
3 Correct 148 ms 51412 KB Output is correct