【题目链接】:http://www.lydsy.com/JudgeOnline/PRoblem.php?id=1011
【题意】
【题解】 这里的答案误差不超过5%是突破点; 如果是直接暴力写; 复杂度是O(N*a*N) 对于第j个行星; ans[j]+=∑m[i]*m[j]/(j-i)这里的i∈[1..j*a]; 这里如果j比较大的话,j*a也不会很大; 所以可以在这里做文章; 这里把 分母j-i中的j-i换成j-0.5*j*a 也就是说分母在变化的过程中直接取中间值了; 这样 ans[j]+=∑m[i]*m[j]/(j-0.5*j*a); 就可以把∑m[i]分离出来了;完全可以用一个前缀和处理; 这样复杂度就变成O(n)了; 【完整代码】
#include <bits/stdc++.h>using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define LL long long#define rep1(i,a,b) for (int i = a;i <= b;i++)#define rep2(i,a,b) for (int i = a;i >= b;i--)#define mp make_pair#define pb push_back#define fi first#define se second#define rei(x) scanf("%d",&x)#define rel(x) scanf("%lld",&x)typedef pair<int,int> pii;typedef pair<LL,LL> pll;const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};const double pi = acos(-1.0);const int N = 1e5+100;double m[N],a,sum[N],ans[N];int n;int main(){ //freopen("F://rush.txt","r",stdin); rei(n);cin >> a; rep1(i,1,n) { cin >> m[i]; sum[i] = sum[i-1] + m[i]; } rep1(j,1,n) { int i = int(j*a+1e-8); if (j<=500) { rep1(k,1,i) ans[j]+=m[k]*m[j]/(j-k); } else ans[j]+=sum[i]*m[j]/(j-i/2); } rep1(i,1,n) printf("%f/n",ans[i]); return 0;}新闻热点
疑难解答