其他分享
首页 > 其他分享> > POJ2100——尺取

POJ2100——尺取

作者:互联网

Graveyard Design

 

题目链接:http://poj.org/problem?id=2100

 

题目大意:给定一个数,求出所有连续区间的平方和等于该数。

 

解题思路:尺取法,当区间小于给定数,区间r++,区间和+=r*r;当区间大于给定数,区间和-=l*l,区间l++。

 

代码如下:

 

#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;

struct node
{
    long long l,r;
}a[5000];

int main()
{
    long long n;
    scanf("%lld",&n);
    long long s=0,m=sqrt(1.0*n),l=1,r=0;
    long long cnt=0;
    while(r<=m)
    {
        while(s<n)
        {
            r++;
            s+=r*r;
        }
        if(r>m) break;
        if(s==n)
        {
            a[++cnt].l=l;
            a[cnt].r=r;
        }
        s-=l*l;
        l++;
    }
    printf("%lld\n",cnt);
    for(int i=1;i<=cnt;i++)
    {
        printf("%lld",a[i].r-a[i].l+1);
        for(int j=a[i].l;j<=a[i].r;j++)
        {
            printf("% lld",j);
        }
        printf("\n");
    }
    return 0;
}

标签:cnt,++,long,int,POJ2100,区间,尺取,include
来源: https://www.cnblogs.com/noback-go/p/11715698.html