A. Lesha and array splitting Codeforces Round #390 (Div. 2)

A. Lesha and array splitting
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

One spring day on his way to university Lesha found an array A. Lesha likes to split arrays into several parts. This time Lesha decided to split the array A into several, possibly one, new arrays so that the sum of elements in each of the new arrays is not zero. One more condition is that if we place the new arrays one after another they will form the old array A.

Lesha is tired now so he asked you to split the array. Help Lesha!

Input

The first line contains single integer n (1 ≤ n ≤ 100) — the number of elements in the array A.

The next line contains n integers a1, a2, ..., an ( - 103 ≤ ai ≤ 103) — the elements of the array A.

Output

If it is not possible to split the array A and satisfy all the constraints, print single line containing "NO" (without quotes).

Otherwise in the first line print "YES" (without quotes). In the next line print single integer k — the number of new arrays. In each of the next k lines print two integers li and ri which denote the subarray A[li... ri] of the initial array A being the i-th new array. Integers li, ri should satisfy the following conditions:

  • l1 = 1
  • rk = n
  • ri + 1 = li + 1 for each 1 ≤ i < k.

If there are multiple answers, print any of them.

Examples
Input
3
1 2 -3
Output
YES
2
1 2
3 3
Input
8
9 -12 3 4 -4 -10 7 3
Output
YES
2
1 2
3 8
Input
1
0
Output
NO
Input
4
1 2 3 -5
Output
YES
4
1 1
2 2
3 3

4 4

題意:就是讓這個數列分爲幾個小部分,每一部分相加都不爲0,將每一部分的下標的最左和最右分別輸出。

思路:坑死,我第一開始想着如果不是0的話就讓他自己一部分,爲0的話while循環找到一個不是0的和他一部分,但是還需考慮最後幾個都是0,找不到不是0的數,所以就要考慮多種情況,比較複雜,實現也比較難。

其實我們只需要考慮這個數列相加等於0不?如果不等於0則讓其整個一部分爲一部分,如果等於0的話則讓分爲兩部分,第一個不是0的數之前微一部分,之後又微一部分,全爲0的話輸出NO。

代碼:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#define fd(i,a,b) for(int i=a;i>=b;i--)
#define inf 0x3f3f3f3f
#define ll long long
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int a[1001],b[1001];
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        mem(a,0);
        int flag=0,sum=0;
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            sum+=a[i];
            if(a[i]!=0&&flag==0)
            {
                flag=i;
            }
        }
        if(flag==0)
            printf("NO\n");
        else
        {
            if(sum!=0)
            {
                printf("YES\n1\n1 %d\n",n);
            }
            else
                printf("YES\n2\n1 %d\n%d %d\n",flag,flag+1,n);
        }

    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章