树状数组TLE求条
查看原帖
树状数组TLE求条
1017253
xuan_never楼主2024/12/9 18:33

肉眼挑不出跟题解的区别了QAQ

#include <bits/stdc++.h>
namespace blcqj {
using namespace std;
typedef long long ll;
#define lb(x) (x & -x)
int n, m, T;
const ll mod = 1e9 + 7;
int a[1003], b[1003];
ll tr[1003][1003];
void upd(int x, ll v, int k) {
	for (int i = x; i <= n; i += lb(i))
		(tr[k][i] += v) %= mod;
}
int qry(int x, int k) {
	ll an = 0;
	for (int i = x; i; i -= lb(i))
		(an += tr[k][i]) %= mod;
	return an;
}
void main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr), cout.tie(nullptr);
	cin >> T;
	for (int _ = 1; _ <= T; ++_) {
		cin >> n >> m;
		for (int i = 1; i <= n; ++i)
			cin >> a[i], b[i] = a[i];
		sort(b + 1, b + 1 + n);
		int l = unique(b + 1, b + 1 + n) - b - 1;
		for (int i = 1; i <= n; ++i)
			a[i] = lower_bound(b + 1, b + 1 + l, a[i]) - b;
		ll v1, ans = 0;
		for (int i = 1; i <= n; ++i) {
			upd(a[i], 1, 1);
			for (int j = 2; j <= m; ++j) {
				v1 = qry(a[i] - 1, j - 1);
				upd(a[i], v1, j);
				if (j == m) (ans += v1) %= mod;
			}
		}
		for (int i = 1; i <= n; ++i)
			for (int j = 1; j <= m; ++j)
				tr[j][i] = 0;
		if (m == 1) (ans += n) %= mod;
		cout << "Case #" << _ << ": " << ans << '\n';
	}
}
} using namespace blcqj;
int main() {
	blcqj::main();
	return 0;
}
2024/12/9 18:33
加载中...