답안 #54712

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
54712 2018-07-04T18:00:08 Z 0^0(#1466) Sails (IOI07_sails) C++11
100 / 100
96 ms 2752 KB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int tree[100005];
int n;
void update(int idx, int val) {
	while (idx < 100005) {
		tree[idx] += val;
		idx += idx & (-idx);
	}
}
int query(int idx) {
	int ret = 0;
	while (idx) {
		ret += tree[idx];
		idx -= idx & (-idx);
	}
	return ret;
}
int get_idx(ll x) {
	int ret = 0;
	int le, ri, mid;
	le = 1;
	ri = 100000;
	while (le <= ri) {
		mid = (le + ri) / 2;
		if (query(mid) >= x) {
			ret = mid;
			le = mid + 1;
		}
		else ri = mid - 1;
	}
	return ret;
}
pair<int, int> arr[100005];

int main() {
	scanf("%d", &n);
	for (int i = 0; i < n; i++)
		scanf("%d%d", &arr[i].first, &arr[i].second);
	sort(arr, arr + n);
	for (int i = 0; i < n; i++) {
		int h, k;
		tie(h, k) = arr[i];
		int le = h - k + 1;
		if (le == 1 || query(le) != query(le-1)) {
			update(le, 1);
			update(h + 1, -1);
		}
		else {
			int idx = get_idx(query(le));
			if (query(le)) {
				update(idx + 1, 1);
				update(h + 1, -1);
				k -= h - idx;
			}
			idx = get_idx(query(le) + 1);
			update(idx + 1, 1);
			update(idx + k + 1, -1);
		}
	}
	ll ans = 0;
	for (int i = 1; i <= 100000; i++) {
		ll temp = query(i);
		ans += temp * (temp - 1) / 2;
	}
	printf("%lld\n", ans);
	return 0;
}

Compilation message

sails.cpp: In function 'int main()':
sails.cpp:38:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &n);
  ~~~~~^~~~~~~~~~
sails.cpp:40:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &arr[i].first, &arr[i].second);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 376 KB Output is correct
2 Correct 4 ms 488 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 524 KB Output is correct
2 Correct 3 ms 608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 608 KB Output is correct
2 Correct 3 ms 608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 608 KB Output is correct
2 Correct 4 ms 608 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 5 ms 608 KB Output is correct
2 Correct 6 ms 936 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 936 KB Output is correct
2 Correct 27 ms 936 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 23 ms 936 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 45 ms 1080 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 77 ms 1524 KB Output is correct
2 Correct 71 ms 1524 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 82 ms 1600 KB Output is correct
2 Correct 68 ms 1728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 96 ms 1728 KB Output is correct
2 Correct 72 ms 2752 KB Output is correct