제출 #1337678

#제출 시각아이디문제언어결과실행 시간메모리
1337678khanhphucscratchPairs (IOI07_pairs)C++20
100 / 100
544 ms288168 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
namespace Subtask1
{
    void solve()
    {
        int n, d, m; cin>>n>>d>>m;
        vector<int> a(n);
        for(int i = 0; i < n; i++) cin>>a[i];
        sort(a.begin(), a.end());
        int ans = 0, j = 0;
        for(int i = 0; i < n; i++){
            while(a[i] - a[j] > d) j++;
            ans += i-j;
        }
        cout<<ans;
    }
}
namespace Subtask2
{
    int bit[300005], m, ans = 0;
    vector<int> request[300005], add[300005];
    void update(int p, int v)
    {
        for(int i = p; i <= m; i += i & (-i)) bit[i] += v;
    }
    int query(int p)
    {
        int ans = 0;
        for(int i = p; i > 0; i -= i & (-i)) ans += bit[i];
        return ans;
    }
    void solve()
    {
        int n, d; cin>>n>>d>>m;
        vector<pair<int, int>> a;
        for(int i = 1; i <= n; i++){
            int x, y; cin>>x>>y;
            int nx = x+y, ny = x-y+m;
            x = nx; y = ny;
            a.push_back({x, y});
            add[x].push_back(y);
            request[min(x+d, 2*m)].push_back(min(y+d, 2*m));
            if(x-d-1 > 0) request[x-d-1].push_back(-min(y+d, 2*m));
            if(y-d-1 > 0) request[min(x+d, 2*m)].push_back(-(y-d-1));
            if(x-d-1 > 0 && y-d-1 > 0) request[x-d-1].push_back(y-d-1);
        }
        m <<= 1;
        for(int i = 1; i <= m; i++){
            for(int j : add[i]) update(j, 1);
            for(int j : request[i]){
                if(j > 0) ans += query(j);
                else ans -= query(-j);
            }
        }
        cout<<(ans - n) / 2;
    }
}
namespace Subtask3
{
    const int sd = 80;
    int32_t a[80][80][80], dis[80][80][80][155], cd[80][80][155];
    void preprocess(int m)
    {
        for(int i = 1; i <= m; i++){
            //Preprocess for board i
            for(int j = 1; j <= m; j++){
                for(int k = 1; k <= m; k++) cd[j][k][0] = a[i][j][k];
            }
            /*Up - left*/
            for(int j = 1; j <= m; j++){
                for(int k = 1; k <= m; k++){
                    for(int l = 0; l <= 2*m; l++){
                        if(l > 0){
                            cd[j][k][l] = cd[j][k][0] + cd[j-1][k][l-1] + cd[j][k-1][l-1];
                            if(l > 1) cd[j][k][l] -= cd[j-1][k-1][l-2];
                        }
                        dis[i][j][k][l] += cd[j][k][l];
                    }
                }
            }
            /*Up - right*/
            for(int j = 1; j <= m; j++){
                for(int k = m; k >= 1; k--){
                    for(int l = 0; l <= 2*m; l++){
                        if(l > 0){
                            cd[j][k][l] = cd[j][k][0] + cd[j-1][k][l-1] + cd[j][k+1][l-1];
                            if(l > 1) cd[j][k][l] -= cd[j-1][k+1][l-2];
                        }
                        dis[i][j][k-1][l+1] += cd[j][k][l];
                    }
                }
            }
            /*Down - left*/
            for(int j = m; j >= 1; j--){
                for(int k = 1; k <= m; k++){
                    for(int l = 0; l <= 2*m; l++){
                        if(l > 0){
                            cd[j][k][l] = cd[j][k][0] + cd[j+1][k][l-1] + cd[j][k-1][l-1];
                            if(l > 1) cd[j][k][l] -= cd[j+1][k-1][l-2];
                        }
                        dis[i][j-1][k][l+1] += cd[j][k][l];
                    }
                }
            }
            /*Down - right*/
            for(int j = m; j >= 1; j--){
                for(int k = m; k >= 1; k--){
                    for(int l = 0; l <= 2*m; l++){
                        if(l > 0){
                            cd[j][k][l] = cd[j][k][0] + cd[j+1][k][l-1] + cd[j][k+1][l-1];
                            if(l > 1) cd[j][k][l] -= cd[j+1][k+1][l-2];
                        }
                        dis[i][j-1][k-1][l+2] += cd[j][k][l];
                    }
                }
            }
        }
    }
    void solve()
    {
        int n, d, m; cin>>n>>d>>m;
        vector<vector<int>> p;
        for(int i = 1; i <= n; i++){
            int x, y, z; cin>>x>>y>>z;
            p.push_back({x, y, z});
            a[x][y][z]++;
        }
        preprocess(m);

        /*for(int l = 0; l <= 2*m; l++){
            for(int j = 1; j <= m; j++){
                for(int k = 1; k <= m; k++) cerr<<dis[1][j][k][l]<<" ";
                cerr<<endl;
            }
            cerr<<endl;
        }*/

        int ans = 0;
        for(int i = 0; i < n; i++){
            int x = p[i][0], y  = p[i][1], z = p[i][2];
            for(int j = 1; j <= m; j++) if(abs(x-j) <= d){
                int re = d - abs(x-j); re = min(re, 2*m);
                ans += dis[j][y][z][re];
            }
        }
        cout<<(ans-n)/2;
    }
}
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int b; cin>>b;
    if(b == 1) Subtask1::solve();
    else if(b == 2) Subtask2::solve();
    else Subtask3::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...