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 ",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(" "); } return 0; }