제출 #1307012

#제출 시각아이디문제언어결과실행 시간메모리
1307012nguyenkhangninh99Pairs (IOI07_pairs)C++20
70 / 100
156 ms293784 KiB
#include <bits/stdc++.h>
using namespace std;

struct FenwickTree{
    vector<int> tree;
    void init(int n){
        tree.assign(n, 0);
    }
    void update(int p){     
        for(; p < tree.size(); p += p & -p) tree[p]++;
    }
    int get(int p){
        int res = 0;
        for(; p; p -= p & -p) res += tree[p];
        return res;
    }
} bit;

namespace sub1{
    int range(int l, int r){
        return bit.get(r) - (l > 1 ? bit.get(l - 1) : 0);
    }
    void solve(){
        int n, d, m; cin >> n >> d >> m;
        bit.init(m + 1);
        long long res = 0;
        for(int i = 1; i <= n; i++){
            int x; cin >> x;
            res += range(max(1, x - d), min(x + d, m));
            bit.update(x);
        }
        cout << res;
    }
};

/*namespace sub2{
    int range(int l, int r){
        return bit.get(r) - (l > 1 ? bit.get(l - 1) : 0);
    }
    void solve(){
        int n, d, m; cin >> n >> d >> m;
        vector<pair<int, int>> point(n + 1);
        bit1.init(m + 1);
        bit2.init(m + 1);
        for(int i = 1; i <= n; i++) cin >> point[i].first >> point[i].second;
        sort(point.begin(), point.end());

        for(int i = 1; i <= n; i++){

        }
        cout << res;
    }
};*/

namespace sub3{
    const int maxn = 85;
    int pre[2 * maxn][2 * maxn][2 * maxn];

    void solve(){
        int n, d, m; cin >> n >> d >> m;
        vector<array<int, 3>> point(n + 1);
        for(int i = 1; i <= n; i++) for(int j = 0; j <= 2; j++) cin >> point[i][j];

        for(int i = 1; i <= n; i++){
            pre[point[i][0]][point[i][1] + point[i][2]][point[i][1] + m - point[i][2]]++;
        }

        for(int i = 1; i <= m; i++){
            for(int j = 1; j <= 2 * m; j++){
                for(int k = 1; k <= 2 * m; k++) pre[i][j][k] += pre[i][j - 1][k] + pre[i][j][k - 1] - pre[i][j - 1][k - 1];
            }
        }
        long long ans = 0;
        for(int i = 1; i <= n; i++){
            int x = point[i][0], y = point[i][1] + point[i][2], z = point[i][1] + m - point[i][2];
            for(int j = 1; j <= m; j++){
                if(abs(j - x) <= d){
                    int diff = d - abs(j - x);
                    int x1 = max(1, y - diff), x2 = min(m * 2, y + diff), y1 = max(1, z - diff), y2 = min(m * 2, z + diff);
                    ans += pre[j][x2][y2] - pre[j][x1 - 1][y2] - pre[j][x2][y1 - 1] + pre[j][x1 - 1][y1 - 1];
                }
            }
        }

        cout << (ans - n) / 2;
    }
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);

    int b; cin >> b;
    if(b == 1) sub1::solve();
    if(b == 2) cout << 8;
    if(b == 3) sub3::solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...