aNotHeRNo0b
Senior Member
Có vẻ như contest Biweekly tối qua đã bị unrated


gà lày càng kho càng mặnXem tệp đính kèm 3222294
Q2 cứ nghĩ backtracking ko pass, gục ngãchắc phải 2 năm rồi mới có cái rating khủng khiếp thế này đm
Đúng cái contest thứ 100 nữa chứ
![]()


k can DP thim oi:v lại gặp dp digit :> lỏ rồi, bài 3 không độc unique nên handle cả trường hợp không unique luôn @@
, vozer lấy rank hết rồiclass Solution {
public long bowlSubarrays(int[] nums) {
int[] reverse = new int[nums.length];
for (int i = 0; i < nums.length; i += 1) {
reverse[nums.length - 1 - i] = nums[i];
}
return count(nums) + countEqual(reverse);
}
public long countEqual(int[] nums) {
int[] leftBigger = biggerFromLeftEqual(nums);
int[] countSameEqual = counterSameNumber(nums);
long answer = 0;
int n = nums.length;
for (int i = 0; i < n; i += 1) {
int left = leftBigger[i];
int countNumBigger = countSameEqual[left];
if (i - left >= 2) {
answer += countNumBigger;
}
}
return answer;
}
public long count(int[] nums) {
int[] leftBigger = biggerFromLeft(nums);
int[] countSameEqual = counterSameNumber(nums);
long answer = 0;
int n = nums.length;
for (int i = 0; i < n; i += 1) {
int left = leftBigger[i];
int countNumBigger = countSameEqual[left];
if (i - left >= 2) {
answer += countNumBigger;
}
}
System.out.println(answer);
return answer;
}
public int[] counterSameNumber(int[] nums) {
int counter[] = new int[nums.length];
counter[0] = 1;
for (int i = 1; i < nums.length; i += 1) {
if (nums[i] == nums[i - 1]) {
counter[i] = counter[i - 1] + 1;
} else {
counter[i] = 1;
}
}
return counter;
}
public int[] biggerFromLeftEqual(int[] nums) {
int[] biggerFromLeft = new int[nums.length];
Stack<Integer> decreaseOnly = new Stack<>();
for (int i = 0; i < nums.length; i += 1) {
while (!decreaseOnly.isEmpty() && nums[decreaseOnly.peek()] < nums[i]) {
decreaseOnly.pop();
}
if (decreaseOnly.isEmpty()) {
biggerFromLeft[i] = i;
} else {
biggerFromLeft[i] = decreaseOnly.peek();
}
decreaseOnly.add(i);
}
return biggerFromLeft;
}
public int[] biggerFromLeft(int[] nums) {
int[] biggerFromLeft = new int[nums.length];
Stack<Integer> decreaseOnly = new Stack<>();
for (int i = 0; i < nums.length; i += 1) {
while (!decreaseOnly.isEmpty() && nums[decreaseOnly.peek()] <= nums[i]) {
decreaseOnly.pop();
}
if (decreaseOnly.isEmpty()) {
biggerFromLeft[i] = i;
} else {
biggerFromLeft[i] = decreaseOnly.peek();
}
decreaseOnly.add(i);
}
return biggerFromLeft;
}
}
Bài 3 lúc đầu nghĩ hơi phức tạp là tìm next greater element rồi include cả next của next greater element.Bài 3 khoai hơn chứ bài 4 tinh ý xử lý dễ hơn kha khá
Lấy các chuỗi thỏa mãnđộ dài bit nhỏ hơn (ez)
Với các chuỗi bằng độ dài bit, lấy các chuỗi có nửa bit đầu < nửa bit đầu của n
Với chuỗi palindrome có nửa bit đầu = nửa bit đầu của n, check xem có <=n hay k
Ban đầu xử lý ngu đoạn độ dài bit ngang nhau thành cmn căn n
r túm lại là 2q gang phải ko