WA5求助
查看原帖
WA5求助
1303031
XYJ12321楼主2025/1/23 09:09
//#pragma GCC optimize(2)
#include<bits/stdc++.h>
#define endl "\n"
using namespace std;
const int N=4e5+500;
long long f[N];
int n,a[N];
char *p1,*p2,buf[100000];
#define nc() (p1==p2 && (p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int read(){
    int x=0,f=1;
    char ch=nc();
    while(ch<48||ch>57){
        if(ch=='-')
            f=-1;
        ch=nc();}
    while(ch>=48&&ch<=57)
        x=x*10+ch-48,ch=nc();
   	return x*f;}
template<typename type>
inline void write(type x,bool mode=1)
{
    x<0?x=-x,putchar('-'):0;static short Stack[50],top(0);
    do Stack[++top]=x%10,x/=10; while(x);
    while(top) putchar(Stack[top--]|48);
    mode?putchar('\n'):putchar(' ');
}
inline void CIN(){n=read();
	for(int i=1;i<=n;++i) a[i]=read();
	for(int i=1;i<=n;i++) f[i]=1e18;
}
int xx[N],q[N],cnt,sd[N];
inline void solve(){
	f[1]=0;
	q[++cnt]=1;
	for(int i=2;i<=n;i++){
		while(cnt>0 and a[q[cnt]]>a[i]) cnt--;
		sd[i]=q[cnt];
		q[++cnt]=i;
	}
	int SQ=sqrt(n)+1;
	xx[a[1]]=1; 
	for(int i=2;i<=n;i++){
		for(int o=i-1;o>=1;o--){
			if(i-o>SQ) break; 
			f[i]=min(f[o]+(long long)(min(a[i],a[o])*(long long)(i-o)*(i-o)),f[i]);
		}
		for(int o=1;o<=SQ;o++){
			if(xx[o]){f[i]=min(f[i],f[xx[o]]+(long long)((long long)(i-xx[o])*(i-xx[o])*o));}}
		xx[a[i]]=i;
		for(int o=sd[i];o>=1;o--){
			if(sd[i]-o>SQ) break;
			f[i]=min(f[i],(long long)(f[o]+(long long)(i-o)*(i-o)*(a[o])));
		}
		/*for(int o=i-1;o>=1;o--){
			f[i]=min(f[i],f[o]+(long long)((long long)(i-o)*(i-o)*min(a[i],a[o])));
			if(a[o]<=a[i]){break;}
		}*/
	}
	for(int i=1;i<=n;i++){
		write(f[i],0);	
	}
/*	for(int i=1;i<=n;i++){
		cout<<sd[i]<<' ';
	}*/
}
main(){
cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);
CIN();solve();    
return 0;
}
2025/1/23 09:09
加载中...