結果

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

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 WA 0% 17ms 12752KB
2 WA 0% 12ms 12752KB
3 WA 0% 13ms 12752KB
4 WA 0% 28ms 12752KB
5 WA 0% 21ms 12752KB
6 WA 0% 26ms 12752KB
7 WA 0% 4ms 12752KB
8 WA 0% 25ms 12752KB
9 WA 0% 39ms 12752KB
10 WA 0% 27ms 12752KB
11 WA 0% 27ms 12752KB
12 WA 0% 47ms 12752KB
13 WA 0% 15ms 12752KB
14 WA 0% 41ms 12752KB
15 WA 0% 10ms 12752KB
16 WA 0% 5ms 12752KB
17 WA 0% 52ms 12752KB
18 WA 0% 35ms 12752KB
19 WA 0% 19ms 12752KB
20 WA 0% 29ms 12752KB
21 WA 0% 47ms 12752KB
22 WA 0% 46ms 12752KB
23 WA 0% 49ms 12752KB
24 WA 0% 4ms 12752KB
25 WA 0% 43ms 12752KB
26 WA 0% 56ms 12752KB
27 WA 0% 22ms 12752KB
28 WA 0% 53ms 12752KB
29 WA 0% 37ms 12752KB
30 WA 0% 41ms 12752KB

ソースコード

#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) {
		k += sz - 1;
		seg[k] += 1;
		
		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;
	SegmentTree	seg(100010);
	
	i64 ans = 1;
	for(int i = 0; i < n; i++) {
		int a; cin >> a;
		
		seg.add(a);
		ans += seg.get(0, a);
		ans %= i64(1e9 + 7);
	}
	
	cout << ans << endl;
	return 0;
}