public long maxBalancedSubsequenceSum(int[] nums) { int n = nums.length; long ans = Long.MIN_VALUE; long[] tmp = new long[n]; for(int i = 0;i < n;++i){ tmp[i] = nums[i] - i; } // 计算值排序 Arrays.sort(tmp); BinIndexTree bit = new BinIndexTree(n); for(int i = 0;i < n;++i){ // 排序+二分对nums[i]-i做离散化处理 int idx = lower_bound(tmp, nums[i]-i) + 1; long dp = bit.query(idx) + nums[i]; bit.update(idx, dp); ans = Math.max(dp, ans); } return ans; }
/** * 二分求离散值的下标 * @param arr * @param target * @return */ public int lower_bound(long[] arr, long target){ int l = 0, r = arr.length; while(l <= r){ int mid = (l+r)>>1; if(arr[mid] >= target) r = mid - 1; else l = mid + 1; } return l; }
/** * 树状数组的模板 */ class BinIndexTree { public int n; public long[] tree;