1 条题解
-
2
发现如果小明数列单调 答案是容易得到的
注意到 有相邻两项符号相同之后 小明数列单调 并且这两项不会太靠后 因为这个东西好像很像更相减损
因此我们暴力算小明数列 直到有相邻两项符号相同即可 这里我用了__int128 但是long long应该也能过
还有一点就是在B[n]较小的时候 最大值或最小值可能在前面
#include<bits/stdc++.h> using namespace std; #define int long long #define big __int128 #define pii pair<int,int> #define F first #define S second #define mkp make_pair const int mod=1e9+7; big inf=1e16,e=1; int n,T,x,y,k,B[101000]; big f[101000]; signed main(){ ios::sync_with_stdio(0); cin.tie(0); // freopen("ex.in","r",stdin); // freopen("my.out","w",stdout); // system("fc my.out ex.out");return 0; cin>>n; inf=inf*inf; for(int i=1;i<=n;i++){ cin>>B[i]; } cin>>T; while(T--){ cin>>x>>y>>k; if(x==0&&y==0){ cout<<B[1]<<" "<<B[1]<<"\n"; continue; } f[0]=x;f[1]=y; int p=1; while(e*f[p]*f[p-1]<(big)0){ p++; f[p]=e*k*f[p-1]+f[p-2]; } big maxx=-inf,minn=inf; int maxi=-1,mini=-1; for(int i=0;i<=p-1;i++){ maxx=max(maxx,f[i]); minn=min(minn,f[i]); } if(f[p]+f[p-1]>0){ while(f[p]<maxx){ p++; f[p]=e*k*f[p-1]+f[p-2]; } maxx=-inf,minn=inf; for(int i=1;i<=n&&B[i]<=p;i++){ if(f[B[i]]>maxx){ maxx=f[B[i]]; maxi=B[i]; }if(f[B[i]]<minn){ minn=f[B[i]]; mini=B[i]; } } if(B[n]>p) maxi=B[n]; if(B[1]>p) mini=B[1]; cout<<maxi<<" "<<mini<<"\n"; }else{ while(f[p]>minn){ p++; f[p]=e*k*f[p-1]+f[p-2]; } maxx=-inf,minn=inf; for(int i=1;i<=n&&B[i]<=p;i++){ if(f[B[i]]>maxx){ maxx=f[B[i]]; maxi=B[i]; }if(f[B[i]]<minn){ minn=f[B[i]]; mini=B[i]; } } if(B[n]>p) mini=B[n]; if(B[1]>p) maxi=B[1]; cout<<maxi<<" "<<mini<<"\n"; } } return 0; }
- 1
信息
- ID
- 700
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- (无)
- 递交数
- 73
- 已通过
- 2
- 上传者