O(n)的算法为什么会TLE?如果有写错的请大佬指正
查看原帖
O(n)的算法为什么会TLE?如果有写错的请大佬指正
802557
pyiming楼主2024/1/24 20:48
#include<bits/stdc++.h>
#define ll long long
using namespace std;

ll p[1000001],a[1000001];
ll f[1000001];

int main(){
    // freopen("2.in","r",stdin);
    // freopen("2.out","w",stdout);
    int t;
    scanf("%d",&t);
    while(t--){
        ll n;
        scanf("%lld",&n);
        for(ll i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(a[i]==0){
                a[0]=i;
            }
        }
        a[0]--;
        for(ll i=1;i<=n;i++){
            p[i]=a[++a[0]];
            a[0]%=n;
        }
        stack<pair<ll,ll>> s;
        s.push({1,0});
        memset(a,0,sizeof(a));
        // for(int i=2;i<=n;i++){
        //     for(int j=i-1;j>=1;j--){
        //         if(p[j]<p[i]){
        //             a[i]=j;
        //             break;
        //         }
        //     }
        // }
        for(ll i=2;i<=n;i++){
            while(!s.empty()&&s.top().second>p[i]){
                s.pop();
            }
            a[i]=s.top().first;
            s.push({i,p[i]});
        }
        memset(f,0,sizeof(f));
        for(ll i=1;i<=n;i++){
            f[i]=f[a[i]]+p[i]*(i-a[i]);
        }
        ll ans=0;
        for(ll i=1;i<=n;i++){
            // cout<<f[i]<<" ";
            ans=max(ans,f[i]);
        }
        printf("%lld\n",ans+n);
    }
    // cout<<cnt;
	return 0;
}

2024/1/24 20:48
加载中...