QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#638896#7036. Can You Solve the Harder Problem?Mu_SilkWA 707ms43160kbC++203.1kb2024-10-13 17:14:532024-10-13 17:14:54

Judging History

This is the latest submission verdict.

  • [2024-10-13 17:14:54]
  • Judged
  • Verdict: WA
  • Time: 707ms
  • Memory: 43160kb
  • [2024-10-13 17:14:53]
  • Submitted

answer

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=2e5+5;

int n,m;
ll a[N],s[N];

vector<int> sa,rk;
vector<vector<int>> minn;

vector<int> h;//h[i]=lcp(sa[i],sa[i-1]);

//s下标从1开始
void init(){
    
    vector<int> cnt(max(n+1,m+1)),oldrk(2*n+1),id(n+1),key(n+1);
    sa.resize(n+1);rk.resize(n+1);
    
    auto cmp=[&](int x,int y,int w){
        return oldrk[x]==oldrk[y]&&oldrk[x+w]==oldrk[y+w];
    };

    for(int i=1;i<=n;i++)++cnt[rk[i]=s[i]];
    for(int i=1;i<=m;i++)cnt[i]+=cnt[i-1];
    for(int i=n;i>=1;i--)sa[cnt[rk[i]]--]=i;

    for(ll w=1;;w<<=1){
        int p=0;
        for(int i=n;i>n-w;i--)id[++p]=i;
        for(int i=1;i<=n;i++)if(sa[i]>w)id[++p]=sa[i]-w;
        fill(cnt.begin(),cnt.end(),0);
        for(int i=1;i<=n;i++)++cnt[key[i]=rk[id[i]]];

        for(int i=1;i<=m;i++)cnt[i]+=cnt[i-1];
        for(int i=n;i>=1;i--)sa[cnt[key[i]]--]=id[i];
        copy(rk.begin()+1,rk.end(),oldrk.begin()+1);
        p=0;
        for(int i=1;i<=n;i++)rk[sa[i]]=cmp(sa[i],sa[i-1],w)?p:++p;
        if(p==n)break;
        m=p;
    }

    for(int i=1,k=0;i<=n;i++){
        if(rk[i]==0)continue;
        if(k)--k;
        while(s[i+k]==s[sa[rk[i]-1]+k])++k;
        h[rk[i]]=k;
    }

    minn.resize(n+1);
    int t=log2(n)+2;
    for(int i=1;i<=n;i++){
        minn[i].resize(t);
        minn[i][0]=h[i];
        // cout<<h[i]<<" ";
    }
    // cout<<"\n";
    for(int i=1;(1<<i)<=n;i++){
        for(int j=1;j+(1<<i)-1<=n;j++){
            minn[j][i]=min(minn[j][i-1],minn[j+(1<<(i-1))][i-1]);
        }
    }
}


array<ll,3> sta[N];
int top;
ll sum[N];
ll ans;



void solve(){
    cin>>n;
    m=0;
    h.resize(n+1);
    for(int i=1;i<=n;i++) h[i]=0;

    vector<int> tmp;

    m=0;
    for(int i=1;i<=n;i++){
        cin>>s[i];
        tmp.push_back(s[i]);
        a[i]=s[i];
    }
    ans=top=0;

    tmp.erase(unique(tmp.begin(),tmp.end()),tmp.end());
    for(int i=1;i<=n;i++){
        s[i]=lower_bound(tmp.begin(),tmp.end(),s[i])-tmp.begin()+1;
    }
    m=tmp.size()+1;

    init();

    for(int i=n;i>=1;i--){
        while(top&&a[i]>sta[top][0]){
            top--;
        }
        int val=n-i+1;
        if(top) val=sta[top][1]-i;
        array<ll,3> arr;
        arr[0]=a[i],arr[1]=i,arr[2]=val;
        sta[++top]=arr;
        sum[top]=sum[top-1]+1ll*a[i]*val;

        int len=h[i];

        int l=1,r=top,mid,pos=-1;
        while(l<=r){
            mid=(l+r)>>1;
            if(sta[mid][1]-i+1>len){
                pos=mid;
                l=mid+1;
            }else r=mid-1;
        }

        if(pos==-1){
            continue;
        }
        // cout<<"# "<<i<<" "<<pos<<" "<<len<<"\n";
        // for(int i=1;i<=top;i++) cout<<"@ "<<i<<" "<<sta[i][0]<<" "<<sta[i][1]<<" "<<sta[i][2]<<"\n";

        ans+=sum[pos];
        ans+=sta[pos+1][2]*1ll*(len-sta[pos+1][1]+1);

        // cout<<ans<<"\n";

    }

    cout<<ans<<"\n";
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    int n=1;
    cin>>n;
    while(n--)solve();
    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 5680kb

input:

2
3
1 2 3
3
2 3 3

output:

14
14

result:

ok 2 lines

Test #2:

score: -100
Wrong Answer
time: 707ms
memory: 43160kb

input:

1000
407
205460 200518 200561 199235 198814 198136 198802 206763 198795 200705 205862 209366 204017 209481 206300 198499 197364 200897 208928 196983 205605 206396 205140 201050 199886 207314 196947 207905 204999 203288 200298 198594 198286 197714 206506 203962 197628 201127 206380 199090 200711 2063...

output:

16364711392
474741104203
1244890320
459126830436
475541032445
297461289710
475090230283
481540176535
471862036704
472705772884
32304113934
220311402163
480226877753
486357903713
474145208983
472908825099
331028061432
476264222516
482090039227
9309423176
481627097418
116584158402
474885975544
4553030...

result:

wrong answer 1st lines differ - expected: '17377263880', found: '16364711392'