답안 #333235

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
333235 2020-12-05T04:05:00 Z CodeTiger927 Pairs (IOI07_pairs) C++14
72 / 100
4000 ms 524288 KB
using namespace std;

#include <iostream>

int B,D,N,M;

struct node1d {
    int v;
    node1d *c[2];
    node1d() {
        v = 0;
        c[0] = nullptr;
        c[1] = nullptr;
    } 
    void upd(int l,int r,int x,int v) {
        this -> v += v;
        if(l != r) {
            int m = (l + r) >> 1;
            if(x <= m) {
                if(!c[0]) c[0] = new node1d();
                c[0] -> upd(l,m,x,v);
            }else{
                if(!c[1]) c[1] = new node1d();
                c[1] -> upd(m + 1,r,x,v);
            }
        }
    }
    int qry(int l,int r,int x,int y) {
        if(x <= l && r <= y) return v;
        if(y < l || x > r) return 0;
        int res = 0;
        int m = (l + r) >> 1;
        if(c[0]) res += c[0] -> qry(l,m,x,y);
        if(c[1]) res += c[1] -> qry(m + 1,r,x,y);
        return res;
    }
};

struct node2d {
    int l,r;
    node1d* v;
    node2d *c[2];
    node2d(int l,int r) : l{l}, r{r} {
        if(B == 3) {
        	v = new node1d();
        }else{
      		v = new node1d();
        }
        c[0] = nullptr;
        c[1] = nullptr;
    } 
    void upd(int x,int y,int v) {
        this -> v -> upd(0,2 * M,y,v);
        if(l != r) {
            int m = (l + r) >> 1;
            if(x <= m) {
                if(!c[0]) c[0] = new node2d(l,m);
                c[0] -> upd(x,y,v);
            }else{
                if(!c[1]) c[1] = new node2d(m + 1,r);
                c[1] -> upd(x,y,v);
            }
        }
    }
    int qry(int x1,int x2,int y1,int y2) {
        if(x1 <= l && r <= x2) return v -> qry(0,2 * M,y1,y2);
        if(x2 < l || x1 > r) return 0;
        int res = 0;
        if(c[0]) res += c[0] -> qry(x1,x2,y1,y2);
        if(c[1]) res += c[1] -> qry(x1,x2,y1,y2);
        return res;
    }
};

int main() {
	cin >> B >> N >> D >> M;
	long long ans = 0;
	if(B == 1) {
		node1d* st = new node1d();
		for(int i = 0;i < N;++i) {
			int a;
			cin >> a;
			ans += st -> qry(0,M,max(0,a - D),a + D);
			st -> upd(0,M,a,1);
		}
	}else if(B == 2) {
		node2d* st = new node2d(0,2 * M);
		for(int i = 0;i < N;++i) {
			int c,d;
			cin >> c >> d;
			int a = (c + d);
			int b = (c - d) + M;
			ans += st -> qry(max(0,a - D),a + D,max(0,b - D),b + D);
			st -> upd(a,b,1);
		}
	}else{
		node2d* st[80];
		for(int i = 0;i <= M;++i) {
			st[i] = new node2d(0,160);
		}
		for(int i = 0;i < N;++i) {
			int d,e,f;
			cin >> d >> e >> f;
			int a = (d + e);
			int b = (d - e) + M;
			int c = f;
			// cout << a << " " << b << " " << c << endl;
			for(int j = 0;j <= M;++j) {
				int curD = D - abs(c - j);
				if(curD < 0) continue;
				ans += st[j] -> qry(max(0,a - curD),a + curD,max(0,b - curD),b + curD);
			}
			st[c] -> upd(a,b,1);
		}
		
	}
	cout << ans << endl;
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 364 KB Output is correct
2 Correct 0 ms 364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 876 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 40 ms 364 KB Output is correct
2 Correct 33 ms 364 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 206 ms 33644 KB Output is correct
2 Correct 141 ms 33516 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 205 ms 33388 KB Output is correct
2 Correct 113 ms 6636 KB Output is correct
3 Correct 78 ms 1516 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 9196 KB Output is correct
2 Correct 17 ms 9196 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 180 ms 2668 KB Output is correct
2 Correct 107 ms 2784 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1124 ms 67268 KB Output is correct
2 Correct 885 ms 67180 KB Output is correct
3 Correct 686 ms 34796 KB Output is correct
4 Correct 710 ms 53484 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 2666 ms 524288 KB Execution killed with signal 9 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 2284 KB Output is correct
2 Correct 5 ms 2284 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 123 ms 1132 KB Output is correct
2 Correct 334 ms 1132 KB Output is correct
3 Correct 96 ms 1132 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3399 ms 34072 KB Output is correct
2 Execution timed out 4025 ms 22892 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4075 ms 33132 KB Time limit exceeded
2 Halted 0 ms 0 KB -