답안 #54548

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
54548 2018-07-04T04:52:21 Z 노영훈(#1490) Pairs (IOI07_pairs) C++11
60 / 100
119 ms 3836 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MX=100010, inf=2e9;

int b,n,d,m;

ll ans=0;

void solve1(){
    int A[MX];
    for(int i=1; i<=n; i++) cin>>A[i];
    sort(A+1, A+n+1);
    for(int i=1, r=1; i<=n; i++){
        while(r<n && A[r+1]<=A[i]+d) r++;
        ans+=r-i;
    }
}

struct _SEG {
    int tree[150000*4], n;
    void init(int sz){
        n=sz;
        for(int i=1; i<150000*4; i++) tree[i]=0;
    }
    void upt(int v, int s, int e, int pos, int val){
        if(pos<s || e<pos) return;
        tree[v]+=val;
        if(s==e) return;
        upt(v*2,s,(s+e)/2,pos,val);
        upt(v*2+1,(s+e)/2+1,e,pos,val);
    }
    int sum(int v, int s, int e, int l, int r){
        if(e<l || r<s) return 0;
        if(l<=s && e<=r) return tree[v];
        return sum(v*2,s,(s+e)/2,l,r) + sum(v*2+1,(s+e)/2+1,e,l,r);
    }
    void upt(int pos, int val){
        upt(1,1,n,pos,val);
    }
    int sum(int l, int r){
        l=max(l,1);
        r=min(r,n);
        if(r<l) return 0;
        return sum(1,1,n,l,r);
    }
};

struct pt2 {
    int x, y;
    bool operator < (const pt2 &p) const {
        return x-y<p.x-p.y;
    }
    void scan(){
        cin>>x>>y;
    }
};

void solve2(){
    _SEG Seg; Seg.init(150000);
    pt2 P[MX];
    for(int i=1; i<=n; i++) P[i].scan();
    sort(P+1, P+n+1);
    // for(int i=1; i<=n; i++) cout<<P[i].x<<' '<<P[i].y<<'\n';
    for(int i=1, r=0, l=1; i<=n; i++){
        while(r<n && P[r+1].x-P[r+1].y<=P[i].x-P[i].y+d){
            r++;
            Seg.upt(P[r].x+P[r].y,1);
        }
        while(l<=i){
            Seg.upt(P[l].x+P[l].y,-1);
            l++;
        }
        // cout<<l<<"~"<<r<<'\n';
        ans+=Seg.sum(P[i].x+P[i].y-d, P[i].x+P[i].y+d);
    }
}

void solve3(){

}

int main(){
    ios::sync_with_stdio(0); cin.tie(0);
    cin>>b>>n>>d>>m;
    if(b==1) solve1();
    if(b==2) solve2();
    if(b==3) solve3();
    cout<<ans;
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 376 KB Output is correct
2 Correct 3 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 412 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 872 KB Output is correct
2 Correct 16 ms 948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 964 KB Output is correct
2 Correct 22 ms 964 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 1004 KB Output is correct
2 Correct 22 ms 1004 KB Output is correct
3 Correct 22 ms 1004 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 2924 KB Output is correct
2 Correct 5 ms 2924 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 63 ms 3692 KB Output is correct
2 Correct 61 ms 3760 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 82 ms 3820 KB Output is correct
2 Correct 82 ms 3820 KB Output is correct
3 Correct 74 ms 3820 KB Output is correct
4 Correct 77 ms 3820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 119 ms 3836 KB Output is correct
2 Correct 111 ms 3836 KB Output is correct
3 Correct 80 ms 3836 KB Output is correct
4 Correct 79 ms 3836 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3836 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3836 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3836 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 3836 KB Output isn't correct
2 Halted 0 ms 0 KB -