CF1141F2.Same Sum Blocks (Hard)
普及+/提高
通过率:0%
时间限制:3.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
This problem is given in two editions, which differ exclusively in the constraints on the number n.
You are given an array of integers a[1],a[2],…,a[n]. A block is a sequence of contiguous (consecutive) elements a[l],a[l+1],…,a[r] (1≤l≤r≤n). Thus, a block is defined by a pair of indices (l,r).
Find a set of blocks (l1,r1),(l2,r2),…,(lk,rk) such that:
- They do not intersect (i.e. they are disjoint). Formally, for each pair of blocks (li,ri) and (lj,rj) where i=j either ri<lj or rj<li.
- For each block the sum of its elements is the same. Formally, $$a[l_1]+a[l_1+1]+\dots+a[r_1]=a[l_2]+a[l_2+1]+\dots+a[r_2]=$$ $$\dots =$$ $$a[l_k]+a[l_k+1]+\dots+a[r_k].$$
- The number of the blocks in the set is maximum. Formally, there does not exist a set of blocks (l1′,r1′),(l2′,r2′),…,(lk′′,rk′′) satisfying the above two requirements with k′>k.
The picture corresponds to the first example. Blue boxes illustrate blocks.
Write a program to find such a set of blocks.
本题分为两个版本,二者仅在对数字 n 的约束条件上有所不同。
给定一个整数数组 a[1],a[2],…,a[n]。块(block) 是一段连续(相邻)的元素序列 a[l],a[l+1],…,a[r](其中 1≤l≤r≤n)。因此,一个块由一对下标 (l,r) 唯一确定。
请找出一组块 (l1,r1),(l2,r2),…,(lk,rk),满足以下条件:
- 它们互不相交(即彼此不重叠)。形式化地,对任意两个不同的块 (li,ri) 与 (lj,rj)(其中 i=j),均有 ri<lj 或 rj<li。
- 每个块内元素之和均相等。形式化地,
a[l1]+a[l1+1]+⋯+a[r1]=a[l2]+a[l2+1]+⋯+a[r2]=
⋯=
a[lk]+a[lk+1]+⋯+a[rk].
- 该组块的数量 k 达到最大。形式化地,不存在另一组满足上述两个条件的块 (l1′,r1′),(l2′,r2′),…,(lk′′,rk′′),使得 k′>k。
该图对应第一个样例。蓝色方框表示所选的块。
请编写程序求出这样一组块。
输入格式
The first line contains integer n (1≤n≤1500) — the length of the given array. The second line contains the sequence of elements a[1],a[2],…,a[n] (−105≤ai≤105).
第一行包含一个整数 n(1≤n≤1500)—— 给定数组的长度。
第二行包含元素序列 a[1],a[2],…,a[n](−105≤ai≤105)。
输出格式
In the first line print the integer k (1≤k≤n). The following k lines should contain blocks, one per line. In each line print a pair of indices li,ri (1≤li≤ri≤n) — the bounds of the i-th block. You can print blocks in any order. If there are multiple answers, print any of them.
第一行输出整数 k(1≤k≤n)。接下来的 k 行应包含各块,每行一个块。在每一行中输出一对下标 li,ri(1≤li≤ri≤n),表示第 i 个块的左右边界。块的输出顺序可以任意。若存在多个合法答案,输出任意一个即可。
输入输出样例
输入#1
7 4 1 2 2 1 5 3
输出#1
3 7 7 2 3 4 5
输入#2
11 -5 -4 -3 -2 -1 0 1 2 3 4 5
输出#2
2 3 4 1 1
输入#3
4 1 1 1 1
输出#3
4 4 4 1 1 2 2 3 3
输入解题思路,AI测评打分。不知道怎么写?