警示后人
查看原帖
警示后人
131591
蒟蒻君HJT泽渡透香楼主2021/12/21 06:34

要开ull。。被卡了好久

#include <bits/stdc++.h>
using namespace std;
struct node{
	unsigned long long s,las,nxt,num,loc;
};
unsigned long long n,s[200005];
unsigned long long dp[200005];
node q[200005];
unsigned long long tot=0;
unsigned long long l[10005],r[10005];
unsigned long long now_cnt[10005];
unsigned long long g;
inline unsigned long long y(unsigned long long i){return dp[q[i].loc-1]+q[i].num*q[i].num*g;}
inline unsigned long long x(unsigned long long i){return q[i].num*g;}
int main(){//6 
	scanf("%llu",&n);
	for(unsigned long long i=1;i<=n;i++) {
		scanf("%llu",&s[i]);
		if(l[s[i]]==0){
			++tot;q[tot].las=-1;q[tot].nxt=0;q[tot].loc=0;
			q[tot].s=s[i];q[tot].num=0;l[s[i]]=tot;r[s[i]]=tot;
		}
	}
	for(unsigned long long i=1;i<=n;i++){
		dp[i]=dp[i-1]+s[i];g=s[i];
		if(l[s[i]]<r[s[i]]&&q[l[s[i]]].num==0) l[s[i]]=q[l[s[i]]].nxt;
		while(l[s[i]]<r[s[i]] && 
		(y(r[s[i]])-y(q[r[s[i]]].las))
		<2*(now_cnt[s[i]]+2)*(x(r[s[i]])-x(q[r[s[i]]].las))){
			r[s[i]]=q[r[s[i]]].las;
		}
		if(q[r[s[i]]].loc>0) 
			dp[i]=max(dp[i],dp[q[r[s[i]]].loc-1]+q[r[s[i]]].num*q[r[s[i]]].num*s[i]
			+s[i]*(now_cnt[s[i]]+2)*(now_cnt[s[i]]+2)
			-2*(now_cnt[s[i]]+2)*x(r[s[i]]));
		while(l[s[i]]<r[s[i]] && 
		(y(r[s[i]])-y(q[r[s[i]]].las))*(s[i]*(now_cnt[s[i]]+1)-x(r[s[i]]))
		<(dp[i-1]+(now_cnt[s[i]]+1)*(now_cnt[s[i]]+1)*s[i]
		-y(r[s[i]]))*(x(r[s[i]])-x(q[r[s[i]]].las)) ){
			r[s[i]]=q[r[s[i]]].las;
		}
		now_cnt[s[i]]++;
		++tot;
		q[tot].las=r[s[i]];
		q[r[s[i]]].nxt=tot;
		q[tot].num=now_cnt[s[i]];
		q[tot].loc=i;q[tot].s=s[i];
		q[tot].nxt=0;r[s[i]]=tot;
	}
	printf("%llu\n",dp[n]);
	return 0;
}
2021/12/21 06:34
加载中...