好题

k=1做法:

直接倒着找,满足贪心性质,预处理出每个平方数就行.....

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<string>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<vector>
 7 #include<map>
 8 #include<set>
 9 #include<cstring>
10 #define MAXN 300001
11 #define int long long
12 #define ps push_back
13 using namespace std;
14 int a[MAXN];
15 int n,K,kuan;
16 bool biao[MAXN];
17 int ans[MAXN];
18 int poww[MAXN];
19 void work1()
20 {
21     int end=n;
22     while(end>0)
23     {
24         //printf("end=%lld\n",end);
25         if(biao[a[end]]==1)
26         {
27             memset(biao,0,sizeof(biao));
28             ans[++ans[0]]=end;
29             for(int i=2;i<=sqrt(kuan)+1;++i)
30             {
31                  if(a[end]>poww[i])continue;
32                  biao[poww[i]-a[end]]=1;
33                  //printf("1::biao[%lld]\n",poww[i]-a[end]);
34             }
35             end--;
36         }
37         else
38         {
39             for(int i=2;i<=sqrt(kuan)+1;++i)
40             {
41                  if(a[end]>poww[i])continue;
42                  biao[poww[i]-a[end]]=1;
43                  //printf("biao[%lld]\n",poww[i]-a[end]);
44             }
45             end--;
46         }
47     }
48     printf("%lld\n",ans[0]+1);
49     if(ans[0]==0)printf("\n");
50     for(int i=ans[0];i>=1;--i)
51     {
52         printf("%lld ",ans[i]);
53     }
54     cout<<endl;
55 }
56 signed main()
57 {
58     //freopen("text.in","r",stdin);
59     //freopen("wa.out","w",stdout);   
60     scanf("%lld%lld",&n,&K);
61     int maxn;
62     for(int i=1;i<=n;++i)
63     {
64         scanf("%lld",&a[i]);
65         maxn=max(maxn,a[i]);
66     }
67     kuan=maxn+maxn;
68     for(int i=2;i<=sqrt(kuan)+1;++i)
69     {
70         poww[i]=i*i;
71     }
72     if(K==1)work1();
73     else printf("1\n\n");
74 } 
75 /*
76 5 1
77 1 3 15 10 6
78 
79 */
k==1做法

相关文章: