結果

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

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 WA 0% 28ms 16976KB
2 WA 0% 18ms 15920KB
3 WA 0% 21ms 15920KB
4 WA 0% 44ms 20144KB
5 WA 0% 40ms 18032KB
6 WA 0% 43ms 19088KB
7 WA 0% 5ms 12752KB
8 WA 0% 44ms 20144KB
9 WA 0% 58ms 22256KB
10 WA 0% 40ms 19088KB
11 WA 0% 49ms 20144KB
12 WA 0% 73ms 23312KB
13 WA 0% 28ms 16976KB
14 WA 0% 70ms 22256KB
15 WA 0% 17ms 14864KB
16 WA 0% 8ms 13808KB
17 WA 0% 88ms 24368KB
18 WA 0% 61ms 22256KB
19 WA 0% 29ms 16976KB
20 WA 0% 53ms 20144KB
21 WA 0% 90ms 24368KB
22 WA 0% 74ms 23312KB
23 WA 0% 77ms 23312KB
24 WA 0% 6ms 12752KB
25 WA 0% 82ms 23312KB
26 WA 0% 106ms 24368KB
27 WA 0% 36ms 18032KB
28 WA 0% 84ms 24368KB
29 WA 0% 61ms 21200KB
30 WA 0% 66ms 23312KB

ソースコード

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

i64 mod_pow(long long x, long long n, const int mod) {
	i64 ret = 1;
	
	while(n) {
		if(n & 1) (ret *= x) %= mod;
		
		(x *= x) %= mod;
		n >>= 1;	
	}
		
	return ret;
}


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;
		seg[k] %= (i64)(1e9 + 7);
		
		while(k) {
			k = (k - 1) / 2;
			
			seg[k] = (seg[2 * k + 1] + seg[2 * k + 2]) % (i64)(1e9 + 7);
		}
	}
	
	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)(1e9 + 7);
	}
	
	i64 get(int a, int b) {
		return get(a, b, 0, 0, sz);
	}
};

int main(){
	int n; cin >> n;
	std::map<int, int> mp;
	for(int i = 0; i < n; i++) {
		int a; cin >> a;
		mp[a] += 1;
	}
	
	SegmentTree seg(100010); seg.add(1, 1);
	for(auto p : mp) {
		i64 A = seg.get(1, p.first);
		i64 B = mod_pow(2, p.second - 1, (i64)(1e9 + 7));
		
		seg.add(p.first, A * p.second);
	}	
	
	cout << seg.get(1, 100010) << endl;
	return 0;
}