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 nn.

You are given an array of integers a[1],a[2],…,a[n].a[1], a[2], \dots, a[n]. A block is a sequence of contiguous (consecutive) elements a[l],a[l+1],…,a[r]a[l], a[l+1], \dots, a[r] (1≤l≤r≤n1 \le l \le r \le n). Thus, a block is defined by a pair of indices (l,r)(l, r).

Find a set of blocks (l1,r1),(l2,r2),…,(lk,rk)(l_1, r_1), (l_2, r_2), \dots, (l_k, r_k) such that:

  • They do not intersect (i.e. they are disjoint). Formally, for each pair of blocks (li,ri)(l_i, r_i) and (lj,rj(l_j, r_j) where i≠ji \neq j either ri<ljr_i \lt l_j or rj<lir_j \lt l_i.
  • 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′′)(l_1', r_1'), (l_2', r_2'), \dots, (l_{k'}', r_{k'}') satisfying the above two requirements with k′>kk' \gt k.

The picture corresponds to the first example. Blue boxes illustrate blocks.

Write a program to find such a set of blocks.

本题分为两个版本,二者仅在对数字 nn 的约束条件上有所不同。

给定一个整数数组 a[1],a[2],…,a[n]a[1], a[2], \dots, a[n]。块(block) 是一段连续(相邻)的元素序列 a[l],a[l+1],…,a[r]a[l], a[l+1], \dots, a[r](其中 1≤l≤r≤n1 \le l \le r \le n)。因此,一个块由一对下标 (l,r)(l, r) 唯一确定。

请找出一组块 (l1,r1),(l2,r2),…,(lk,rk)(l_1, r_1), (l_2, r_2), \dots, (l_k, r_k),满足以下条件:

  • 它们互不相交(即彼此不重叠)。形式化地,对任意两个不同的块 (li,ri)(l_i, r_i) 与 (lj,rj)(l_j, r_j)(其中 i≠ji \neq j),均有 ri<ljr_i \lt l_j 或 rj<lir_j \lt l_i。
  • 每个块内元素之和均相等。形式化地,

    a[l1]+a[l1+1]+⋯+a[r1]=a[l2]+a[l2+1]+⋯+a[r2]=a[l_1]+a[l_1+1]+\dots+a[r_1]=a[l_2]+a[l_2+1]+\dots+a[r_2]=

    ⋯=\dots =

    a[lk]+a[lk+1]+⋯+a[rk].a[l_k]+a[l_k+1]+\dots+a[r_k].

  • 该组块的数量 kk 达到最大。形式化地,不存在另一组满足上述两个条件的块 (l1′,r1′),(l2′,r2′),…,(lk′′,rk′′)(l_1', r_1'), (l_2', r_2'), \dots, (l_{k'}', r_{k'}'),使得 k′>kk' \gt k。

该图对应第一个样例。蓝色方框表示所选的块。

请编写程序求出这样一组块。

输入格式

The first line contains integer nn (1≤n≤15001 \le n \le 1500) — the length of the given array. The second line contains the sequence of elements a[1],a[2],…,a[n]a[1], a[2], \dots, a[n] (−105≤ai≤105-10^5 \le a_i \le 10^5).

第一行包含一个整数 nn(1≤n≤15001 \le n \le 1500)—— 给定数组的长度。
第二行包含元素序列 a[1],a[2],…,a[n]a[1], a[2], \dots, a[n](−105≤ai≤105-10^5 \le a_i \le 10^5)。

输出格式

In the first line print the integer kk (1≤k≤n1 \le k \le n). The following kk lines should contain blocks, one per line. In each line print a pair of indices li,ril_i, r_i (1≤li≤ri≤n1 \le l_i \le r_i \le n) — the bounds of the ii-th block. You can print blocks in any order. If there are multiple answers, print any of them.

第一行输出整数 kk(1≤k≤n1 \le k \le n)。接下来的 kk 行应包含各块,每行一个块。在每一行中输出一对下标 li,ril_i, r_i(1≤li≤ri≤n1 \le l_i \le r_i \le n),表示第 ii 个块的左右边界。块的输出顺序可以任意。若存在多个合法答案,输出任意一个即可。

输入输出样例

  • 输入#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测评打分。不知道怎么写?

首页