首页 > 小红的01子序列构造(easy)
头像 Gooby114514
发表于 2024-12-24 14:16:34
D 小红的01子序列构造(easy) 两种写法,这里都介绍一下: 方法1:双指针 先考虑一个区间内的 子序列如何统计,我们只需要对于每个 ,看它之前有几个 ,就是它的贡献。 例如对于序列 , 都是 ,他们的贡献依次为 ,所以最后的 子序列数为 。 用双指针枚举区间的左右端点,假设当前区间 展开全文
头像 Gnomeshgh112
发表于 2025-03-26 13:44:33
假设最后的结果左边界为i,右边界为j,那么当左边界为i,右边界在j右边时,计算出的结果一定大于等于k,同样的,如果右边界在j左边,结果一定小于等于k。同理,固定j变化i可以得到相似的结论。所以,使用i和j两个位置,先将j一直向右移动,一旦i j超过了k,那么就将i向右移动。直到满足等于k为止,这样就 展开全文
头像 牛客856751393号
发表于 2025-03-07 14:56:24
while True: try: n, k = map(int, input().split()) s = input() cnt0 = cnt1 = 0 # 分别存储当前区间0和1的个数 l = r = 0 展开全文
头像 佛系的青年
发表于 2025-03-17 17:57:25
解法参考评论区大佬,虽然用例全能pass,但有个小疑问,l++使num减少,r++使num增大,这样一来一回的过程会不会让num错过k值? #include <iostream> #include <cmath> using namespace std; typedef lo 展开全文
头像 TQ988
发表于 2025-07-08 16:47:30
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int 展开全文
头像 RogeAustine
发表于 2025-12-29 09:27:19
我们将使用滑动窗口来解决这个问题使用L,R两个变量来维护这个滑动窗口,使用cnt1与cnt0来记录窗口内部的0的个数以及1的个数由于区间左侧的1以及区间右侧的0都不会发挥作用,因此就根据是否有效来使用while循环选择性将他们移除 #include <bits/stdc++.h> us 展开全文
头像 Jakeap
发表于 2025-12-29 20:28:31
双指针类型题目:共同特征,在一端区间内满足条件。这题要求在一段区间内满足k个01子序列,那么直接左右指针先指向起点都是s[0]位置。r指针负责往后扩大范围,再者我们分析何时达到k个01子序列,首先0肯定要在1前面才能满足01的要求,前面有多少个0那么在0之后的1都能和其组合,这样我们就要实时记录0和 展开全文
头像 冯飞宇
发表于 2025-08-31 19:27:07
#include <iostream> using namespace std; void answer(string str, long long int k) { int len = str.length(); int left = 0, right = 0; 展开全文
头像 牛客754921490号
发表于 2025-12-19 11:09:20
#include <iostream> using namespace std; //每个1前面有几个0就能得到几个01子串 //i+1时如果data[i]为0则要减去后续1数量的子串,为1则不用处理 // k超过了int32的范围,使用cin读取的话,溢出会导致后续字符串读入失败 v 展开全文
头像 垚offer多多
发表于 2025-05-23 12:05:36
import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner sc = 展开全文