萌新妹子D可AC的假做法求hack

赛时:队友提了一嘴三分,噼里啪啦敲出代码居然A了,求hack或证明正确性

考虑分治,求出一个区间内选i场比赛的最大值,合并两个区间的时候我们猜测其是一个单峰函数,直接三分,莫名其妙就A了

#include <bits/stdc++.h>
#define rep(a,b,c) for(int a=(b);a<=(c);a++)
#define vi vector<int>
#define pb push_back
#define vld vector<long double>
#define ld long double
using namespace std;

template<class T>inline void read(T &x) {
	T f=1; x=0; char s=getchar();
	while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
	while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
	x*=f;
}

const int N=1e5;
const ld eps=1e-12;

ld pw[N+5],k,k1,r0,p[N+5];

int n,m;

inline vld cdq(int l,int r) {
	if(l==r) {
		vld tmp;
		tmp.pb(0.0);
		tmp.pb(k*p[l]);
		return tmp;
	}
	int mid=((l+r)>>1);
	vld L=cdq(l,mid),R=cdq(mid+1,r);
	vld ans;
	ans.pb(0);
	rep(i,1,r-l+1) {
		int LL=max(0,i-(r-mid)),RR=min(i,mid-l+1),lmid,rmid;
		while((RR-LL)>10) {
			lmid=LL+((RR-LL+1)/3);
			rmid=RR-((RR-LL+1)/3);
			ld lv=R[i-lmid]+L[lmid]*pw[i-lmid];
			ld rv=R[i-rmid]+L[rmid]*pw[i-rmid];
			if((lv-rv)<eps) LL=lmid;
			else RR=rmid;
		}
		ld Max=0.0;
		rep(j,LL,RR) {
			ld V=R[i-j]+L[j]*pw[i-j];
			if((V-Max)>eps) Max=V;
		}
		ans.pb(Max);
	}
	return ans;
}

inline void solve() {
	read(n); read(m); scanf("%Lf %Lf",&k,&r0);
	k1=(1.0-k);
	rep(i,1,n) scanf("%Lf",&p[i]);
	pw[0]=1.0;
	rep(i,1,n) pw[i]=pw[i-1]*k1;
	rep(i,1,n-m) r0*=k1;
	vld ans=cdq(1,n);
	ld Ans=0.0;
	rep(i,n-m,n) {
		ld nans=ans[i]+r0;
		if((nans-Ans)>eps) Ans=nans;
		r0*=k1;
	}
	printf("%.12Lf\n",Ans);
}

int main() {
	int T; read(T); while(T--)
	solve();
}

全部评论
太强了
点赞 回复 分享
发布于 2024-08-15 20:48 四川
正确
点赞 回复 分享
发布于 2024-08-15 20:41 山东

相关推荐

nus2201602...:兄弟,你这个简历撕了丢了吧,就是一坨,去找几个项目,理解项目流程,看几遍就是你的了,看看八股就去干了,多看看牛客里别人发出来的简历,对着写,你这写的啥啊,纯一坨
点赞 评论 收藏
分享
07-03 11:02
中山大学 C++
字节刚oc,但距离九月秋招很近了有两段互联网实习,非腾讯字节。不敢赌转正,现在在纠结去还是不去如果实习俩月离职会有什么后果吗
阿城我会做到的:不去后悔一辈子,能否转正取决于ld的态度,只要他不卡,答辩就是走流程,个人觉得可以冲一把
投递字节跳动等公司9个岗位
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务