求调F
  • 板块学术版
  • 楼主封禁用户
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/2/24 21:40
  • 上次更新2024/2/25 09:38:03
查看原帖
求调F
676498
封禁用户楼主2024/2/24 21:40

莫名其妙概率超过 11(

#include<bits/stdc++.h>
using namespace std;
typedef long double ld;
int n,l,d,e;
ld k,t,ans,r,s[400009],a[400009],b[400009];
inline ld gs(int x){ld r=0;while(x) r+=s[x],x^=(x&-x);return r;}
inline void upd(int x,ld k){while(x<=n*2) s[x]+=k,x+=x&-x;}
int main(){
	cin>>n>>l>>d;
	//Dealer:
	upd(1,1);
	for(int i=1;i<l;++i) k=gs(i),upd(i,-k),upd(i+1,k),k/=d,upd(i+1,k),upd(i+d+1,-k);
	for(int i=1;i<=n*2;++i) b[i]=gs(i);
	for(int i=n+1;i<=n*2;++i) t+=b[i];
	for(int i=1;i<=n;++i) a[i]=a[i-1]+b[i]*i;
	for(int i=2;i<=n;++i) b[i]+=b[i-1];
	//You:
	memset(s,0,sizeof(s));
	upd(1,1);
	for(int i=1;i<=n-d;++i) k=gs(i),upd(i,-k),upd(i+1,k),k/=d,upd(i+1,k),upd(i+d+1,-k);
	for(int i=2;i<=n;++i) r+=gs(i)*b[i-1];
	r+=t,ans=r;
	for(int i=n-d+1;i<n;++i) k=gs(i),upd(i,-k),upd(i+1,k),r-=k*b[i-1],k/=d,upd(i+1,k),upd(i+d+1,-k),e=min(i+d,n)-i,r+=k*(b[i+e-1]*e-i*(b[i+e-1]-b[i])+a[i+e-1]-a[i]),ans=max(ans,r);
	cout<<ans;
	return 0;
}
2024/2/24 21:40
加载中...