Submission #72997

# Submission time Handle Problem Language Result Execution time Memory
72997 2018-08-27T12:52:08 Z sebinkim Pairs (IOI07_pairs) C++14
60 / 100
756 ms 43800 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

ll X[101010], Y[101010], Z[101010], K[101010];
ll D[111][222][222];
ll T[606060];
ll n, d, m;
ll ans;

bool comp_XY(ll ca, ll cb)
{
	if(X[ca] == X[cb]) return Y[ca] < Y[cb];
	else return X[ca] < X[cb];
}

void update(ll* tree, ll p, ll s, ll e, ll v, ll c)
{
	tree[p] += c;
	if(s == e) return;
	if(v <= s+e>>1) update(tree, p<<1, s, (s+e>>1), v, c);
	else update(tree, p<<1|1, (s+e>>1)+1, e, v, c);
}

ll get_sum(ll* tree, ll p, ll s, ll e, ll l, ll r)
{
	if(r < s || e < l) return 0;
	else if(l <= s && e <= r) return tree[p];
	
	return get_sum(tree, p<<1, s, (s+e>>1), l, r) + get_sum(tree, p<<1|1, (s+e>>1)+1, e, l, r);
}

ll square_sum(ll p, ll a, ll b, ll c, ll d)
{
	a = max(1ll, a); b = max(1ll, b);
	c = min(m+m, c); d = min(m+m, d);
	return D[p][c][d] - D[p][a-1][d] - D[p][c][b-1] + D[p][a-1][b-1];
}

void tc1()
{
	ll i, j;
	
	for(i=0;i<n;i++){
		scanf("%lld", X+i);
	}
	
	sort(X, X+n);
	
	for(i=j=0;i<n;i++){
		for(;j<n && X[j] - X[i] <= d;j++);
		ans += j - i - 1;
	}
	
	printf("%lld\n", ans);
}

void tc2()
{
	ll i, j, x, y;
	
	for(i=0;i<n;i++){
		scanf("%lld%lld", &x, &y);
		X[i] = x + y; // 2 ~ 2m
		Y[i] = x - y + m; // 1 ~ 2m-1
		K[i] = i;
	}
	
	sort(K, K+n, comp_XY);
	
	for(i=j=0;i<n;i++){
		for(;j<n && X[K[j]] - X[K[i]] <= d; j++){
			update(T, 1, 1, m+m, Y[K[j]], 1);
		}
		update(T, 1, 1, m+m, Y[K[i]], -1);
		ans += get_sum(T, 1, 1, m+m, Y[K[i]] - d, Y[K[i]] + d);
	}
	
	printf("%lld\n", ans);
}

void tc3()
{
	ll i, j, x, y, z, l;
	
	d = min(m+m, d);
	
	for(i=0;i<n;i++){
		scanf("%lld%lld%lld", &x, &y, &z);
		X[i] = x;
		Y[i] = y + z;
		Z[i] = y - z + m;
		D[X[i]][Y[i]][Z[i]] ++;
	}
	
	for(i=1;i<=m;i++){
		for(j=1;j<=m+m;j++){
			for(l=1;l<=m+m;l++){
				D[i][j][l] += D[i][j-1][l] + D[i][j][l-1] - D[i][j-1][l-1];
			}
		}
	}
	
	for(i=0;i<n;i++){
		ll s = 0;
		for(j=-d;j<=d;j++){
			if(X[i] + j < 1 || X[i] + j > m) continue;
			l = d - (j > 0? j : -j);
			s += square_sum(X[i] + j, Y[i] - l, Z[i] - l, Y[i] + l, Z[i] + l);
		}
		
		ans += s;
	}
	
	ans = (ans - n) / 2;
	
	printf("%lld\n", ans);
}

int main()
{
	ll dim;
	
	scanf("%lld%lld%lld%lld", &dim, &n, &d, &m);
	
	if(dim == 1) tc1();
	else if(dim == 2) tc2();
	else tc3();
	
	return 0;
}

Compilation message

pairs.cpp: In function 'void update(ll*, ll, ll, ll, ll, ll)':
pairs.cpp:23:11: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  if(v <= s+e>>1) update(tree, p<<1, s, (s+e>>1), v, c);
          ~^~
pairs.cpp:23:42: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  if(v <= s+e>>1) update(tree, p<<1, s, (s+e>>1), v, c);
                                         ~^~
pairs.cpp:24:30: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  else update(tree, p<<1|1, (s+e>>1)+1, e, v, c);
                             ~^~
pairs.cpp: In function 'll get_sum(ll*, ll, ll, ll, ll, ll)':
pairs.cpp:32:34: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  return get_sum(tree, p<<1, s, (s+e>>1), l, r) + get_sum(tree, p<<1|1, (s+e>>1)+1, e, l, r);
                                 ~^~
pairs.cpp:32:74: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  return get_sum(tree, p<<1, s, (s+e>>1), l, r) + get_sum(tree, p<<1|1, (s+e>>1)+1, e, l, r);
                                                                         ~^~
pairs.cpp: In function 'void tc1()':
pairs.cpp:47:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld", X+i);
   ~~~~~^~~~~~~~~~~~~
pairs.cpp: In function 'void tc2()':
pairs.cpp:65:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld%lld", &x, &y);
   ~~~~~^~~~~~~~~~~~~~~~~~~~
pairs.cpp: In function 'void tc3()':
pairs.cpp:91:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%lld%lld%lld", &x, &y, &z);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
pairs.cpp: In function 'int main()':
pairs.cpp:126:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%lld%lld%lld%lld", &dim, &n, &d, &m);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 3 ms 248 KB Output is correct
2 Correct 3 ms 488 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 4 ms 488 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 26 ms 1676 KB Output is correct
2 Correct 24 ms 2280 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 38 ms 3040 KB Output is correct
2 Correct 34 ms 4032 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 43 ms 4944 KB Output is correct
2 Correct 33 ms 5696 KB Output is correct
3 Correct 42 ms 6704 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 7 ms 8600 KB Output is correct
2 Correct 7 ms 8612 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 63 ms 8880 KB Output is correct
2 Correct 62 ms 9324 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 95 ms 10152 KB Output is correct
2 Correct 106 ms 10984 KB Output is correct
3 Correct 108 ms 11808 KB Output is correct
4 Correct 109 ms 12444 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 178 ms 17692 KB Output is correct
2 Correct 151 ms 18824 KB Output is correct
3 Correct 116 ms 18948 KB Output is correct
4 Correct 109 ms 19964 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 33 ms 34516 KB Output is correct
2 Incorrect 28 ms 34528 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 38 ms 34528 KB Output is correct
2 Correct 46 ms 34528 KB Output is correct
3 Incorrect 52 ms 34528 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 211 ms 34528 KB Output is correct
2 Correct 524 ms 34528 KB Output is correct
3 Incorrect 152 ms 34528 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Correct 527 ms 42112 KB Output is correct
2 Correct 756 ms 42964 KB Output is correct
3 Incorrect 224 ms 43800 KB Output isn't correct