답안 #54544

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
54544 2018-07-04T04:17:29 Z 윤교준(#1492) Pairs (IOI07_pairs) C++11
52 / 100
2339 ms 154624 KB
#include <bits/stdc++.h>
#define pb push_back
#define eb emplace_back
#define sz(V) ((int)(V).size())
#define allv(V) ((V).begin()),((V).end())
#define sorv(V) sort(allv(V))
#define revv(V) reverse(allv(V))
#define univ(V) (V).erase(unique(allv(V)))
#define upmax(a,b) (a)=max((a),(b))
#define upmin(a,b) (a)=min((a),(b))
#define INF (0x3f3f3f3f)
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;

namespace TC1 {
	int A[100005];

	ll Ans;
	int N, L, M;

	void init(int _N, int _L, int _M) {
	    N = _N; L = _L; M = _M;
		Ans = 0;
		fill(A, A+100005, 0);
	}
	void run() {
		for(int i = 1; i <= N; i++) cin >> A[i];
		sort(A+1, A+N+1);

		for(int i = 1, j = 1; i <= N; i++) {
			for(; j <= N && A[j] <= A[i]+L; j++);
			Ans += j-i-1;
		}

		cout << Ans << endl;
	}
};

namespace TC2 {
	const static int MX = 131072;
	struct SEGNOD {
		SEGNOD() : l(NULL), r(NULL), dt(0) {}
		SEGNOD *l, *r;
		int dt;

		void upd(int s, int e, int x) {
			dt++; if(s == e) return;
			int m = (s+e)/2;
			if(x <= m) {
				if(NULL == l) l = new SEGNOD();
				l -> upd(s, m, x);
			} else {
				if(NULL == r) r = new SEGNOD();
				r -> upd(m+1, e, x);
			}
		}
		int get(int s, int e, int p, int q) {
			if(q < p || e < p || q < s) return 0;
			if(p <= s && e <= q) return dt;
			int m = (s+e)/2;
			return (NULL == l ? 0 : l -> get(s, m, p, q)) + (NULL == r ? 0 : r -> get(m+1, e, p, q));
		}
	};
	struct SEG {
		SEGNOD nod[MX*2];

		void upd(int x, int y) {
			for(x += MX; x; x /= 2)
				nod[x].upd(1, 75000*2, y);
		}
		int get(int s, int e, int p, int q) {
			int r = 0; for(s += MX, e += MX; s <= e; s /= 2, e /= 2) {
				if(s&1) r += nod[s++].get(1, 75000*2, p, q);
				if(~e&1) r += nod[e--].get(1, 75000*2, p, q);
			} return r;
		}
	};
	SEG segxy, segyx;

	int X[100005], Y[100005];

	ll Ans;
	int N, L, M;

	void init(int _N, int _L, int _M) {
	    N = _N; L = _L; M = _M;
		Ans = 0;
		fill(X, X+100005, 0);
		fill(Y, Y+100005, 0);
	}
	void run() {
		{
			vector<pii> V;
			for(int i = 1, x, y; i <= N; i++) {
				cin >> x >> y;
				V.eb(x, y);
			}
			sorv(V);
			for(int i = 1; i <= N; i++)
				tie(X[i], Y[i]) = V[i-1];
		}
		for(int i = 1, x, y; i <= N; i++) {
			x = X[i]; y = Y[i];
			Ans += segxy.get(1, y, x+y-L, 75000*2);
			Ans += segyx.get(y+1, 75000, 1, y-x+L+75000);

			segxy.upd(y, x+y);
			segyx.upd(y, y-x+75000);
		}

		cout << Ans << endl;
	}
};

int K, N, L, M;

int main() {
    //freopen("input.txt", "r", stdin);
	ios::sync_with_stdio(false);

	cin >> K >> N >> L >> M;

	if(1 == K) {
		TC1 :: init(N, L, M);
		TC1 :: run();
	}
	else if(2 == K) {
        TC2 :: init(N, L, M);
        TC2 :: run();
	}
	else;
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 13048 KB Output is correct
2 Correct 12 ms 13160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 13160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 29 ms 13160 KB Output is correct
2 Correct 26 ms 13160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 33 ms 13160 KB Output is correct
2 Correct 31 ms 13288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 49 ms 13288 KB Output is correct
2 Correct 32 ms 13288 KB Output is correct
3 Correct 31 ms 13288 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 45 ms 29416 KB Output is correct
2 Correct 42 ms 29416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 344 ms 29416 KB Output is correct
2 Correct 293 ms 29416 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1618 ms 113988 KB Output is correct
2 Correct 1979 ms 114036 KB Output is correct
3 Correct 717 ms 114036 KB Output is correct
4 Correct 1166 ms 114036 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 2339 ms 154624 KB Time limit exceeded (wall clock)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 10 ms 154624 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 10 ms 154624 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 10 ms 154624 KB Memory limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 10 ms 154624 KB Memory limit exceeded
2 Halted 0 ms 0 KB -