結果

提出番号 1923
提出者 ecasdqina
言語 C++
提出日時 2018-08-04 14:34:14
問題名 (71)音楽ゲーム
結果 WA
点数 0%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 WA 0% 14ms 8352KB
2 WA 0% 11ms 7808KB
3 WA 0% 11ms 8448KB
4 WA 0% 27ms 9584KB
5 WA 0% 19ms 8528KB
6 WA 0% 27ms 9584KB
7 WA 0% 3ms 8416KB
8 WA 0% 27ms 9584KB
9 WA 0% 40ms 13808KB
10 WA 0% 26ms 9584KB
11 WA 0% 30ms 9584KB
12 WA 0% 50ms 13808KB
13 WA 0% 13ms 8352KB
14 WA 0% 41ms 13808KB
15 WA 0% 8ms 8720KB
16 WA 0% 5ms 8384KB
17 WA 0% 49ms 13808KB
18 WA 0% 39ms 13808KB
19 WA 0% 15ms 8688KB
20 WA 0% 26ms 9584KB
21 WA 0% 53ms 13808KB
22 WA 0% 44ms 13808KB
23 WA 0% 51ms 13808KB
24 WA 0% 3ms 7776KB
25 WA 0% 50ms 13808KB
26 WA 0% 50ms 13808KB
27 WA 0% 19ms 8528KB
28 WA 0% 54ms 13808KB
29 WA 0% 35ms 9584KB
30 WA 0% 41ms 13808KB

ソースコード

#include <bits/stdc++.h>
typedef long long i64;
using std::cout;
using std::endl;
using std::cin;

struct SegmentTree {
	std::vector<i64> seg;
	int sz = 1;
	
	SegmentTree(int n) {
		while(sz < n) sz *= 2;
		seg.assign(sz * 2 - 1, 0);
	}

	void add(int k, int x) {
		k += sz - 1;
		seg[k] += x;
		
		while(k) {
			k = (k - 1) / 2;
			
			seg[k] = seg[2 * k + 1] + seg[2 * k + 2];
		}
	}
	
	i64 get(int a, int b, int k, int l, int r) {
		if(r<=a||b<=l) return 0;
		if(a<=l&&r<=b) return seg[k];
		
		return get(a, b, 2 * k + 1, l, (l + r) / 2) + get(a, b, 2 * k + 2, (l + r) / 2, r);
	}
	
	i64 get(int a, int b) {
		return get(a, b, 0, 0, sz);
	}
};

int main(){
	int n; cin >> n; std::vector<int> a(n);
	for(int i = 0; i < n; i++) cin >> a[i];
	SegmentTree	seg(n); sort(begin(a), end(a));
	
	seg.add(0, 1);
	for(int i = 1; i < n; i++) {
		int k = lower_bound(begin(a), end(a), a[i]) - begin(a);
		
		seg.add(i, seg.get(0, k));
	}
	
	cout << seg.get(0, n) << endl;
	return 0;
}