QOJ.ac
QOJ
Time Limit:
5 s
Memory Limit:
1024 MB
Total points:
100
# 10183. 멋진 구간
Statistics
The problem was used in the following contest:
The problem is available in the following languages:
C++
给定两个长度为 N 的整数数组 A 和 B,且对于任意 0≤i≤N−1,总有 A[i]≤B[i]。
我们把满足以下条件的区间 [l,r] 定义为好区间:
- l 和 r 是整数。
- 0≤l≤r≤N−1。
- 存在一个长度为 N 的整数数组 C,满足:
- 对于所有 0≤i≤N−1,A[i]≤C[i]≤B[i]。
- 对于所有 0≤s≤e≤N−1,∑ri=lC[i]≥∑ei=sC[i]。也就是说,C[l…r] 是 C 的最大和子数组(即所有子数组中元素和最大的子数组)。
有 Q 个编号从 0 到 Q−1 的提问,用长度为 Q 的数组 L1,R1,L2,R2 表示。第 j (0≤j≤Q−1) 个问题是:满足 L1[j]≤l≤R1[j] 且 L2[j]≤r≤R2[j] 的好区间 [l,r] 有多少个?
实现细节
你需要实现以下函数:
std::vector<long long> maxsum(std::vector<int> A, std::vector<int> B,
std::vector<int> L1, std::vector<int> R1, std::vector<int> L2, std::vector<int> R2)
A, B
:长度为 N 的整数数组。L1, R1, L2, R2
:长度为 Q 的整数数组。- 函数需返回一个长度为 Q 的整数数组 S,其中对于所有 0≤j≤Q−1,S[j] 是第 j 个问题的答案。
- 该函数只会被调用一次。
样例数据
假设 N=3,Q=3,A=[−1,−1,−1],B=[2,−1,2],L1=[0,0,1],R1=[2,0,2],L2=[0,0,0],R2=[2,2,1]。
评测程序调用:
maxsum([-1,-1,-1], [2,-1,2], [0,0,1], [2,0,2], [0,0,0], [2,2,1])
- [0,0] 是精彩区间。例如,取 C=[1,−1,0],C[0…0]=1 是最大和子数组。
- [0,1] 不是精彩区间。因为 C[1]=−1,无论 C[0] 如何取,C[0]>C[0]+C[1],[0,1] 无法成为最大和子数组。
- 通过类似分析,可证明精彩区间只有 [0,0],[0,2],[1,1],[2,2]。
- 回答问题:
- j=0:0≤l≤2,0≤r≤2,有 [0,0],[0,2],[1,1],[2,2],共 4 个。
- j=1:0≤l≤0,0≤r≤2,有 [0,0],[0,2],共 2 个。
- j=2:1≤l≤2,0≤r≤1,有 [1,1],共 1 个。
函数应返回 [4,2,1]。
子任务
对于所有输入数据,满足:
- 1≤N,Q≤250000
- 对于所有 0≤i≤N−1,−109≤A[i]≤B[i]≤109。
- 对于所有 0≤j≤Q−1,0≤L1[j]≤R1[j]≤N−1。
- 对于所有 0≤j≤Q−1,0≤L2[j]≤R2[j]≤N−1。
详细子任务附加限制及分值如下表所示。
子任务 | 分值 | 附加限制 |
---|---|---|
1 | 5 | 1≤N≤500 |
2 | 11 | 1≤N≤5000 |
3 | 45 | Q=1;L1[0]=L2[0]=0;R1[0]=R2[0]=N−1 |
4 | 12 | 对于所有 0≤j≤Q−1,L1[j]=R1[j],L2[j]=R2[j] |
5 | 27 | 无附加限制 |
样例交互库
示例评测程序接收以下格式的输入:
- 第 1 行:N Q
- 第 2+i (0≤i≤N−1) 行:A[i] B[i]
- 第 N+2+j (0≤j≤Q−1) 行:L1[j] R1[j] L2[j] R2[j]
输出格式如下:
- 第 1 行:设
maxsum
返回值为 S,则输出 S[0] S[1] ⋯ S[Q−1]
请注意,示例评测程序可能与实际评测程序有所不同。