35分求条,玄4关
查看原帖
35分求条,玄4关
632311
huyangmu楼主2024/9/26 16:17

#include <bits/stdc++.h>
#define int long long 
using namespace std;
const int N = 1e5 + 5;
int t, n, a[N], sum[N], dp[N], tree[8 * N], ans = -1, maxn = -1;
void pushup (int x){
	tree[x] = max (tree[(x << 1)], tree[(x << 1) + 1]);
	return ;
}
int query (int l, int r, int x, int y, int cur){
	if (l > y || r < x) return -1e9;
	if (x <= l && r <= y) return tree[cur];
	int mid = l + r >> 1;
	return max (query (l, mid, x, y, (cur << 1)), query (mid + 1, r, x, y, (cur << 1) + 1));
} 
void update (int l, int r, int x, int y, int cur, int val){
	if (l > y || r < x) return ;
	if (x <= l && r <= y){
		tree[cur] = val;
		return ;
	}
	int mid = l + r >> 1;
	update (l, mid, x, y, (cur << 1), val);
	update (mid + 1, r, x, y, (cur << 1) + 1, val);
	pushup(cur);
	return ;
}
signed main (){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> t;
	while (t --){
		ans = maxn = -1;
		cin >> n;
		sum[0] = 0;
		for (int i = 1; i <= n; ++i){
			dp[i] = -300001;
			cin >> a[i];
			maxn = max (maxn, i + a[i]);
			sum[i] = sum[i - 1] + a[i];
		}
		for (int i = 1; i <= 4 * maxn; ++i) tree[i] = -300001;
		if (a[1] == 0){
			cout << 0 << '\n';
			continue;
		}
		dp[1] = 0;
	//	cout << dp[1] + a[1] << ' ';
		update (1, maxn, 1 + a[1], 1 + a[1], 1, dp[1] - sum[1]);
		for (int i = 2; i <= n; ++i){
			dp[i] = query (1, maxn, i, maxn, 1) + sum[i - 1];
			update (1, maxn, i + a[i], i + a[i], 1, dp[i] - sum[i]);
	//		cout << dp[i] + a[i] << ' '; 
		}
	//	cout << '\n';
		for (int i = 1; i <= n; ++i) ans = max (ans, dp[i] + a[i]);
		cout << ans << '\n';
	}
	return 0;
}

第二个样例 dpndp_{n} 的值比正确的少 11,检查了好几遍不知道哪里有问题,

2024/9/26 16:17
加载中...