poj 2100 Graveyard Design (two pointers ,尺取法)
不多说,直接代码。
1/*************************************************************************
2 > File Name: code/poj/2100.cpp
3 > Author: 111qqz
4 > Email: rkz2013@126.com
5 > Created Time: 2015年09月25日 星期五 00时42分49秒
6 ************************************************************************/
7
8#include<iostream>
9#include<iomanip>
10#include<cstdio>
11#include<algorithm>
12#include<cmath>
13#include<cstring>
14#include<string>
15#include<map>
16#include<set>
17#include<queue>
18#include<vector>
19#include<stack>
20#include<cctype>
21#define y1 hust111qqz
22#define yn hez111qqz
23#define j1 cute111qqz
24#define ms(a,x) memset(a,x,sizeof(a))
25#define lr dying111qqz
26using namespace std;
27#define For(i, n) for (int i=0;i<int(n);++i)
28typedef long long LL;
29typedef double DB;
30const int inf = 0x3f3f3f3f;
31LL n;
32LL maxn;
33vector<LL>ans;
34
35
36void solve()
37{
38 LL head = 1,tail = 1;
39 LL sum = 0 ;
40
41 while (tail<=maxn)
42 {
43 sum = sum + tail*tail;
44
45 if (sum>=n)
46 {
47 while (sum>n)//主要是while,因为可能要减掉多个才能小于n
48 {
49 sum -= head*head;
50 head++;
51 }
52 if (sum==n)
53 {//因为要先输出答案个数...所以必须存起来延迟输出...
54 ans.push_back(head);
55 ans.push_back(tail);
56 }
57 }
58 tail++;
59 }
60 LL sz = ans.size();
61 printf("%lld\n",sz/2);
62 for (LL i = 0 ; i<ans.size() ; i = i +2)
63 {
64 printf("%lld",ans[i+1]-ans[i]+1);
65 for ( LL j = ans[i] ; j <=ans[i+1] ; j++) printf(" %lld",j);
66 printf("\n");
67 }
68
69}
70int main()
71{
72 #ifndef ONLINE_JUDGE
73 freopen("in.txt","r",stdin);
74 #endif
75 scanf("%lld",&n);
76 maxn = ceil(sqrt(n));
77 solve();
78
79 #ifndef ONLINE_JUDGE
80 fclose(stdin);
81 #endif
82 return 0;
83}