首页 > 试题广场 >

小红的01子序列构造(hard)

[编程题]小红的01子序列构造(hard)
  • 热度指数:1285 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 512M,其他语言1024M
  • 算法知识视频讲解
\hspace{15pt}小红希望你构造一个长度为 n\tt 01 串,满足 m 个性质:对于 i \in [1, m] ,区间 [l_i, r_i] 有恰好 x_i\tt 0y_i\tt 1k_i\tt 01 子序列
\hspace{15pt}给定的限制区间为两两包含关系。即对于 i \neq j ,若 l_i \leq l_j ,则 r_i \geq r_j ,反之亦然。

\hspace{15pt}子序列为从原字符串中删除任意个(可以为零、可以为全部)字符得到的新字符串。

输入描述:
\hspace{15pt}第一行输入两个正整数 n,m \left(1\leq n,m \leq 10^5\right) 代表 \tt 01 串的长度、限制的数量。
\hspace{15pt}接下来的 m 行,每行输入五个非负整数 l_i,r_i,x_i,y_i,k_i \left(1\leq l_i \leq r_i \leq n;\ 0\leq k_i \leq 10^{10};\ 0\leq x_i,y_i \leq r_i-l_i+1;\ x_i+y_i=r_i-l_i+1\right) ,代表构造的 \tt 01 串需满足区间 [l_i,r_i] 有恰好 x_i\tt 0y_i\tt 1k_i\tt 01 子序列。
\hspace{15pt}保证给定的任意两个区间均为互相包含关系。


输出描述:
\hspace{15pt}如果答案不存在,直接输出 -1 ;否则,在一行上输出一个长度为 n\tt 01 串。

\hspace{15pt}如果存在多个解决方案,您可以输出任意一个,系统会自动判定是否正确。注意,自测运行功能可能因此返回错误结果,请自行检查答案正确性。
示例1

输入

4 2
1 4 2 2 4
2 3 1 1 1

输出

0011
示例2

输入

4 2
1 4 2 2 3
2 3 1 1 1

输出

-1
头像 夏日之竹
发表于 2025-03-17 22:38:58
纯纯暴力解不等式,复杂度O(n+m)。只要你找到关系式,肯去算那一坨方程组和不等式组,剩下就都好办了。 """ 核心关系式: 若两个相邻区间:[a,b](有xa个0,ya个1,ka个01子序列), [b+1,c](有xb个0,yb个1,kb个01子序列) 则合成的新区间 展开全文
头像 LBR_
发表于 2025-05-14 14:31:03
写起来很麻烦的一道题。不过思路还算简单。 首先不考虑套娃的情况。len的长度内有a个0和b=len-a个1,最多会产生a*b个01子序列。在范围内可以使用如下的策略进行填充。(对应代码中的fill函数)从左到右,记录当前剩余未填充的1数量cnt1,还需产生的01序列数量k。 如果k>=c 展开全文
头像 年薪百万的王者很活泼
发表于 2025-09-30 21:41:01
审题难度大于具体实现难度的一道题。首先,考虑没有内层约束,就只有x个0、y个1这样的约束的01串,能够取的01子序列个数k。可以发现取值范围即[0, x*y]。然后注意到从里到外第i个区间[l_i, r_i]内字符串的构造只受第i-1个区间[l_{i-1}, r_{i-1}]的影响,则将第i个区间分 展开全文