好题
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 */